diff --git a/src/lineage-json/quest-event-route/childhoodEvents.json b/src/lineage-json/quest-event-route/childhoodEvents.json new file mode 100644 index 0000000..9a8ec46 --- /dev/null +++ b/src/lineage-json/quest-event-route/childhoodEvents.json @@ -0,0 +1,525 @@ +{ + "childhood_events": [ + { + "id": "school_presentation", + "ageRange": { "min": 6, "max": 12 }, + "category": "school", + "icon": "๐Ÿ“š", + "title": "A Big Day at School", + "description": "It's your turn to give a presentation at school. All the other kids are watching.", + "weight": 1.0, + "cooldownTicks": 12, + "outcomes": [ + { + "label": "Speak with confidence", + "description": "Stand tall and give an excellent presentation.", + "effects": [ + { "kind": "sanity", "amount": 10 }, + { "kind": "experience", "amount": 5 }, + { "kind": "notification", "message": "The teacher praises your bravery!" } + ] + }, + { + "label": "Mumble through it nervously", + "effects": [ + { "kind": "sanity", "amount": -2 }, + { "kind": "experience", "amount": 2 }, + { "kind": "notification", "message": "It's over... You can breathe again." } + ] + } + ] + }, + { + "id": "playground_friends", + "ageRange": { "min": 5, "max": 12 }, + "category": "friendship", + "icon": "๐Ÿ‘ซ", + "title": "Making New Friends", + "description": "Some kids at the playground wave you over to join their game.", + "weight": 1.2, + "cooldownTicks": 10, + "outcomes": [ + { + "label": "Join them eagerly", + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "You make friends and have a wonderful time!" } + ] + }, + { + "label": "Watch from afar", + "effects": [ + { "kind": "sanity", "amount": 3 }, + { "kind": "notification", "message": "You enjoy the game from the sidelines." } + ] + } + ] + }, + { + "id": "family_picnic", + "ageRange": { "min": 4, "max": 14 }, + "category": "family", + "icon": "๐Ÿงบ", + "title": "A Family Picnic", + "description": "Your family has organized a picnic at the park. Everyone brings their favorite foods.", + "weight": 0.9, + "cooldownTicks": 16, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "A perfect day with family, laughing and eating by the river." } + ] + } + }, + { + "id": "lost_toy", + "ageRange": { "min": 4, "max": 10 }, + "category": "mishap", + "icon": "๐Ÿงธ", + "title": "Oh No, Lost My Toy!", + "description": "You can't find your favorite stuffed animal anywhere.", + "weight": 0.7, + "cooldownTicks": 20, + "outcomes": [ + { + "label": "Search everywhere", + "effects": [ + { "kind": "sanity", "amount": 5 }, + { "kind": "notification", "message": "Found it behind the bed! You're so relieved." } + ] + }, + { + "label": "Ask family for help", + "effects": [ + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "Mom finds it in the closet. What a relief!" } + ] + } + ] + }, + { + "id": "birthday_party", + "ageRange": { "min": 5, "max": 15 }, + "category": "milestone", + "icon": "๐ŸŽ‚", + "title": "Your Birthday!", + "description": "Today is your special day! There's cake, presents, and all your friends.", + "weight": 1.5, + "cooldownTicks": 52, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 25 }, + { "kind": "health", "amount": 10 }, + { "kind": "gold", "amount": 15 }, + { "kind": "notification", "message": "The best day of the year! Cake, presents, and all your friends cheering!" } + ] + } + }, + { + "id": "reading_first_book", + "ageRange": { "min": 6, "max": 9 }, + "category": "achievement", + "icon": "๐Ÿ“–", + "title": "Reading Your First Book!", + "description": "You've learned to read! You can finally read your first book by yourself.", + "weight": 1.0, + "cooldownTicks": 30, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "experience", "amount": 10 }, + { "kind": "notification", "message": "The world of stories is now yours!" } + ] + } + }, + { + "id": "garden_discovery", + "ageRange": { "min": 4, "max": 12 }, + "category": "exploration", + "icon": "๐ŸŒป", + "title": "A Secret Garden", + "description": "You find a hidden garden behind the old barn. Butterflies flutter everywhere.", + "weight": 0.8, + "cooldownTicks": 14, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "Your own secret world, filled with flowers and butterflies." } + ] + } + }, + { + "id": "learning_riding", + "ageRange": { "min": 8, "max": 14 }, + "category": "skill", + "icon": "๐Ÿด", + "title": "Learning to Ride", + "description": "Your parents sign you up for riding lessons. The horse is bigger than you thought!", + "weight": 0.9, + "cooldownTicks": 18, + "outcomes": [ + { + "label": "Be brave and ride", + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "experience", "amount": 8 }, + { "kind": "notification", "message": "You learn to sit tall and control the horse!" } + ] + }, + { + "label": "Just pet the horse", + "effects": [ + { "kind": "sanity", "amount": 5 }, + { "kind": "notification", "message": "The horse is gentle and friendly. Maybe next time." } + ] + } + ] + }, + { + "id": "first_pet", + "ageRange": { "min": 6, "max": 12 }, + "category": "family", + "icon": "๐Ÿฑ", + "title": "You Get a Pet!", + "description": "Your parents bring home a new kitten for you!", + "weight": 1.3, + "cooldownTicks": 52, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 30 }, + { "kind": "notification", "message": "A fluffy new friend to love and care for!" } + ] + } + }, + { + "id": "rain_puddles", + "ageRange": { "min": 3, "max": 10 }, + "category": "play", + "icon": "๐ŸŒง๏ธ", + "title": "Jumping in Puddles", + "description": "It's raining! The street is full of puddles to jump in.", + "weight": 1.5, + "seasons": ["spring", "autumn"], + "cooldownTicks": 8, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 18 }, + { "kind": "health", "amount": 3 }, + { "kind": "notification", "message": "SPLASH! The best feeling in the world!" } + ] + } + }, + { + "id": "snowman_building", + "ageRange": { "min": 4, "max": 14 }, + "category": "play", + "icon": "โ›„", + "title": "Building a Snowman", + "description": "It's snowing! Your friends want to build the biggest snowman ever.", + "weight": 1.2, + "seasons": ["winter"], + "cooldownTicks": 12, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "You build an enormous snowman with a carrot nose!" } + ] + } + }, + { + "id": "firefly_catching", + "ageRange": { "min": 5, "max": 12 }, + "category": "play", + "icon": "โœจ", + "title": "Catching Fireflies", + "description": "On a warm summer evening, fireflies light up the garden.", + "weight": 1.0, + "seasons": ["summer"], + "cooldownTicks": 14, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "Little lights dance around you in the darkness." } + ] + } + }, + { + "id": "scarecrow_encounter", + "ageRange": { "min": 5, "max": 12 }, + "category": "mystery", + "icon": "๐ŸŒพ", + "title": "The Scarecrow Seems to Move", + "description": "You're walking past the fields and you think the scarecrow has turned.", + "weight": 0.6, + "cooldownTicks": 20, + "outcomes": [ + { + "label": "Investigate bravely", + "effects": [ + { "kind": "sanity", "amount": 5 }, + { "kind": "notification", "message": "It was just the wind. Phew!" } + ] + }, + { + "label": "Run home quickly", + "effects": [ + { "kind": "sanity", "amount": -5 }, + { "kind": "notification", "message": "Better safe than sorry!" } + ] + } + ] + }, + { + "id": "sharing_treats", + "ageRange": { "min": 4, "max": 12 }, + "category": "friendship", + "icon": "๐Ÿช", + "title": "Sharing Treats", + "description": "You have a special cookie. There's one other kid who looks hungry.", + "weight": 1.0, + "cooldownTicks": 10, + "outcomes": [ + { + "label": "Share the cookie", + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "The other kid thanks you and smiles. Sharing is nice." } + ] + }, + { + "label": "Eat it yourself", + "effects": [ + { "kind": "health", "amount": 3 }, + { "kind": "notification", "message": "Cookies are delicious!" } + ] + } + ] + }, + { + "id": "helping_elder", + "ageRange": { "min": 8, "max": 14 }, + "category": "kindness", + "icon": "๐Ÿ‘ด", + "title": "An Elder Needs Help", + "description": "An old man is struggling to carry his groceries. He looks like he needs some help.", + "weight": 0.9, + "cooldownTicks": 16, + "outcomes": [ + { + "label": "Help carry the groceries", + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "gold", "amount": 5 }, + { "kind": "notification", "message": "The old man thanks you and gives you a coin." } + ] + }, + { + "label": "Keep walking", + "effects": [ + { "kind": "sanity", "amount": -3 }, + { "kind": "notification", "message": "Maybe next time..." } + ] + } + ] + }, + { + "id": "lost_dog", + "ageRange": { "min": 6, "max": 14 }, + "category": "encounter", + "icon": "๐Ÿ•", + "title": "A Lost Dog", + "description": "You find a puppy wandering alone, looking sad.", + "weight": 0.8, + "cooldownTicks": 18, + "outcomes": [ + { + "label": "Find the owner", + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "gold", "amount": 10 }, + { "kind": "notification", "message": "The happy puppy's family thanks you!" } + ] + }, + { + "label": "Give it some food", + "effects": [ + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "The puppy wags its tail gratefully." } + ] + } + ] + }, + { + "id": "first_job_internship", + "ageRange": { "min": 13, "max": 16 }, + "category": "work", + "icon": "๐Ÿช", + "title": "Helping at the Shop", + "description": "The shopkeeper lets you help out for a few hours. It's your first real work experience.", + "weight": 0.8, + "cooldownTicks": 20, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 8 }, + { "kind": "gold", "amount": 15 }, + { "kind": "experience", "amount": 10 }, + { "kind": "notification", "message": "You earn your first real wages!" } + ] + } + }, + { + "id": "dungeon_adventure", + "ageRange": { "min": 13, "max": 17 }, + "category": "adventure", + "icon": "โš”๏ธ", + "title": "The Old Dungeon", + "description": "The older kids challenge you to peek into the old dungeon entrance.", + "weight": 0.7, + "cooldownTicks": 22, + "outcomes": [ + { + "label": "Enter the dungeon", + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "experience", "amount": 15 }, + { "kind": "notification", "message": "You explore the dark passages and find treasure!" } + ] + }, + { + "label": "Stay outside and watch", + "effects": [ + { "kind": "sanity", "amount": 3 }, + { "kind": "notification", "message": "A little too scary for now." } + ] + } + ] + }, + { + "id": "reading_library", + "ageRange": { "min": 12, "max": 17 }, + "category": "learning", + "icon": "๐Ÿ“š", + "title": "Reading at the Library", + "description": "You spend an afternoon reading books at the town library.", + "weight": 0.9, + "cooldownTicks": 14, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 10 }, + { "kind": "experience", "amount": 15 }, + { "kind": "notification", "message": "The world expands through the power of reading." } + ] + } + }, + { + "id": "first_crush", + "ageRange": { "min": 13, "max": 17 }, + "category": "romance", + "icon": "๐Ÿ’•", + "title": "A Butterflies in Your Stomach", + "description": "You see someone at school and suddenly your heart starts racing.", + "weight": 1.0, + "cooldownTicks": 24, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "Oh no... Is this what people mean by 'crushes'?" } + ] + } + }, + { + "id": "harvest_festival", + "ageRange": { "min": 8, "max": 17 }, + "category": "community", + "icon": "๐ŸŽช", + "title": "The Autumn Harvest", + "description": "The whole town celebrates the harvest festival with games and food.", + "weight": 1.2, + "seasons": ["autumn"], + "cooldownTicks": 52, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 25 }, + { "kind": "health", "amount": 10 }, + { "kind": "notification", "message": "Pumpkin pie, hayrides, and apple cider! The best festival!" } + ] + } + }, + { + "id": "midsummer_fire", + "ageRange": { "min": 12, "max": 17 }, + "category": "community", + "icon": "๐Ÿ”ฅ", + "title": "The Midsummer Bonfire", + "description": "All the teens gather around the bonfire, telling stories and roasting marshmallows.", + "weight": 1.0, + "seasons": ["summer"], + "cooldownTicks": 52, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "Stories of monsters and adventure by the crackling fire." } + ] + } + }, + { + "id": "first_dance", + "ageRange": { "min": 14, "max": 17 }, + "category": "social", + "icon": "๐Ÿ’ƒ", + "title": "The First Dance", + "description": "You're invited to the teen dance at the community hall.", + "weight": 0.9, + "cooldownTicks": 40, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "notification", "message": "Twirling and laughter under the fairy lights!" } + ] + } + }, + { + "id": "winter_solstice", + "ageRange": { "min": 6, "max": 17 }, + "category": "community", + "icon": "๐Ÿ•ฏ๏ธ", + "title": "Winter Solstice", + "description": "The family gathers to celebrate the shortest day with warm food and stories.", + "weight": 1.0, + "seasons": ["winter"], + "cooldownTicks": 52, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "Candles, warmth, and the promise of spring to come." } + ] + } + } + ], + "coming_of_age_event": { + "id": "coming_of_age", + "age": 18, + "icon": "๐ŸŽ‰", + "title": "Coming of Age!", + "description": "You are now a full adult with access to everything the world offers โ€” jobs, dungeons, PVP, leadership roles, and more!", + "permanent_effects": { + "sanity": 30, + "health": 15, + "gold": 100, + "experience": 25, + "skillPoint": 2, + "notification": "You step into adulthood with promise and adventure ahead!" + }, + "unlocks": [ + "Full Adult Status", + "All Jobs", + "All Activities", + "PVP Arena", + "Leadership Roles" + ] + } +} diff --git a/src/lineage-json/quest-event-route/overworldEvents.json b/src/lineage-json/quest-event-route/overworldEvents.json new file mode 100644 index 0000000..82855b5 --- /dev/null +++ b/src/lineage-json/quest-event-route/overworldEvents.json @@ -0,0 +1,1081 @@ +[ + { + "id": "wandering_merchant", + "category": "opportunity", + "icon": "๐Ÿ›’", + "title": "A Wandering Merchant", + "description": "A peddler's cart appears on the road, hung with trinkets and oddities from distant lands. 'A fair price for fair folk,' she calls.", + "weight": 1.0, + "trigger": { "minAge": 8 }, + "cooldownTicks": 26, + "choices": [ + { + "label": "Buy a trinket (-50 gold)", + "description": "A small jade amulet catches your eye.", + "costs": [{ "kind": "gold", "amount": 50 }], + "effects": [ + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "You feel oddly comforted by the amulet." } + ] + }, + { + "label": "Haggle rudely", + "description": "You insult the merchant's wares to drive the price down.", + "effects": [ + { "kind": "gold", "amount": 25 }, + { "kind": "sanity", "amount": -4 }, + { "kind": "notification", "message": "She throws coins at you to be rid of you." } + ] + }, + { + "label": "Walk on by", + "effects": [ + { "kind": "notification", "message": "You nod politely and continue on your way." } + ] + } + ] + }, + { + "id": "lost_traveler", + "category": "encounter", + "icon": "๐Ÿงญ", + "title": "A Lost Traveler", + "description": "A dust-covered traveler waves you down. 'Please โ€” which road leads to the next town?'", + "weight": 1.0, + "trigger": { "minAge": 10 }, + "cooldownTicks": 20, + "choices": [ + { + "label": "Point the way", + "effects": [ + { "kind": "gold", "amount": 15 }, + { "kind": "sanity", "amount": 4 }, + { "kind": "notification", "message": "Grateful, the traveler presses a few coins into your hand." } + ] + }, + { + "label": "Misdirect them", + "effects": [ + { "kind": "sanity", "amount": -6 }, + { "kind": "notification", "message": "You snicker as they head off the wrong way. Your conscience pricks at you later." } + ] + } + ] + }, + { + "id": "overgrown_shrine", + "category": "discovery", + "icon": "โ›ฉ๏ธ", + "title": "An Overgrown Shrine", + "description": "Vines choke a weathered stone shrine half-buried in the undergrowth. Faded offerings lie scattered at its base.", + "weight": 0.8, + "trigger": { "minAge": 12 }, + "cooldownTicks": 30, + "choices": [ + { + "label": "Leave an offering", + "costs": [{ "kind": "gold", "amount": 10 }], + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "A warm breeze stirs. You feel watched โ€” but not unkindly." } + ] + }, + { + "label": "Pocket the offerings", + "effects": [ + { "kind": "gold", "amount": 30 }, + { "kind": "sanity", "amount": -10 }, + { "kind": "notification", "message": "The coins jingle in your pouch. The air turns cold." } + ] + }, + { + "label": "Restore the shrine", + "description": "Hours of clearing vines and righting the stone.", + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "skillPoint", "amount": 1 }, + { "kind": "notification", "message": "By dusk the shrine stands whole again. Wisdom settles over you." } + ] + } + ] + }, + { + "id": "stray_dog", + "category": "encounter", + "icon": "๐Ÿ•", + "title": "A Stray Dog", + "description": "A matted dog trails behind you, tail wagging hopefully. It looks half-starved.", + "weight": 1.0, + "trigger": { "minAge": 5 }, + "cooldownTicks": 24, + "choices": [ + { + "label": "Share your food (-20 gold)", + "costs": [{ "kind": "gold", "amount": 20 }], + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "The dog devours the scraps and trots loyally at your side for a while." } + ] + }, + { + "label": "Shoo it away", + "effects": [ + { "kind": "sanity", "amount": -3 }, + { "kind": "notification", "message": "It whimpers and slinks off into the alleys." } + ] + } + ] + }, + { + "id": "bandit_ambush", + "category": "encounter", + "icon": "๐Ÿ—ก๏ธ", + "title": "Bandit Ambush!", + "description": "Figures step from the treeline. 'Your gold or your blood, traveler.'", + "weight": 1.2, + "trigger": { "minAge": 14 }, + "cooldownTicks": 22, + "choices": [ + { + "label": "Hand over your coin (-60 gold)", + "costs": [{ "kind": "gold", "amount": 60 }], + "effects": [ + { "kind": "sanity", "amount": -8 }, + { "kind": "notification", "message": "The bandits vanish into the woods with your purse. You live." } + ] + }, + { + "label": "Fight them off", + "effects": [ + { "kind": "health", "amount": -25 }, + { "kind": "gold", "amount": 40 }, + { "kind": "notification", "message": "Battered but standing, you take what the fallen left behind." } + ] + }, + { + "label": "Try to flee", + "description": "Risky โ€” they are fast.", + "effects": [ + { "kind": "health", "amount": -40 }, + { "kind": "sanity", "amount": -10 }, + { "kind": "notification", "message": "You break free at a cost, lungs burning, purse lighter than you thought." } + ] + } + ] + }, + { + "id": "buried_cache", + "category": "discovery", + "icon": "๐Ÿ—บ๏ธ", + "title": "A Buried Cache", + "description": "Your boot strikes something hard beneath the soil. Aged linen wraps a small bundle.", + "weight": 0.8, + "trigger": { "minAge": 10 }, + "cooldownTicks": 28, + "autoOutcome": { + "effects": [ + { "kind": "gold", "amount": 80 }, + { "kind": "notification", "message": "You shake loose a handful of old coins. The past had generous hands." } + ] + } + }, + { + "id": "market_festival", + "category": "world_state", + "icon": "๐ŸŽ", + "title": "A Traveling Festival", + "description": "Bright pennants snap in the wind as a wandering market-festival rolls through. Music and laughter fill the air.", + "weight": 1.0, + "trigger": { "minAge": 6, "seasons": ["spring", "summer", "autumn"] }, + "cooldownTicks": 40, + "choices": [ + { + "label": "Join the revelry (-30 gold)", + "costs": [{ "kind": "gold", "amount": 30 }], + "effects": [ + { "kind": "sanity", "amount": 25 }, + { "kind": "health", "amount": 10 }, + { "kind": "notification", "message": "You dance and feast until your sides ache. The world feels lighter." } + ] + }, + { + "label": "Pickpocket the crowd", + "effects": [ + { "kind": "gold", "amount": 50 }, + { "kind": "sanity", "amount": -5 }, + { "kind": "notification", "message": "Quick fingers, quicker feet. No one notices โ€” except your reflection." } + ] + } + ] + }, + { + "id": "distant_smoke", + "category": "world_state", + "icon": "๐ŸŒซ๏ธ", + "title": "Smoke on the Horizon", + "description": "A column of dark smoke rises from a distant hamlet. Something is burning.", + "weight": 0.9, + "trigger": { "minAge": 14 }, + "cooldownTicks": 35, + "choices": [ + { + "label": "Rush to help", + "effects": [ + { "kind": "health", "amount": -20 }, + { "kind": "sanity", "amount": 8 }, + { "kind": "gold", "amount": 30 }, + { "kind": "notification", "message": "You help pull survivors from the embers. A grateful family presses reward into your hands." } + ] + }, + { + "label": "Stay clear", + "effects": [ + { "kind": "sanity", "amount": -6 }, + { "kind": "notification", "message": "You turn away. The smoke lingers in your dreams." } + ] + } + ] + }, + { + "id": "hermits_wisdom", + "category": "discovery", + "icon": "๐Ÿง™", + "title": "The Hermit's Wisdom", + "description": "A reclusive hermit beckons from a cave mouth. 'Sit, child of years. The world has much to teach the patient.'", + "weight": 0.7, + "trigger": { "minAge": 16, "lifeStages": ["youngAdult", "adult", "elder"] }, + "cooldownTicks": 50, + "autoOutcome": { + "effects": [ + { "kind": "skillPoint", "amount": 1 }, + { "kind": "sanity", "amount": 10 }, + { "kind": "notification", "message": "Hours pass like water. When you rise, your mind feels sharpened." } + ] + } + }, + { + "id": "fallen_log_bridge", + "category": "discovery", + "icon": "๐ŸŒฒ", + "title": "A Fallen Log Bridge", + "description": "A great tree has fallen across a ravine, forming a precarious crossing. A glint of something gleams on the far side.", + "weight": 0.9, + "trigger": { "minAge": 10 }, + "cooldownTicks": 26, + "choices": [ + { + "label": "Cross carefully", + "effects": [ + { "kind": "gold", "amount": 45 }, + { "kind": "sanity", "amount": 3 }, + { "kind": "notification", "message": "Heart pounding, you make it across and claim the prize โ€” a pouch of coins." } + ] + }, + { + "label": "Don't risk it", + "effects": [ + { "kind": "notification", "message": "You find a longer way around. The prize stays where it lies." } + ] + } + ] + }, + { + "id": "child_runaways", + "category": "encounter", + "icon": "๐Ÿ‘ฃ", + "title": "Runaway Children", + "description": "Two wide-eyed children approach, claiming to have run away from home. They ask for food and directions.", + "weight": 0.9, + "trigger": { "minAge": 12 }, + "cooldownTicks": 30, + "choices": [ + { + "label": "Feed and send them home (-15 gold)", + "costs": [{ "kind": "gold", "amount": 15 }], + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "You buy them bread and point them back to worried parents. You sleep well." } + ] + }, + { + "label": "Turn a blind eye", + "effects": [ + { "kind": "sanity", "amount": -4 }, + { "kind": "notification", "message": "You shrug and walk on. Out here, everyone fends for themselves." } + ] + } + ] + }, + { + "id": "roadside_grave", + "category": "discovery", + "icon": "๐Ÿชฆ", + "title": "A Roadside Grave", + "description": "A simple marker stands by the path, fresh wildflowers laid upon it. The name is weathered beyond reading.", + "weight": 0.7, + "trigger": { "minAge": 8 }, + "cooldownTicks": 32, + "choices": [ + { + "label": "Pause and pay respects", + "effects": [ + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "You stand a moment in silence. The road feels gentler after." } + ] + }, + { + "label": "Take the flowers", + "effects": [ + { "kind": "gold", "amount": 5 }, + { "kind": "sanity", "amount": -8 }, + { "kind": "notification", "message": "You pocket the bouquet to sell in town. Your hands feel heavy." } + ] + } + ] + }, + { + "id": "caravan_breakdown", + "category": "opportunity", + "icon": "๐Ÿ‚", + "title": "A Broken Caravan", + "description": "A trade caravan is stalled, a wheel shattered. The driver waves for help.", + "weight": 1.0, + "trigger": { "minAge": 14 }, + "cooldownTicks": 28, + "choices": [ + { + "label": "Help repair it", + "effects": [ + { "kind": "sanity", "amount": 6 }, + { "kind": "gold", "amount": 35 }, + { "kind": "notification", "message": "Grease and sweat โ€” but the driver rewards your labor." } + ] + }, + { + "label": "Offer to guard it overnight", + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "gold", "amount": 50 }, + { "kind": "notification", "message": "A long, cold watch โ€” but the morning finds the caravan safe and your purse heavier." } + ] + } + ] + }, + { + "id": "wandering_minstrel", + "category": "opportunity", + "icon": "๐ŸŽต", + "title": "A Wandering Minstrel", + "description": "A bard with a battered lute strums a tune and beckons you to listen.", + "weight": 1.0, + "trigger": { "minAge": 8 }, + "cooldownTicks": 24, + "choices": [ + { + "label": "Toss a coin and listen (-10 gold)", + "costs": [{ "kind": "gold", "amount": 10 }], + "effects": [ + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "The song carries you somewhere far away. You rise refreshed." } + ] + }, + { + "label": "Request a grim ballad", + "effects": [ + { "kind": "sanity", "amount": -2 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "The melancholy tune steadies your resolve rather than your mood." } + ] + } + ] + }, + { + "id": "spring_thaw_flood", + "category": "world_state", + "icon": "๐ŸŒŠ", + "title": "Spring Thaw Flood", + "description": "The rivers swell with meltwater. A low bridge is submerged and travelers are stranded.", + "weight": 1.0, + "trigger": { "minAge": 12, "seasons": ["spring"] }, + "cooldownTicks": 52, + "choices": [ + { + "label": "Help ferry stranded folk", + "effects": [ + { "kind": "health", "amount": -15 }, + { "kind": "gold", "amount": 40 }, + { "kind": "sanity", "amount": 6 }, + { "kind": "notification", "message": "Cold water to the waist, but grateful hands press coin upon you." } + ] + }, + { + "label": "Wait it out", + "effects": [ + { "kind": "sanity", "amount": -3 }, + { "kind": "notification", "message": "You wait on the high bank until the waters recede. Boredom gnaws." } + ] + } + ] + }, + { + "id": "winter_wolf_howl", + "category": "world_state", + "icon": "๐Ÿบ", + "title": "Wolves on the Prowl", + "description": "Howls echo across the snowfields. A lean wolf watches you from the treeline, gaunt and hungry.", + "weight": 1.0, + "trigger": { "minAge": 12, "seasons": ["winter"] }, + "cooldownTicks": 40, + "choices": [ + { + "label": "Toss it food (-15 gold)", + "costs": [{ "kind": "gold", "amount": 15 }], + "effects": [ + { "kind": "sanity", "amount": 5 }, + { "kind": "notification", "message": "The wolf snatches the meat and slips away. You've made the road safer for now." } + ] + }, + { + "label": "Stand your ground", + "effects": [ + { "kind": "health", "amount": -20 }, + { "kind": "notification", "message": "A tense standoff ends with the wolf retreating. Your nerves are frayed." } + ] + } + ] + }, + { + "id": "autumn_harvent_share", + "category": "opportunity", + "icon": "๐ŸŽ", + "title": "Harvest Surplus", + "description": "A farmer waves you over. 'Too much to carry before it spoils โ€” take a share, and a few coins for honest work.'", + "weight": 1.0, + "trigger": { "minAge": 10, "seasons": ["autumn"] }, + "cooldownTicks": 45, + "autoOutcome": { + "effects": [ + { "kind": "gold", "amount": 25 }, + { "kind": "health", "amount": 15 }, + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "Apples, root vegetables, and a friendly handshake. You leave well-fed." } + ] + } + }, + { + "id": "summer_heatstroke", + "category": "world_state", + "icon": "๐Ÿฅต", + "title": "Sweltering Heat", + "description": "The summer sun beats down mercilessly. Your vision swims; the road shimmers ahead.", + "weight": 1.0, + "trigger": { "minAge": 12, "seasons": ["summer"] }, + "cooldownTicks": 30, + "choices": [ + { + "label": "Rest in the shade", + "description": "Lose time, regain strength.", + "effects": [ + { "kind": "sanity", "amount": 4 }, + { "kind": "health", "amount": -5 }, + { "kind": "notification", "message": "You wait out the worst of the heat beneath an oak. Slow, but wise." } + ] + }, + { + "label": "Push on through", + "effects": [ + { "kind": "health", "amount": -20 }, + { "kind": "sanity", "amount": -8 }, + { "kind": "notification", "message": "Stupid stubbornness. You make your destination and collapse into a bed." } + ] + } + ] + }, + { + "id": "curious_omen", + "category": "world_state", + "icon": "๐Ÿ”ฎ", + "title": "An Ill Omen", + "description": "A flock of crows circles overhead as you pass a crossroads. One drops a single black feather at your feet.", + "weight": 0.6, + "trigger": { "minAge": 14 }, + "cooldownTicks": 60, + "choices": [ + { + "label": "Take it as a sign to turn back", + "effects": [ + { "kind": "sanity", "amount": -4 }, + { "kind": "health", "amount": 10 }, + { "kind": "notification", "message": "You retrace your steps. Caution spares you a fall later that day." } + ] + }, + { + "label": "Press on regardless", + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "sanity", "amount": 3 }, + { "kind": "notification", "message": "You refuse to be ruled by superstition โ€” though the crows seem to follow." } + ] + } + ] + }, + { + "id": "dropped_purse", + "category": "opportunity", + "icon": "๐Ÿ‘›", + "title": "A Dropped Purse", + "description": "A heavy purse lies in the dust of the road. No one seems to be looking for it.", + "weight": 1.0, + "trigger": { "minAge": 8 }, + "cooldownTicks": 24, + "choices": [ + { + "label": "Keep it", + "effects": [ + { "kind": "gold", "amount": 60 }, + { "kind": "sanity", "amount": -4 }, + { "kind": "notification", "message": "You pocket the coin. Someone, somewhere, is poorer for it." } + ] + }, + { + "label": "Return it to town", + "description": "Ask after the owner in the next settlement.", + "effects": [ + { "kind": "gold", "amount": 10 }, + { "kind": "sanity", "amount": 12 }, + { "kind": "notification", "message": "The owner, found, rewards your honesty with a small token." } + ] + } + ] + }, + { + "id": "elder_needs_escort", + "category": "encounter", + "icon": "๐Ÿ‘ต", + "title": "An Elder Needs an Escort", + "description": "A frail elder leans on a staff by the road. 'Could you see me to the next village, friend?'", + "weight": 0.9, + "trigger": { "minAge": 12 }, + "cooldownTicks": 30, + "choices": [ + { + "label": "Escort them", + "effects": [ + { "kind": "sanity", "amount": 10 }, + { "kind": "gold", "amount": 20 }, + { "kind": "notification", "message": "A slow walk, but a good one. The elder blesses you at parting." } + ] + }, + { + "label": "Decline politely", + "effects": [ + { "kind": "sanity", "amount": -2 }, + { "kind": "notification", "message": "You apologize and hurry on. The road feels colder behind you." } + ] + } + ] + }, + { + "id": "mushroom_grove", + "category": "discovery", + "icon": "๐Ÿ„", + "title": "A Ring of Mushrooms", + "description": "Strange, vividly colored mushrooms grow in a perfect ring in a sun-dappled grove.", + "weight": 0.8, + "trigger": { "minAge": 8, "seasons": ["spring", "summer", "autumn"] }, + "cooldownTicks": 35, + "choices": [ + { + "label": "Harvest them carefully", + "effects": [ + { "kind": "gold", "amount": 30 }, + { "kind": "sanity", "amount": 4 }, + { "kind": "notification", "message": "An apothecary in town will pay well for these. You pocket a satchel's worth." } + ] + }, + { + "label": "Eat one on a whim", + "effects": [ + { "kind": "health", "amount": -15 }, + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "Vivid dreams follow. Whether they were worth the stomachache is debatable." } + ] + } + ] + }, + { + "id": "childhood_daydream", + "category": "world_state", + "icon": "๐Ÿช", + "title": "A Carefree Afternoon", + "description": "The world feels wide and bright. You spend an afternoon chasing dragonflies and watching clouds.", + "weight": 1.0, + "trigger": { "minAge": 5, "maxAge": 17 }, + "cooldownTicks": 18, + "autoOutcome": { + "effects": [ + { "kind": "sanity", "amount": 18 }, + { "kind": "health", "amount": 5 }, + { "kind": "notification", "message": "For a while, the worries of the world feel very far away." } + ] + } + }, + { + "id": "roadside_philosopher", + "category": "discovery", + "icon": "๐Ÿ“œ", + "title": "A Roadside Philosopher", + "description": "An old man sits on a stone, declaiming to no one in particular. He waves you over and demands you refute him.", + "weight": 0.7, + "trigger": { "minAge": 14 }, + "cooldownTicks": 40, + "choices": [ + { + "label": "Engage earnestly", + "effects": [ + { "kind": "skillPoint", "amount": 1 }, + { "kind": "sanity", "amount": 6 }, + { "kind": "notification", "message": "Sharp words sharpen a sharp mind. You part wiser, exchange grins." } + ] + }, + { + "label": "Humor him and nod", + "effects": [ + { "kind": "sanity", "amount": 2 }, + { "kind": "notification", "message": "You plaster on a smile until he's satisfied. One less problem in the world." } + ] + } + ] + }, + { + "id": "winter_blizzard", + "category": "world_state", + "icon": "๐ŸŒจ๏ธ", + "title": "Blinding Blizzard", + "description": "A howling blizzard descends without warning, turning the world white. You can barely see your own hands.", + "weight": 1.0, + "trigger": { "minAge": 10, "seasons": ["winter"] }, + "cooldownTicks": 45, + "choices": [ + { + "label": "Shelter in a snowbank", + "description": "Dig in and wait it out.", + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "sanity", "amount": -5 }, + { "kind": "notification", "message": "You burrow into the snow, shivering until the storm passes." } + ] + }, + { + "label": "Keep moving, find cover", + "description": "Risk injury to find better shelter.", + "effects": [ + { "kind": "health", "amount": -25 }, + { "kind": "gold", "amount": 30 }, + { "kind": "notification", "message": "You stumble into an abandoned hunter's shack and find a few coins left behind." } + ] + } + ] + }, + { + "id": "frozen_lake_discovery", + "category": "discovery", + "icon": "๐ŸงŠ", + "title": "Frozen Lake", + "description": "A crystalline lake lies frozen solid, its surface etched with strange patterns. Something glimmers beneath the ice.", + "weight": 0.8, + "trigger": { "minAge": 12, "seasons": ["winter"] }, + "cooldownTicks": 50, + "choices": [ + { + "label": "Chip at the ice carefully", + "description": "Hours of painstaking work.", + "effects": [ + { "kind": "gold", "amount": 60 }, + { "kind": "health", "amount": -8 }, + { "kind": "notification", "message": "Ancient fishing tackle and a pouch of coins emerge from the icy depths." } + ] + }, + { + "label": "Skate across the surface", + "description": "Dangerous, but exhilarating.", + "effects": [ + { "kind": "health", "amount": -15 }, + { "kind": "sanity", "amount": 20 }, + { "kind": "notification", "message": "You glide across the mirror-like ice. The cold wind in your hair reminds you that you're alive." } + ] + } + ] + }, + { + "id": "winter_wolf_pack", + "category": "encounter", + "icon": "๐Ÿบ", + "title": "Hungry Wolf Pack", + "description": "A pack of gaunt wolves circles you, eyes gleaming in the snow-reflected moonlight. They are desperate with hunger.", + "weight": 1.2, + "trigger": { "minAge": 14, "seasons": ["winter"] }, + "cooldownTicks": 55, + "choices": [ + { + "label": "Stand your ground with a torch", + "description": "Fire keeps predators at bay.", + "costs": [{ "kind": "gold", "amount": 5 }], + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "sanity", "amount": 4 }, + { "kind": "notification", "message": "Your makeshift torch holds them at a distance. They melt back into the dark." } + ] + }, + { + "label": "Climb a tree", + "effects": [ + { "kind": "health", "amount": -5 }, + { "kind": "sanity", "amount": -8 }, + { "kind": "notification", "message": "You scramble up a pine and wait long, cold hours until the pack loses interest." } + ] + }, + { + "label": "Fight them off", + "description": "Desperate measures for desperate times.", + "effects": [ + { "kind": "health", "amount": -35 }, + { "kind": "gold", "amount": 25 }, + { "kind": "notification", "message": "Bruised and bloodied, you drive them off. A torn pouch spills some coin at your feet." } + ] + } + ] + }, + { + "id": "winter_solstice_ritual", + "category": "opportunity", + "icon": "๐Ÿ•ฏ๏ธ", + "title": "Solstice Ritual", + "description": "Villagers gather around a great bonfire, singing old songs to call back the sun. They welcome travelers to join.", + "weight": 0.8, + "trigger": { "minAge": 8, "seasons": ["winter"] }, + "cooldownTicks": 60, + "choices": [ + { + "label": "Join the ritual", + "costs": [{ "kind": "gold", "amount": 10 }], + "effects": [ + { "kind": "sanity", "amount": 25 }, + { "kind": "health", "amount": 10 }, + { "kind": "notification", "message": "The warmth of the fire and the community's hope fill you. You feel the darkness recede, if only for a night." } + ] + }, + { + "label": "Sell trinkets to the crowd", + "effects": [ + { "kind": "gold", "amount": 40 }, + { "kind": "sanity", "amount": -3 }, + { "kind": "notification", "message": "Festival-goers buy your odds and ends at inflated prices. Business is business." } + ] + } + ] + }, + { + "id": "spring_flooded_road", + "category": "world_state", + "icon": "๐Ÿ’ง", + "title": "Flooded Lowlands", + "description": "Spring melt has turned the low road into a muddy swamp. Travelers are picking their way along the high ridges.", + "weight": 1.0, + "trigger": { "minAge": 10, "seasons": ["spring"] }, + "cooldownTicks": 40, + "choices": [ + { + "label": "Wade through the mud", + "description": "Unpleasant but direct.", + "effects": [ + { "kind": "health", "amount": -8 }, + { "kind": "sanity", "amount": -5 }, + { "kind": "notification", "message": "Cold, filthy water soaks you to the bone, but you come out the other side." } + ] + }, + { + "label": "Help build a crossing", + "effects": [ + { "kind": "health", "amount": -15 }, + { "kind": "gold", "amount": 30 }, + { "kind": "sanity", "amount": 8 }, + { "kind": "notification", "message": "Together with other travelers you haul logs and stones. The grateful merchant at the front pays in coin." } + ] + } + ] + }, + { + "id": "blooming_garden", + "category": "discovery", + "icon": "๐ŸŒท", + "title": "Blooming Garden", + "description": "Behind a crumbling stone wall lies a hidden garden, bursting with flowers in every color. Bees hum lazily in the morning light.", + "weight": 0.8, + "trigger": { "minAge": 8, "seasons": ["spring"] }, + "cooldownTicks": 45, + "choices": [ + { + "label": "Rest in the garden", + "effects": [ + { "kind": "sanity", "amount": 25 }, + { "kind": "health", "amount": 10 }, + { "kind": "notification", "message": "You lie in the soft grass and watch petals drift overhead. The world's troubles feel miles away." } + ] + }, + { + "label": "Harvest rare flowers", + "description": "An apothecary would pay well for these.", + "effects": [ + { "kind": "gold", "amount": 35 }, + { "kind": "notification", "message": "You carefully pick the rarest blossoms. In town they trade for a tidy sum." } + ] + } + ] + }, + { + "id": "spring_fair", + "category": "opportunity", + "icon": "๐ŸŽ ", + "title": "Spring Fair", + "description": "A seasonal fair has sprung up in a clearing: games, food stalls, and a fortune teller's tent with faded velvet drapes.", + "weight": 1.0, + "trigger": { "minAge": 8, "seasons": ["spring"] }, + "cooldownTicks": 48, + "choices": [ + { + "label": "Play the ring-toss game", + "costs": [{ "kind": "gold", "amount": 15 }], + "effects": [ + { "kind": "sanity", "amount": 12 }, + { "kind": "gold", "amount": 20 }, + { "kind": "notification", "message": "Beginner's luck! You win a small prize and a few coins from a losing bettor." } + ] + }, + { + "label": "Visit the fortune teller", + "costs": [{ "kind": "gold", "amount": 25 }], + "effects": [ + { "kind": "skillPoint", "amount": 1 }, + { "kind": "sanity", "amount": 10 }, + { "kind": "notification", "message": "'Your path crosses with a shadow from your past,' she intones. Cryptic โ€” but her words linger." } + ] + }, + { + "label": "Sneak into the prize booth", + "effects": [ + { "kind": "gold", "amount": 45 }, + { "kind": "sanity", "amount": -10 }, + { "kind": "notification", "message": "Quick fingers find the till. You slip away before anyone notices." } + ] + } + ] + }, + { + "id": "summer_oasis", + "category": "discovery", + "icon": "๐ŸŒด", + "title": "Desert Oasis", + "description": "A cluster of palm trees and a shimmering spring break the monotonous heat. The water is cool and clear.", + "weight": 0.9, + "trigger": { "minAge": 10, "seasons": ["summer"] }, + "cooldownTicks": 45, + "choices": [ + { + "label": "Drink and rest", + "effects": [ + { "kind": "health", "amount": 20 }, + { "kind": "sanity", "amount": 15 }, + { "kind": "notification", "message": "The water is life itself. You drink deeply and feel renewed." } + ] + }, + { + "label": "Search for hidden treasure", + "description": "Old tales say something lies beneath.", + "effects": [ + { "kind": "gold", "amount": 50 }, + { "kind": "health", "amount": -10 }, + { "kind": "notification", "message": "You fish around in the murk and find an ancient coin and a silver bracelet tangled in roots." } + ] + } + ] + }, + { + "id": "summer_drought", + "category": "world_state", + "icon": "๐Ÿœ๏ธ", + "title": "Severe Drought", + "description": "The sun has not relented for weeks. The ground is cracked, the wells are low, and tempers are short.", + "weight": 1.0, + "trigger": { "minAge": 12, "seasons": ["summer"] }, + "cooldownTicks": 50, + "choices": [ + { + "label": "Help dig a new well", + "effects": [ + { "kind": "health", "amount": -20 }, + { "kind": "gold", "amount": 40 }, + { "kind": "sanity", "amount": 6 }, + { "kind": "notification", "message": "Backbreaking work under the noon sun, but the villagers share their precious water and pay your wage." } + ] + }, + { + "label": "Move on quickly", + "description": "Less water used, less trouble.", + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "sanity", "amount": -4 }, + { "kind": "notification", "message": "You press on under the merciless sun, saving your canteen for the road ahead." } + ] + } + ] + }, + { + "id": "summer_swarms", + "category": "encounter", + "icon": "๐Ÿฆ—", + "title": "Swarming Insects", + "description": "A dark cloud of insects descends upon you โ€” biting flies, mosquitoes, and things that crawl where they bite.", + "weight": 0.9, + "trigger": { "minAge": 8, "seasons": ["summer"] }, + "cooldownTicks": 35, + "choices": [ + { + "label": "Endure it", + "description": "Cover your face and push through.", + "effects": [ + { "kind": "health", "amount": -10 }, + { "kind": "sanity", "amount": -8 }, + { "kind": "notification", "message": "Bites cover your arms and neck, but the swarm passes. You emerge battered and itchy." } + ] + }, + { + "label": "Build a smoky fire", + "description": "Drive them off with smoke.", + "effects": [ + { "kind": "health", "amount": -3 }, + { "kind": "sanity", "amount": 3 }, + { "kind": "notification", "message": "The smoke drives them away. You waste some time but escape mostly un-bitten." } + ] + } + ] + }, + { + "id": "autumn_harvest_festival", + "category": "opportunity", + "icon": "๐ŸŽƒ", + "title": "Harvest Festival Feast", + "description": "Lanterns glow warm in the autumn dusk as the village throws its annual harvest feast. Laughter and music spill from every door.", + "weight": 1.0, + "trigger": { "minAge": 8, "seasons": ["autumn"] }, + "cooldownTicks": 50, + "choices": [ + { + "label": "Join the feast", + "costs": [{ "kind": "gold", "amount": 20 }], + "effects": [ + { "kind": "health", "amount": 20 }, + { "kind": "sanity", "amount": 25 }, + { "kind": "gold", "amount": -20 }, + { "kind": "notification", "message": "You eat, drink, and dance until the bonfire embers die. The village adopts you for the night." } + ] + }, + { + "label": "Help with the preparations", + "description": "Earn your keep and some coin.", + "effects": [ + { "kind": "health", "amount": -5 }, + { "kind": "gold", "amount": 35 }, + { "kind": "sanity", "amount": 10 }, + { "kind": "notification", "message": "You haul tables, light lanterns, and peel vegetables. The village elder slips you a handful of coins." } + ] + } + ] + }, + { + "id": "migrating_herd", + "category": "encounter", + "icon": "๐ŸฆŒ", + "title": "Migrating Herd", + "description": "The ground trembles as a massive herd of deer and wild goats moves through the valley, heading to their winter grounds.", + "weight": 0.9, + "trigger": { "minAge": 10, "seasons": ["autumn"] }, + "cooldownTicks": 48, + "choices": [ + { + "label": "Watch in awe", + "effects": [ + { "kind": "sanity", "amount": 18 }, + { "kind": "notification", "message": "The herd moves like a flowing river of fur and antlers. Nature's raw power humbles you." } + ] + }, + { + "label": "Hunt a straggler", + "description": "Fresh meat for the road.", + "effects": [ + { "kind": "gold", "amount": 30 }, + { "kind": "health", "amount": 15 }, + { "kind": "sanity", "amount": -5 }, + { "kind": "notification", "message": "You bring down a young buck. The meat will feed you for weeks and the hide sells well." } + ] + } + ] + }, + { + "id": "falling_leaf_shrine", + "category": "discovery", + "icon": "๐Ÿ", + "title": "Falling-Leaf Shrine", + "description": "Amid a grove of golden-leafed trees sits a small stone shrine, half-buried in a carpet of autumn leaves. The air hums with peace.", + "weight": 0.8, + "trigger": { "minAge": 10, "seasons": ["autumn"] }, + "cooldownTicks": 50, + "choices": [ + { + "label": "Clear the leaves and pray", + "description": "Show respect and receive a blessing.", + "effects": [ + { "kind": "sanity", "amount": 20 }, + { "kind": "skillPoint", "amount": 1 }, + { "kind": "notification", "message": "You uncover a small offering bowl. The wisdom of the changing season settles in your heart." } + ] + }, + { + "label": "Search for hidden offerings", + "effects": [ + { "kind": "gold", "amount": 40 }, + { "kind": "sanity", "amount": -6 }, + { "kind": "notification", "message": "You find old coins among the leaves. The shrine's guardian spirit seems to frown." } + ] + } + ] + }, + { + "id": "autumn_wind_storm", + "category": "world_state", + "icon": "๐Ÿ’จ", + "title": "Gale Winds", + "description": "A fierce autumn wind whips through the countryside, tearing leaves from trees and shaking shutters. Travel slows to a crawl.", + "weight": 0.9, + "trigger": { "minAge": 8, "seasons": ["autumn"] }, + "cooldownTicks": 35, + "choices": [ + { + "label": "Find shelter and wait", + "effects": [ + { "kind": "health", "amount": -5 }, + { "kind": "sanity", "amount": -2 }, + { "kind": "notification", "message": "You huddle behind a boulder until the worst passes. Leaves and debris rain around you." } + ] + }, + { + "label": "Push through to town", + "effects": [ + { "kind": "health", "amount": -15 }, + { "kind": "sanity", "amount": 5 }, + { "kind": "notification", "message": "Stubbornness pays โ€” you stagger into the town inn just as the storm peaks. The innkeeper gives you a dry cloth and a nod." } + ] + } + ] + } +] diff --git a/src/lineage-json/quest-event-route/questTemplates.json b/src/lineage-json/quest-event-route/questTemplates.json new file mode 100644 index 0000000..7380a73 --- /dev/null +++ b/src/lineage-json/quest-event-route/questTemplates.json @@ -0,0 +1,2447 @@ +[ + { + "id": "missing_merchant", + "title": "The Missing Merchant", + "description": "A local merchant vanished while traveling. Find them before the trail goes cold.", + "category": "location", + "weight": 6, + "cooldownTicks": 14, + "context": { + "minAge": 16, + "requiredRelationshipState": "known" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "find_merchant", + "type": "find_character", + "label": "Find the missing merchant", + "target": 1 + } + ], + "rewards": { + "gold": 250, + "reputation": 5 + } + }, + { + "id": "speed_run_nearby_cave", + "title": "Speed Run Challenge", + "description": "Complete a dungeon with ruthless efficiency before time runs out.", + "category": "time_limited", + "weight": 5, + "cooldownTicks": 18, + "context": { + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "complete_dungeon", + "type": "complete_dungeon", + "label": "Complete any dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 300, + "skillPoints": 1 + } + }, + { + "id": "ancient_artifact", + "title": "The Ancient Artifact", + "description": "Recover an ancient relic from a dangerous delve.", + "category": "location", + "weight": 4, + "cooldownTicks": 16, + "context": { + "minAge": 18 + }, + "expiresAfterTicks": 28, + "objectives": [ + { + "id": "dungeon_clear", + "type": "complete_dungeon", + "label": "Complete a dungeon run", + "target": 1 + } + ], + "rewards": { + "gold": 420, + "reputation": 8 + } + }, + { + "id": "family_matters", + "title": "Family Matters", + "description": "Spend meaningful time guiding your child through training.", + "category": "relationship", + "weight": 6, + "cooldownTicks": 20, + "context": { + "minAge": 22, + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "visit_home", + "type": "reach_location", + "label": "Visit home activities", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 180, + "reputation": 10 + } + }, + { + "id": "escort_healer", + "title": "Escort the Healer", + "description": "Protect a healer as they gather herbs in hostile territory.", + "category": "combat", + "weight": 5, + "cooldownTicks": 22, + "context": { + "minAge": 18 + }, + "expiresAfterTicks": 26, + "objectives": [ + { + "id": "clear_encounters", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 6 + } + ], + "rewards": { + "gold": 320, + "skillPoints": 1 + } + }, + { + "id": "arena_proving", + "title": "Arena Proving", + "description": "Win a duel to prove your battle instincts.", + "category": "combat", + "weight": 4, + "cooldownTicks": 12, + "context": { + "minAge": 16 + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "arena_wins", + "type": "arena_wins", + "label": "Win arena matches", + "target": 1 + } + ], + "rewards": { + "gold": 260, + "reputation": 6 + } + }, + { + "id": "winter_supply_run", + "title": "Winter Supply Run", + "description": "Bring emergency supplies to a remote outpost before the cold worsens.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 24, + "context": { + "requiredSeason": "winter", + "minAge": 16 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "deliver_goods", + "type": "deliver_item", + "label": "Deliver supplies", + "target": 1 + } + ], + "rewards": { + "gold": 340, + "reputation": 7 + } + }, + { + "id": "spring_cleanup", + "title": "Spring Cleanup", + "description": "Clear dangerous creatures from fields before planting season.", + "category": "combat", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "spring" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "clear_field_pests", + "type": "kill_enemies", + "label": "Defeat pests", + "target": 5 + } + ], + "rewards": { + "gold": 210, + "reputation": 4 + } + }, + { + "id": "summer_hunt", + "title": "High Sun Hunt", + "description": "Track and defeat a dangerous beast during summer migration.", + "category": "combat", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "summer" + }, + "expiresAfterTicks": 22, + "objectives": [ + { + "id": "beast_kills", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 7 + } + ], + "rewards": { + "gold": 360, + "skillPoints": 1 + } + }, + { + "id": "autumn_patrol", + "title": "Autumn Border Patrol", + "description": "Secure roads before harvest caravans depart.", + "category": "location", + "weight": 3, + "cooldownTicks": 16, + "context": { + "requiredSeason": "autumn" + }, + "expiresAfterTicks": 22, + "objectives": [ + { + "id": "patrol_route", + "type": "reach_location", + "label": "Visit dungeon routes", + "target": 1, + "metadata": { + "pathname": "/dungeon" + } + } + ], + "rewards": { + "gold": 240, + "reputation": 5 + } + }, + { + "id": "ranger_trail", + "title": "Ranger Trail Request", + "description": "Your tracking skills are needed for a dangerous trail.", + "category": "class", + "weight": 5, + "cooldownTicks": 14, + "context": { + "requiredClass": "ranger" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "ranger_kills", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 6 + } + ], + "rewards": { + "gold": 330, + "skillPoints": 1 + } + }, + { + "id": "paladin_vigil", + "title": "Paladin Vigil", + "description": "Stand watch and purge corruption from a sacred route.", + "category": "class", + "weight": 5, + "cooldownTicks": 14, + "context": { + "requiredClass": "paladin" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "paladin_boss", + "type": "complete_dungeon", + "label": "Complete one dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 300, + "reputation": 9 + } + }, + { + "id": "mage_research", + "title": "Mage Field Research", + "description": "Gather arcane readings in volatile territory.", + "category": "class", + "weight": 5, + "cooldownTicks": 14, + "context": { + "requiredClass": "mage" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "mage_route", + "type": "reach_location", + "label": "Visit spell study", + "target": 1, + "metadata": { + "pathname": "/study" + } + } + ], + "rewards": { + "gold": 220, + "skillPoints": 1 + } + }, + { + "id": "necro_harvest", + "title": "Necromancer Grave Harvest", + "description": "Collect unstable essences before they disperse.", + "category": "class", + "weight": 5, + "cooldownTicks": 14, + "context": { + "requiredClass": "necromancer" + }, + "expiresAfterTicks": 22, + "objectives": [ + { + "id": "necro_kills", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 5 + } + ], + "rewards": { + "gold": 320, + "reputation": 6 + } + }, + { + "id": "mentor_request", + "title": "Mentor's Request", + "description": "A former mentor asks you to clear a dangerous route.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredRelationshipState": "known" + }, + "expiresAfterTicks": 26, + "objectives": [ + { + "id": "mentor_task", + "type": "complete_dungeon", + "label": "Complete one dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 280, + "reputation": 8 + } + }, + { + "id": "elder_errand", + "title": "Elder's Last Errand", + "description": "An elder seeks closure through one final task.", + "category": "age", + "weight": 3, + "cooldownTicks": 26, + "context": { + "minAge": 55 + }, + "expiresAfterTicks": 28, + "objectives": [ + { + "id": "elder_dungeon", + "type": "complete_dungeon", + "label": "Complete one dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 500, + "reputation": 12, + "skillPoints": 1 + } + }, + { + "id": "youthful_glory", + "title": "Youthful Glory", + "description": "Prove your talent before your peers.", + "category": "age", + "weight": 4, + "cooldownTicks": 16, + "context": { + "maxAge": 24 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "quick_clear", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 4 + } + ], + "rewards": { + "gold": 190, + "reputation": 5 + } + }, + { + "id": "perfect_slayer", + "title": "Perfect Slayer", + "description": "Defeat a boss without suffering a single wound.", + "category": "challenge", + "weight": 2, + "cooldownTicks": 30, + "context": { + "minAge": 18 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "flawless_boss", + "type": "defeat_boss_no_damage", + "label": "Defeat one boss flawlessly", + "target": 1 + } + ], + "rewards": { + "gold": 700, + "skillPoints": 2, + "reputation": 12 + } + }, + { + "id": "guild_delivery", + "title": "Guild Courier", + "description": "Deliver sealed materials between key locations.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 18, + "context": { + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "deliver", + "type": "deliver_item", + "label": "Deliver guild package", + "target": 1 + } + ], + "rewards": { + "gold": 270, + "reputation": 6 + } + }, + { + "id": "escort_scholar", + "title": "Escort the Scholar", + "description": "A scholar needs safe passage through hostile territory. Clear a dungeon without fleeing to deliver them safely.", + "category": "combat", + "weight": 4, + "cooldownTicks": 20, + "context": { + "minAge": 16 + }, + "expiresAfterTicks": 26, + "objectives": [ + { + "id": "protect_scholar", + "type": "protect_npc", + "label": "Clear a dungeon while protecting the scholar", + "target": 1 + } + ], + "rewards": { + "gold": 320, + "reputation": 8, + "skillPoints": 1 + } + }, + { + "id": "training_contract", + "title": "Training Contract", + "description": "Clear sanctioned enemies for combat practice.", + "category": "combat", + "weight": 6, + "cooldownTicks": 10, + "context": { + "minAge": 14 + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "training_kills", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 3 + } + ], + "rewards": { + "gold": 140, + "skillPoints": 1 + } + }, + { + "id": "mend_the_rift", + "title": "Mend the Rift", + "description": "Your relationship with {partner} is strained. Patch things up before it's too late.", + "category": "relationship", + "weight": 6, + "cooldownTicks": 12, + "context": { + "minAge": 16, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "reconcile_affection", + "type": "reach_location", + "label": "Visit your partner to make amends", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 150, + "reputation": 10, + "skillPoints": 1 + } + }, + { + "id": "romantic_outing", + "title": "A Romantic Outing", + "description": "{partner} is feeling especially close. Plan a romantic evening to celebrate your bond.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 16, + "context": { + "minAge": 18, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "romantic_outing_visit", + "type": "reach_location", + "label": "Go on a romantic outing", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 200, + "reputation": 8 + } + }, + { + "id": "anniversary_celebration", + "title": "Anniversary Celebration", + "description": "You and {partner} have reached another anniversary. Celebrate together!", + "category": "relationship", + "weight": 4, + "cooldownTicks": 52, + "context": { + "minAge": 18, + "requiredRelationshipState": "has_united" + }, + "expiresAfterTicks": 12, + "objectives": [ + { + "id": "anniversary_date", + "type": "reach_location", + "label": "Celebrate your anniversary", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 350, + "reputation": 12, + "skillPoints": 1 + } + }, + { + "id": "child_first_dungeon", + "title": "First Adventure", + "description": "Your child {child} is ready for their first dungeon run. Guide them through a safe route.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 24, + "context": { + "minAge": 24, + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "child_dungeon_clear", + "type": "complete_dungeon", + "label": "Complete a dungeon with your child in mind", + "target": 1 + } + ], + "rewards": { + "gold": 300, + "reputation": 15 + } + }, + { + "id": "child_first_job", + "title": "First Job", + "description": "Your child {child} is ready to enter the workforce. Help them find a suitable position.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "minAge": 28, + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "child_job_visit", + "type": "reach_location", + "label": "Visit the labor board with your child", + "target": 1, + "metadata": { + "pathname": "/labor" + } + } + ], + "rewards": { + "gold": 250, + "reputation": 10 + } + }, + { + "id": "friend_request", + "title": "Friend in Need", + "description": "Your friend {friend} has called upon you for aid. They wouldn't ask unless it was important.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 16, + "context": { + "minAge": 16, + "requiredRelationshipState": "known" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "friend_dungeon_run", + "type": "complete_dungeon", + "label": "Clear a dungeon to help your friend", + "target": 1 + } + ], + "rewards": { + "gold": 280, + "reputation": 8 + } + }, + { + "id": "avenge_fallen_partner", + "title": "Vengeance", + "description": "Your beloved {fallen} has passed. Seek retribution against the dangers that took them.", + "category": "relationship", + "weight": 3, + "cooldownTicks": 0, + "context": { + "minAge": 18, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 30, + "objectives": [ + { + "id": "vengeance_kills", + "type": "kill_enemies", + "label": "Defeat enemies in memory of the fallen", + "target": 10 + } + ], + "rewards": { + "gold": 500, + "skillPoints": 2, + "reputation": 15 + } + }, + { + "id": "avenge_fallen_relative", + "title": "Honor the Departed", + "description": "Your {relation}, {fallen}, has passed. Honor their memory by proving your strength.", + "category": "relationship", + "weight": 3, + "cooldownTicks": 0, + "context": { + "minAge": 16, + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 30, + "objectives": [ + { + "id": "honor_complete_dungeon", + "type": "complete_dungeon", + "label": "Complete a dungeon in their honor", + "target": 1 + } + ], + "rewards": { + "gold": 400, + "reputation": 12, + "skillPoints": 1 + } + }, + { + "id": "move_forward", + "title": "Moving Forward", + "description": "After your recent separation, it's time to focus on yourself. Clear your mind with action.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "forward_kills", + "type": "kill_enemies", + "label": "Defeat enemies", + "target": 5 + } + ], + "rewards": { + "gold": 200, + "reputation": 6, + "skillPoints": 1 + } + }, + { + "id": "family_gathering", + "title": "Family Reunion", + "description": "It has been too long since the family was all together. Organize a gathering.", + "category": "relationship", + "weight": 3, + "cooldownTicks": 26, + "context": { + "minAge": 22, + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "family_visit", + "type": "reach_location", + "label": "Visit home for a family gathering", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 180, + "reputation": 10 + } + }, + { + "id": "goblin_raiders", + "title": "Goblin Raiders", + "description": "A goblin warband has been raiding the outskirts. Thin their numbers and clear their hideout.", + "category": "combat", + "weight": 5, + "cooldownTicks": 16, + "context": { + "minAge": 16, + "requiredKeyItem": "head of goblin shaman" + }, + "expiresAfterTicks": 26, + "objectives": [ + { + "id": "raider_kills", + "type": "kill_enemies", + "label": "Defeat goblin raiders", + "target": 5 + }, + { + "id": "raider_hideout", + "type": "complete_dungeon", + "label": "Clear the goblin hideout", + "target": 1 + } + ], + "rewards": { + "gold": 400, + "skillPoints": 1, + "reputation": 8 + } + }, + { + "id": "lost_heirloom", + "title": "The Lost Heirloom", + "description": "A family heirloom was stolen. Track down the thief and return the treasure.", + "category": "location", + "weight": 3, + "cooldownTicks": 22, + "context": { + "minAge": 16 + }, + "expiresAfterTicks": 28, + "objectives": [ + { + "id": "find_thief", + "type": "find_character", + "label": "Find the thief", + "target": 1 + }, + { + "id": "return_heirloom", + "type": "deliver_item", + "label": "Return the heirloom", + "target": 1 + } + ], + "rewards": { + "gold": 320, + "reputation": 10 + } + }, + { + "id": "teen_training", + "title": "Apprentice Combat Drills", + "description": "As a young apprentice, you must prove your mettle in controlled sparring sessions.", + "category": "age", + "weight": 4, + "cooldownTicks": 14, + "context": { + "requiredLifeStage": "teen" + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "teen_training_kills", + "type": "kill_enemies", + "label": "Defeat enemies in training", + "target": 3 + } + ], + "rewards": { + "gold": 120, + "skillPoints": 1, + "reputation": 3 + } + }, + { + "id": "elder_wisdom", + "title": "The Elder's Wisdom", + "description": "The village elder requests your presence. They have a vision that only a seasoned adventurer can fulfill.", + "category": "age", + "weight": 3, + "cooldownTicks": 28, + "context": { + "requiredLifeStage": "elder", + "requiredReputationTier": "notable" + }, + "expiresAfterTicks": 28, + "objectives": [ + { + "id": "elder_visit", + "type": "reach_location", + "label": "Visit the elder's dwelling", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 600, + "reputation": 15, + "skillPoints": 2 + } + }, + { + "id": "diplomatic_mission", + "title": "Diplomatic Dispatch", + "description": "Your reputation precedes you. Deliver a sealed treaty to the neighbouring settlement and ensure the route is secure.", + "category": "delivery", + "weight": 3, + "cooldownTicks": 24, + "context": { + "requiredReputationTier": "notable", + "minAge": 18 + }, + "expiresAfterTicks": 28, + "objectives": [ + { + "id": "dispatch_delivery", + "type": "deliver_item", + "label": "Deliver the treaty", + "target": 1 + }, + { + "id": "dispatch_escort", + "type": "complete_dungeon", + "label": "Secure the route through the pass", + "target": 1 + } + ], + "rewards": { + "gold": 500, + "reputation": 12, + "skillPoints": 1 + } + }, + { + "id": "bloom_date", + "title": "A Blooming Romance", + "description": "Your partner wants to spend a quiet day together while the {season} flowers are in bloom. Make time for them.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 18, + "context": { + "requiredRelationshipStage": "dating" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "bloom_date_visit", + "type": "reach_location", + "label": "Go on a seasonal date", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 160, + "reputation": 6, + "skillPoints": 1 + } + }, + { + "id": "recommitment", + "title": "The Recommitment", + "description": "After years together, you and {partner} feel called to reaffirm your vows. Plan a ceremony.", + "category": "relationship", + "weight": 3, + "cooldownTicks": 30, + "context": { + "requiredRelationshipStage": "united" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "recommit_visit", + "type": "reach_location", + "label": "Hold a recommitment ceremony", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 300, + "reputation": 14, + "skillPoints": 1 + } + }, + { + "id": "parental_guidance", + "title": "Parental Guidance", + "description": "Strange creatures have been spotted near your family's home. Clear the area to keep your children safe.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 22, + "context": { + "requiredLifeStage": "adult", + "requiredRelationshipState": "has_children" + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "parental_guidance_kills", + "type": "kill_enemies", + "label": "Defeat threats near home", + "target": 6 + }, + { + "id": "parental_guidance_dungeon", + "type": "complete_dungeon", + "label": "Secure the local dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 350, + "reputation": 12 + } + }, + { + "id": "frontier_scouting", + "title": "Frontier Scouting Mission", + "description": "Uncharted lands lie beyond the known routes. Scout the perimeter, clear resistance, and map a safe passage.", + "category": "location", + "weight": 3, + "cooldownTicks": 24, + "context": { + "minAge": 18 + }, + "expiresAfterTicks": 30, + "objectives": [ + { + "id": "scout_outpost", + "type": "reach_location", + "label": "Reach the forward outpost", + "target": 1, + "metadata": { + "pathname": "/dungeon" + } + }, + { + "id": "scout_kills", + "type": "kill_enemies", + "label": "Clear resistance along the path", + "target": 4 + }, + { + "id": "scout_dungeon", + "type": "complete_dungeon", + "label": "Map the final passage", + "target": 1 + } + ], + "rewards": { + "gold": 480, + "reputation": 10, + "skillPoints": 1 + } + }, + { + "id": "legendary_contract", + "title": "The Legendary Contract", + "description": "A world-ending threat stirs in the depths. Only a hero of legendary standing can hope to vanquish it.", + "category": "challenge", + "weight": 2, + "cooldownTicks": 36, + "context": { + "requiredReputationTier": "famous", + "minAge": 18, + "requiredKeyItem": "the black ledger" + }, + "expiresAfterTicks": 32, + "objectives": [ + { + "id": "legendary_kills", + "type": "kill_enemies", + "label": "Defeat the dark horde", + "target": 10 + }, + { + "id": "legendary_dungeon", + "type": "complete_dungeon", + "label": "Conquer the final lair", + "target": 1 + } + ], + "rewards": { + "gold": 1000, + "skillPoints": 3, + "reputation": 25 + } + }, + { + "id": "winter_frost_beast_bounty", + "title": "Frost Beast Bounty", + "description": "Frost-touched beasts have been terrorizing the northern villages. Hunt them down and claim the bounty.", + "category": "combat", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "winter", + "minAge": 16 + }, + "expiresAfterTicks": 22, + "objectives": [ + { + "id": "frost_beast_kills", + "type": "kill_enemies", + "label": "Defeat frost beasts", + "target": 5 + } + ], + "rewards": { + "gold": 350, + "skillPoints": 1, + "reputation": 6 + }, + "metadata": { + "seasonExclusive": true + } + }, + { + "id": "winter_festival_prep", + "title": "Winter Festival Preparations", + "description": "The annual winter solstice festival needs volunteers. Help decorate and prepare the venue.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 24, + "context": { + "requiredSeason": "winter", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "festival_prep_visit", + "type": "reach_location", + "label": "Visit the festival grounds", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 200, + "reputation": 8 + } + }, + { + "id": "winter_frozen_dungeon", + "title": "The Frozen Depths", + "description": "An ancient dungeon has been exposed by winter ice melt. Explore its frozen corridors.", + "category": "location", + "weight": 3, + "cooldownTicks": 22, + "context": { + "requiredSeason": "winter", + "minAge": 18 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "frozen_dungeon_clear", + "type": "complete_dungeon", + "label": "Clear the frozen dungeon", + "target": 1 + } + ], + "rewards": { + "gold": 400, + "skillPoints": 1, + "reputation": 7 + } + }, + { + "id": "winter_mage_frost_study", + "title": "Frost Magic Research", + "description": "Winter's chill amplifies frost magic. Study ice enchantments at the northern glacier.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "winter", + "requiredClass": "mage" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "frost_study_visit", + "type": "reach_location", + "label": "Visit the glacier study site", + "target": 1, + "metadata": { + "pathname": "/study" + } + } + ], + "rewards": { + "gold": 260, + "skillPoints": 2 + } + }, + { + "id": "winter_ranger_snow_track", + "title": "Snow Trail Survey", + "description": "Track winter wildlife across the snow-covered highlands and report any threats.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "winter", + "requiredClass": "ranger" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "snow_track_kills", + "type": "kill_enemies", + "label": "Eliminate threats on the trail", + "target": 4 + } + ], + "rewards": { + "gold": 290, + "skillPoints": 1, + "reputation": 5 + } + }, + { + "id": "winter_paladin_holy_vigil", + "title": "Winter Holy Vigil", + "description": "Stand guard at the frozen shrine during the solstice to keep dark forces at bay.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "winter", + "requiredClass": "paladin" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "holy_vigil_clear", + "type": "complete_dungeon", + "label": "Defend the frozen shrine", + "target": 1 + } + ], + "rewards": { + "gold": 310, + "reputation": 10 + } + }, + { + "id": "winter_necro_frost_essence", + "title": "Frost Essence Collection", + "description": "Collect frost-bound spirits from the frozen graveyard before they dissipate.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "winter", + "requiredClass": "necromancer" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "frost_essence_kills", + "type": "kill_enemies", + "label": "Defeat frost spirits", + "target": 5 + } + ], + "rewards": { + "gold": 330, + "skillPoints": 1, + "reputation": 6 + } + }, + { + "id": "winter_firewood_delivery", + "title": "Firewood Delivery", + "description": "The orphanage needs firewood before the deep freeze. Deliver a supply from the timber yard.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "winter", + "minAge": 14 + }, + "expiresAfterTicks": 14, + "objectives": [ + { + "id": "firewood_deliver", + "type": "deliver_item", + "label": "Deliver firewood", + "target": 1 + } + ], + "rewards": { + "gold": 220, + "reputation": 5 + } + }, + { + "id": "winter_sleigh_romance", + "title": "A Winter Sleigh Ride", + "description": "{partner} has been asking about a sleigh ride under the winter stars. Make it happen.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "winter", + "minAge": 18, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "sleigh_ride_visit", + "type": "reach_location", + "label": "Go on a sleigh ride", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 180, + "reputation": 7, + "skillPoints": 1 + } + }, + { + "id": "winter_border_patrol", + "title": "Winter Border Patrol", + "description": "Reinforcements are needed at the northern border fort during the harsh winter siege.", + "category": "combat", + "weight": 4, + "cooldownTicks": 22, + "context": { + "requiredSeason": "winter", + "minAge": 18 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "border_kills", + "type": "kill_enemies", + "label": "Defeat border raiders", + "target": 6 + }, + { + "id": "border_dungeon", + "type": "complete_dungeon", + "label": "Secure the border outpost", + "target": 1 + } + ], + "rewards": { + "gold": 420, + "reputation": 9, + "skillPoints": 1 + } + }, + { + "id": "winter_speed_challenge", + "title": "Winter Speed Challenge", + "description": "Clear three dungeons before the winter solstice ends. Prove your speed in the cold.", + "category": "challenge", + "weight": 3, + "cooldownTicks": 28, + "context": { + "requiredSeason": "winter", + "minAge": 18 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "winter_speed_dungeons", + "type": "complete_dungeon", + "label": "Complete dungeons before winter ends", + "target": 3 + } + ], + "rewards": { + "gold": 500, + "skillPoints": 2, + "reputation": 10 + } + }, + { + "id": "winter_ice_fishing", + "title": "Ice Fishing Expedition", + "description": "The lake has frozen over. Find the rare ice trout for the village chef's winter stew.", + "category": "location", + "weight": 3, + "cooldownTicks": 16, + "context": { + "requiredSeason": "winter", + "minAge": 12 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "ice_fish_find", + "type": "find_character", + "label": "Find the ice fishing spot", + "target": 1 + } + ], + "rewards": { + "gold": 150, + "reputation": 3 + } + }, + { + "id": "spring_seed_delivery", + "title": "Seed Delivery Run", + "description": "Farmers need their spring seeds delivered before the first planting. Get them there on time.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "spring", + "minAge": 14 + }, + "expiresAfterTicks": 14, + "objectives": [ + { + "id": "seed_deliver", + "type": "deliver_item", + "label": "Deliver seeds to farmers", + "target": 1 + } + ], + "rewards": { + "gold": 200, + "reputation": 5 + } + }, + { + "id": "spring_festival_gathering", + "title": "Spring Festival Gathering", + "description": "The spring equinox festival brings everyone together. Help organize the celebrations.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 24, + "context": { + "requiredSeason": "spring", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "spring_festival_visit", + "type": "reach_location", + "label": "Visit the spring festival", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 180, + "reputation": 7 + } + }, + { + "id": "spring_blooming_dungeon", + "title": "The Blooming Caverns", + "description": "Spring rains have opened a new cavern system filled with rare herbs and lurking dangers.", + "category": "location", + "weight": 3, + "cooldownTicks": 22, + "context": { + "requiredSeason": "spring", + "minAge": 16 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "blooming_dungeon_clear", + "type": "complete_dungeon", + "label": "Clear the blooming caverns", + "target": 1 + } + ], + "rewards": { + "gold": 370, + "skillPoints": 1, + "reputation": 6 + } + }, + { + "id": "spring_mage_bloom_study", + "title": "Spring Bloom Research", + "description": "Study the magical properties of spring flora at the enchanted garden.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "spring", + "requiredClass": "mage" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "bloom_study_visit", + "type": "reach_location", + "label": "Visit the enchanted garden", + "target": 1, + "metadata": { + "pathname": "/study" + } + } + ], + "rewards": { + "gold": 240, + "skillPoints": 2 + } + }, + { + "id": "spring_ranger_spring_track", + "title": "Spring Trail Survey", + "description": "Survey the newly thawed trails for wildlife migration patterns and threats.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "spring", + "requiredClass": "ranger" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "spring_track_kills", + "type": "kill_enemies", + "label": "Eliminate threats on the trail", + "target": 4 + } + ], + "rewards": { + "gold": 270, + "skillPoints": 1, + "reputation": 5 + } + }, + { + "id": "spring_paladin_renewal", + "title": "Spring Renewal Rite", + "description": "Perform the spring renewal rite at the sacred grove to bless the coming harvest.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "spring", + "requiredClass": "paladin" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "renewal_clear", + "type": "complete_dungeon", + "label": "Purify the sacred grove", + "target": 1 + } + ], + "rewards": { + "gold": 290, + "reputation": 9 + } + }, + { + "id": "spring_necro_earth_essence", + "title": "Earth Essence Gathering", + "description": "Spring's renewal stirs ancient spirits in the soil. Collect their essences before they settle.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "spring", + "requiredClass": "necromancer" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "earth_essence_kills", + "type": "kill_enemies", + "label": "Defeat earth spirits", + "target": 5 + } + ], + "rewards": { + "gold": 310, + "skillPoints": 1, + "reputation": 5 + } + }, + { + "id": "spring_pest_extermination", + "title": "Pest Extermination", + "description": "Giant spring insects have overrun the eastern fields. Clear them out for the farmers.", + "category": "combat", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "spring", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "pest_kills", + "type": "kill_enemies", + "label": "Defeat giant insects", + "target": 6 + } + ], + "rewards": { + "gold": 230, + "reputation": 4 + } + }, + { + "id": "spring_romantic_walk", + "title": "A Spring Walk", + "description": "{partner} wants to take a walk through the spring blossoms. Spend a quiet day together.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "spring", + "minAge": 16, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "spring_walk_visit", + "type": "reach_location", + "label": "Take a walk in the blossoms", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 160, + "reputation": 6, + "skillPoints": 1 + } + }, + { + "id": "spring_water_delivery", + "title": "Spring Water Delivery", + "description": "The monastery needs pure spring water delivered from the mountain source.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 18, + "context": { + "requiredSeason": "spring", + "minAge": 16 + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "water_deliver", + "type": "deliver_item", + "label": "Deliver spring water", + "target": 1 + } + ], + "rewards": { + "gold": 210, + "reputation": 5 + } + }, + { + "id": "spring_speed_challenge", + "title": "Spring Growth Challenge", + "description": "Clear two dungeons and deliver supplies before spring ends. Show what you can do.", + "category": "challenge", + "weight": 3, + "cooldownTicks": 28, + "context": { + "requiredSeason": "spring", + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "spring_speed_dungeons", + "type": "complete_dungeon", + "label": "Complete dungeons before spring ends", + "target": 2 + }, + { + "id": "spring_speed_deliver", + "type": "deliver_item", + "label": "Deliver spring supplies", + "target": 1 + } + ], + "rewards": { + "gold": 450, + "skillPoints": 2, + "reputation": 8 + } + }, + { + "id": "spring_river_fishing", + "title": "Spring Fishing Trip", + "description": "The rivers are running high. Find the best fishing spot and catch dinner for the inn.", + "category": "location", + "weight": 3, + "cooldownTicks": 16, + "context": { + "requiredSeason": "spring", + "minAge": 12 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "spring_fish_find", + "type": "find_character", + "label": "Find the fishing spot", + "target": 1 + } + ], + "rewards": { + "gold": 140, + "reputation": 3 + } + }, + { + "id": "summer_supply_run", + "title": "Summer Supply Run", + "description": "The coastal outpost needs provisions delivered before the heat wave peaks.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "summer", + "minAge": 16 + }, + "expiresAfterTicks": 14, + "objectives": [ + { + "id": "summer_supply_deliver", + "type": "deliver_item", + "label": "Deliver provisions", + "target": 1 + } + ], + "rewards": { + "gold": 260, + "reputation": 5 + } + }, + { + "id": "summer_festival", + "title": "Summer Sun Festival", + "description": "The midsummer sun festival is the highlight of the season. Help set up the celebrations.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 24, + "context": { + "requiredSeason": "summer", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "summer_festival_visit", + "type": "reach_location", + "label": "Visit the sun festival", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 190, + "reputation": 7 + } + }, + { + "id": "summer_desert_dungeon", + "title": "Desert Ruins Expedition", + "description": "Ancient ruins have been uncovered by summer heat. Explore the desert tomb.", + "category": "location", + "weight": 3, + "cooldownTicks": 22, + "context": { + "requiredSeason": "summer", + "minAge": 18 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "desert_dungeon_clear", + "type": "complete_dungeon", + "label": "Clear the desert ruins", + "target": 1 + } + ], + "rewards": { + "gold": 410, + "skillPoints": 1, + "reputation": 7 + } + }, + { + "id": "summer_mage_heat_study", + "title": "Solar Magic Research", + "description": "Summer's peak amplifies solar magic. Study fire enchantments at the sun temple.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "summer", + "requiredClass": "mage" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "heat_study_visit", + "type": "reach_location", + "label": "Visit the sun temple", + "target": 1, + "metadata": { + "pathname": "/study" + } + } + ], + "rewards": { + "gold": 270, + "skillPoints": 2 + } + }, + { + "id": "summer_ranger_desert_track", + "title": "Desert Trail Survey", + "description": "Track desert creatures and scout safe passages through the scorching wastes.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "summer", + "requiredClass": "ranger" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "desert_track_kills", + "type": "kill_enemies", + "label": "Eliminate desert threats", + "target": 5 + } + ], + "rewards": { + "gold": 300, + "skillPoints": 1, + "reputation": 5 + } + }, + { + "id": "summer_paladin_sun_vigil", + "title": "Midsummer Sun Vigil", + "description": "Stand guard at the sun altar during midsummer to prevent shadow incursions.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "summer", + "requiredClass": "paladin" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "sun_vigil_clear", + "type": "complete_dungeon", + "label": "Defend the sun altar", + "target": 1 + } + ], + "rewards": { + "gold": 320, + "reputation": 10 + } + }, + { + "id": "summer_necro_soul_essence", + "title": "Soul Essence Harvest", + "description": "Summer's energy stirs restless souls. Collect their essences from the sun-baked graveyard.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "summer", + "requiredClass": "necromancer" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "soul_essence_kills", + "type": "kill_enemies", + "label": "Defeat restless souls", + "target": 5 + } + ], + "rewards": { + "gold": 340, + "skillPoints": 1, + "reputation": 6 + } + }, + { + "id": "summer_bandit_patrol", + "title": "Summer Bandit Patrol", + "description": "Bandits are bolder in summer heat. Patrol the trade roads and thin their numbers.", + "category": "combat", + "weight": 4, + "cooldownTicks": 18, + "context": { + "requiredSeason": "summer", + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "bandit_kills", + "type": "kill_enemies", + "label": "Defeat bandits", + "target": 5 + }, + { + "id": "bandit_dungeon", + "type": "complete_dungeon", + "label": "Clear the bandit camp", + "target": 1 + } + ], + "rewards": { + "gold": 380, + "reputation": 7, + "skillPoints": 1 + } + }, + { + "id": "summer_romantic_beach", + "title": "A Beach Evening", + "description": "{partner} wants to spend a summer evening by the shore. Pack a picnic and go.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "summer", + "minAge": 16, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "beach_visit", + "type": "reach_location", + "label": "Visit the beach", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 170, + "reputation": 6, + "skillPoints": 1 + } + }, + { + "id": "summer_water_delivery", + "title": "Cool Water Delivery", + "description": "The heat wave has dried up wells. Deliver cool water to the southern villages.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "summer", + "minAge": 14 + }, + "expiresAfterTicks": 14, + "objectives": [ + { + "id": "cool_water_deliver", + "type": "deliver_item", + "label": "Deliver water", + "target": 1 + } + ], + "rewards": { + "gold": 230, + "reputation": 5 + } + }, + { + "id": "summer_speed_challenge", + "title": "Summer Scorch Challenge", + "description": "Clear three dungeons under the blazing sun. Only the fastest survive.", + "category": "challenge", + "weight": 3, + "cooldownTicks": 28, + "context": { + "requiredSeason": "summer", + "minAge": 18 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "summer_speed_dungeons", + "type": "complete_dungeon", + "label": "Complete dungeons before summer ends", + "target": 3 + } + ], + "rewards": { + "gold": 520, + "skillPoints": 2, + "reputation": 10 + } + }, + { + "id": "summer_lake_fishing", + "title": "Lake Fishing Trip", + "description": "The summer lake is full of game. Find the perfect spot and catch the biggest fish.", + "category": "location", + "weight": 3, + "cooldownTicks": 16, + "context": { + "requiredSeason": "summer", + "minAge": 12 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "lake_fish_find", + "type": "find_character", + "label": "Find the fishing spot", + "target": 1 + } + ], + "rewards": { + "gold": 130, + "reputation": 3 + } + }, + { + "id": "autumn_harvest_delivery", + "title": "Harvest Delivery", + "description": "Transport the autumn harvest to the granary before the first frost arrives.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 16, + "context": { + "requiredSeason": "autumn", + "minAge": 14 + }, + "expiresAfterTicks": 14, + "objectives": [ + { + "id": "harvest_deliver", + "type": "deliver_item", + "label": "Deliver harvest goods", + "target": 1 + } + ], + "rewards": { + "gold": 240, + "reputation": 5 + } + }, + { + "id": "autumn_festival", + "title": "Harvest Festival", + "description": "The autumn harvest festival celebrates the season's bounty. Help organize the festivities.", + "category": "relationship", + "weight": 5, + "cooldownTicks": 24, + "context": { + "requiredSeason": "autumn", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "autumn_festival_visit", + "type": "reach_location", + "label": "Visit the harvest festival", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 190, + "reputation": 7 + } + }, + { + "id": "autumn_forgotten_dungeon", + "title": "The Forgotten Crypt", + "description": "Fallen leaves have revealed the entrance to an old crypt. Explore what lies within.", + "category": "location", + "weight": 3, + "cooldownTicks": 22, + "context": { + "requiredSeason": "autumn", + "minAge": 18 + }, + "expiresAfterTicks": 24, + "objectives": [ + { + "id": "forgotten_dungeon_clear", + "type": "complete_dungeon", + "label": "Clear the forgotten crypt", + "target": 1 + } + ], + "rewards": { + "gold": 390, + "skillPoints": 1, + "reputation": 7 + } + }, + { + "id": "autumn_mage_leaf_study", + "title": "Autumn Enchantment Study", + "description": "Study the transmutation properties of autumn leaves at the old oak grove.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "requiredClass": "mage" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "leaf_study_visit", + "type": "reach_location", + "label": "Visit the oak grove", + "target": 1, + "metadata": { + "pathname": "/study" + } + } + ], + "rewards": { + "gold": 250, + "skillPoints": 2 + } + }, + { + "id": "autumn_ranger_harvest_track", + "title": "Harvest Trail Watch", + "description": "Watch the forest trails for predators drawn by the autumn harvest.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "requiredClass": "ranger" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "harvest_track_kills", + "type": "kill_enemies", + "label": "Eliminate forest predators", + "target": 4 + } + ], + "rewards": { + "gold": 280, + "skillPoints": 1, + "reputation": 5 + } + }, + { + "id": "autumn_paladin_autumn_vigil", + "title": "Autumn Equinox Vigil", + "description": "Guard the equinox shrine as the balance between light and dark shifts.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "requiredClass": "paladin" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "autumn_vigil_clear", + "type": "complete_dungeon", + "label": "Defend the equinox shrine", + "target": 1 + } + ], + "rewards": { + "gold": 300, + "reputation": 9 + } + }, + { + "id": "autumn_necro_harvest_essence", + "title": "Harvest Essence Collection", + "description": "Autumn's end draws spirits to the surface. Collect their essences from the blighted fields.", + "category": "class", + "weight": 5, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "requiredClass": "necromancer" + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "harvest_essence_kills", + "type": "kill_enemies", + "label": "Defeat autumn spirits", + "target": 5 + } + ], + "rewards": { + "gold": 320, + "skillPoints": 1, + "reputation": 6 + } + }, + { + "id": "autumn_wolf_hunt", + "title": "Autumn Wolf Hunt", + "description": "A wolf pack has been raiding livestock. Track and eliminate the alpha.", + "category": "combat", + "weight": 4, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "wolf_kills", + "type": "kill_enemies", + "label": "Defeat wolves", + "target": 5 + }, + { + "id": "wolf_dungeon", + "type": "complete_dungeon", + "label": "Clear the wolf den", + "target": 1 + } + ], + "rewards": { + "gold": 370, + "reputation": 7, + "skillPoints": 1 + } + }, + { + "id": "autumn_romantic_leaves", + "title": "A Walk Among Leaves", + "description": "{partner} wants to enjoy the autumn foliage together. Take a walk through the golden woods.", + "category": "relationship", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "autumn", + "minAge": 16, + "requiredRelationshipState": "has_partner" + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "leaves_visit", + "type": "reach_location", + "label": "Walk through the autumn woods", + "target": 1, + "metadata": { + "pathname": "/activities" + } + } + ], + "rewards": { + "gold": 170, + "reputation": 6, + "skillPoints": 1 + } + }, + { + "id": "autumn_grain_transport", + "title": "Grain Transport", + "description": "The last grain haul needs to reach the city before the roads close for winter.", + "category": "delivery", + "weight": 4, + "cooldownTicks": 18, + "context": { + "requiredSeason": "autumn", + "minAge": 16 + }, + "expiresAfterTicks": 16, + "objectives": [ + { + "id": "grain_deliver", + "type": "deliver_item", + "label": "Deliver grain to the city", + "target": 1 + } + ], + "rewards": { + "gold": 250, + "reputation": 5 + } + }, + { + "id": "autumn_speed_challenge", + "title": "Autumn Rush Challenge", + "description": "Complete two dungeons and a delivery before autumn ends. The clock is ticking.", + "category": "challenge", + "weight": 3, + "cooldownTicks": 28, + "context": { + "requiredSeason": "autumn", + "minAge": 16 + }, + "expiresAfterTicks": 20, + "objectives": [ + { + "id": "autumn_speed_dungeons", + "type": "complete_dungeon", + "label": "Complete dungeons before autumn ends", + "target": 2 + }, + { + "id": "autumn_speed_deliver", + "type": "deliver_item", + "label": "Deliver autumn supplies", + "target": 1 + } + ], + "rewards": { + "gold": 460, + "skillPoints": 2, + "reputation": 8 + } + }, + { + "id": "autumn_forest_exploration", + "title": "Autumn Forest Exploration", + "description": "The autumn forest holds secrets beneath its canopy. Find the hidden grove the elders speak of.", + "category": "location", + "weight": 3, + "cooldownTicks": 16, + "context": { + "requiredSeason": "autumn", + "minAge": 14 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "forest_find", + "type": "find_character", + "label": "Find the hidden grove", + "target": 1 + } + ], + "rewards": { + "gold": 160, + "reputation": 4 + } + }, + { + "id": "winter_arena_challenge", + "title": "Winter Arena Challenge", + "description": "Prove your combat prowess in the frozen arena during the winter tournament.", + "category": "challenge", + "weight": 3, + "cooldownTicks": 20, + "context": { + "requiredSeason": "winter", + "minAge": 16 + }, + "expiresAfterTicks": 18, + "objectives": [ + { + "id": "winter_arena_wins", + "type": "arena_wins", + "label": "Win arena matches", + "target": 2 + } + ], + "rewards": { + "gold": 300, + "skillPoints": 1, + "reputation": 6 + } + }, + { + "id": "spring_escort_spring_villager", + "title": "Spring Escort Mission", + "description": "A villager needs safe passage through the newly thawed marshes. Protect them on their journey.", + "category": "combat", + "weight": 4, + "cooldownTicks": 20, + "context": { + "requiredSeason": "spring", + "minAge": 16 + }, + "expiresAfterTicks": 22, + "objectives": [ + { + "id": "spring_protect_npc", + "type": "protect_npc", + "label": "Protect the villager through the marshes", + "target": 1 + } + ], + "rewards": { + "gold": 340, + "reputation": 7, + "skillPoints": 1 + } + } +] diff --git a/src/server/api/routers/lineage/json-service.ts b/src/server/api/routers/lineage/json-service.ts index e6fdb03..0b8ffbe 100644 --- a/src/server/api/routers/lineage/json-service.ts +++ b/src/server/api/routers/lineage/json-service.ts @@ -51,91 +51,98 @@ import healthOptions from "~/lineage-json/misc-route/healthOptions.json"; import sanityOptions from "~/lineage-json/misc-route/sanityOptions.json"; import pvpRewards from "~/lineage-json/misc-route/pvpRewards.json"; +import questTemplates from "~/lineage-json/quest-event-route/questTemplates.json"; +import childhoodEvents from "~/lineage-json/quest-event-route/childhoodEvents.json"; +import overworldEvents from "~/lineage-json/quest-event-route/overworldEvents.json"; + export const lineageJsonServiceRouter = createTRPCRouter({ - attacks: publicProcedure - .query(() => { - return { - ok: true, - playerAttacks, - mageBooks, - mageSpells, - necroBooks, - necroSpells, - rangerBooks, - rangerSpells, - paladinBooks, - paladinSpells, - summons - }; - }), + attacks: publicProcedure.query(() => { + return { + ok: true, + playerAttacks, + mageBooks, + mageSpells, + necroBooks, + necroSpells, + rangerBooks, + rangerSpells, + paladinBooks, + paladinSpells, + summons + }; + }), - conditions: publicProcedure - .query(() => { - return { - ok: true, - conditions, - debilitations, - sanityDebuffs - }; - }), + conditions: publicProcedure.query(() => { + return { + ok: true, + conditions, + debilitations, + sanityDebuffs + }; + }), - dungeons: publicProcedure - .query(() => { - return { - ok: true, - dungeons, - specialEncounters - }; - }), + dungeons: publicProcedure.query(() => { + return { + ok: true, + dungeons, + specialEncounters + }; + }), - enemies: publicProcedure - .query(() => { - return { - ok: true, - bosses, - enemies, - enemyAttacks - }; - }), + enemies: publicProcedure.query(() => { + return { + ok: true, + bosses, + enemies, + enemyAttacks + }; + }), - items: publicProcedure - .query(() => { - return { - ok: true, - arrows, - bows, - foci, - hats, - junk, - melee, - robes, - wands, - ingredients, - storyItems, - artifacts, - shields, - bodyArmor, - helmets, - suffix, - prefix, - potions, - poison, - staves - }; - }), + items: publicProcedure.query(() => { + return { + ok: true, + arrows, + bows, + foci, + hats, + junk, + melee, + robes, + wands, + ingredients, + storyItems, + artifacts, + shields, + bodyArmor, + helmets, + suffix, + prefix, + potions, + poison, + staves + }; + }), - misc: publicProcedure - .query(() => { - return { - ok: true, - activities, - investments, - jobs, - manaOptions, - otherOptions, - healthOptions, - sanityOptions, - pvpRewards - }; - }) + misc: publicProcedure.query(() => { + return { + ok: true, + activities, + investments, + jobs, + manaOptions, + otherOptions, + healthOptions, + sanityOptions, + pvpRewards + }; + }), + + quest_events: publicProcedure.query(() => { + return { + ok: true, + questTemplates, + childhoodEvents, + overworldEvents + }; + }) });