mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Random event gold ranges (€20-250) were authored against an earlier economy and have been near-trivial against current per-action haul values (thousands at higher tiers). Scaled the GoldMin/GoldMax across all event entries by 100× so the rewards feel like real moments instead of rounding errors. Pure flavor-table numeric rebalance — no logic changes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
855 lines
42 KiB
Go
855 lines
42 KiB
Go
package plugin
|
|
|
|
// ── RANDOM MID-DAY EVENTS ─────────────────────────────────────────────────────
|
|
//
|
|
// Trigger chance: 0.5% per player per day, checked at a random time
|
|
// between 10:00 and 16:00 UTC.
|
|
// Player has 2 hours to reply !adventure respond.
|
|
// No response: event expires silently, no penalty, no reward.
|
|
// Response: OutcomeDM sent, reward applied, one-liner posted to room.
|
|
|
|
// AdvRandomEvent defines a single mid-day event with trigger/outcome text and rewards.
|
|
type AdvRandomEvent struct {
|
|
Key string
|
|
TriggerDM string
|
|
TriggerRoomLine string
|
|
OutcomeDM string
|
|
OutcomeRoomLine string
|
|
GoldMin int64
|
|
GoldMax int64
|
|
XP int
|
|
XPSkill string // "combat", "mining", "foraging", or "" for activity-based
|
|
Activity string // "any" | "dungeon" | "mining" | "foraging"
|
|
}
|
|
|
|
var advRandomEvents = []AdvRandomEvent{
|
|
|
|
// ── FOOD & BODILY CONSEQUENCES ────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "roast_chicken_wall",
|
|
TriggerDM: "While picking at a crumbling wall for no reason you can adequately explain, " +
|
|
"you find a roast chicken.\n\n" +
|
|
"It has been in there a while. How long is unclear. " +
|
|
"The colour is wrong. The smell is wrong. " +
|
|
"A part of your brain is screaming at you and another part is already eating it.\n\n" +
|
|
"You eat it. All of it. You lick your fingers.\n\n" +
|
|
"Twenty minutes later your stomach has filed a formal complaint " +
|
|
"that is escalating rapidly through your entire body.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} found something in a wall and ate it. This is developing.",
|
|
OutcomeDM: "Instead of holding it like an idiot — which is exactly what you would have done — " +
|
|
"you drop trow and handle your situation in the nearest available ditch.\n\n" +
|
|
"There is a person in the ditch.\n\n" +
|
|
"The person immediately stands, climbing out of the ditch toward you, " +
|
|
"covered in the consequences of your recent dietary decision. " +
|
|
"You notice the name on their uniform: S. Kelly.\n\n" +
|
|
"S. Kelly does not confront you. S. Kelly makes a sound. " +
|
|
"An excited sound. Reaches into a pocket and throws a damp wad of bills at your feet.\n\n" +
|
|
"You pick them up. You make eye contact with S. Kelly one final time. " +
|
|
"You leave at pace.\n\n" +
|
|
"Some questions are better left unasked. You have €{gold}.\n\n" +
|
|
"S. Kelly watches you go.",
|
|
OutcomeRoomLine: "✅ {name} handled the situation. S. Kelly was involved. Nobody is elaborating.",
|
|
GoldMin: 3500,
|
|
GoldMax: 8000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "burning_house",
|
|
TriggerDM: "There is a house on fire.\n\n" +
|
|
"You run in.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has run into a burning building.",
|
|
OutcomeDM: "There is nobody inside.\n\n" +
|
|
"There was never anyone inside. You are an idiot who ran into a burning building " +
|
|
"for no reason that holds up to scrutiny.\n\n" +
|
|
"What IS inside is a truly remarkable amount of unsecured valuables " +
|
|
"belonging to someone who left in a hurry. " +
|
|
"You fill your pockets. A beam falls nearby. " +
|
|
"You fill your pockets faster. Another beam falls. " +
|
|
"You make a mental note about the beams and immediately forget it " +
|
|
"because your pockets are full.\n\n" +
|
|
"You emerge from the building on fire, briefly, " +
|
|
"which a neighbour extinguishes with a bucket they were apparently already holding.\n\n" +
|
|
"They applaud. They assume you saved someone. " +
|
|
"You accept this.\n\n" +
|
|
"€{gold}. You are on fire slightly less than before.",
|
|
OutcomeRoomLine: "✅ {name} ran into a burning building. Nobody was inside. {name} was briefly on fire.",
|
|
GoldMin: 8000,
|
|
GoldMax: 20000,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "bandit_carriage",
|
|
TriggerDM: "You come across a band of bandits robbing a carriage.\n\n" +
|
|
"There are four of them. They are large. " +
|
|
"The carriage owner is inside with the curtains drawn.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has spotted a bandit ambush and is deciding what kind of person they are.",
|
|
OutcomeDM: "You dash over and immediately confront the bandits. " +
|
|
"You point at them and proclaim that if they resist, " +
|
|
"you will be forced to inflict great pain upon them.\n\n" +
|
|
"They stomp the ever-loving shit out of you.\n\n" +
|
|
"All four. In sequence and then simultaneously. " +
|
|
"Your armor absorbs the first two hits and then stops absorbing. " +
|
|
"You are making sounds you have not made since childhood.\n\n" +
|
|
"The carriage door opens. The owner steps out with an auto-crossbow " +
|
|
"and dispatches all four in approximately eight seconds.\n\n" +
|
|
"The owner walks over to you on the ground and says, calmly, " +
|
|
"that they could have stepped out considerably earlier. " +
|
|
"They say the sight of you getting the stuffing knocked out of you " +
|
|
"was honestly the most entertainment they'd had in weeks. " +
|
|
"They press €{gold} into your hand and return to the carriage, " +
|
|
"already mimicking the high-pitched yelps you made as each blow landed.\n\n" +
|
|
"You walk away. The owner is still laughing. " +
|
|
"You can hear it for quite some time.",
|
|
OutcomeRoomLine: "✅ {name} confronted four bandits. The carriage owner let it play out for a while first.",
|
|
GoldMin: 12000,
|
|
GoldMax: 25000,
|
|
XP: 25,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "mystery_stew",
|
|
TriggerDM: "A stranger shoves a bowl of stew into your hands and walks away.\n\n" +
|
|
"The stew is hot. The stranger is gone. " +
|
|
"You are standing in the street holding someone else's dinner.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A stranger gave {name} a bowl of stew and immediately left.",
|
|
OutcomeDM: "You eat the stew.\n\n" +
|
|
"It is the best thing you have ever eaten. Not 'best thing today.' Best thing. Ever. " +
|
|
"You stand holding the empty bowl for a full minute just thinking about it.\n\n" +
|
|
"Then you feel incredible. Not good. Incredible. " +
|
|
"Like someone has gone into your settings and fixed something you didn't know was broken.\n\n" +
|
|
"You turn the bowl over. €{gold} taped to the bottom.\n\n" +
|
|
"You will think about this stew for the rest of your life. " +
|
|
"You will never find the stranger. " +
|
|
"This is fine. Some things are better as open wounds.",
|
|
OutcomeRoomLine: "✅ {name} ate the stew. {name} will not be discussing the stew.",
|
|
GoldMin: 2000,
|
|
GoldMax: 5000,
|
|
XP: 15,
|
|
Activity: "any",
|
|
},
|
|
|
|
// ── CRIME & MORAL FLEXIBILITY ─────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "drunk_merchant",
|
|
TriggerDM: "A merchant is asleep at their stall. Aggressively asleep. " +
|
|
"The kind that follows a serious lunch.\n\n" +
|
|
"Their coin purse is on the counter. Three feet away. Unattended.\n\n" +
|
|
"The merchant snores.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has found an unattended coin purse. A moral crossroads.",
|
|
OutcomeDM: "You take the coin purse.\n\n" +
|
|
"You were never not going to take the coin purse.\n\n" +
|
|
"Inside: €{gold}, a very small portrait of someone's dog, " +
|
|
"and a note that says 'DO NOT LOSE THIS.' " +
|
|
"You pocket the money. You leave the note on the counter as a courtesy. " +
|
|
"You leave the portrait because you are not a monster.\n\n" +
|
|
"The merchant snores.\n\n" +
|
|
"You walk away. The merchant wakes up three hours later " +
|
|
"with a note that says DO NOT LOSE THIS " +
|
|
"and no memory of what it referred to.\n\n" +
|
|
"This haunts them. Good.",
|
|
OutcomeRoomLine: "✅ {name} made a financial decision at the market. The merchant will be confused later.",
|
|
GoldMin: 4000,
|
|
GoldMax: 12000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "wrongful_arrest",
|
|
TriggerDM: "A guard grabs you by the collar. " +
|
|
"You match the description of someone who robbed a bakery this morning.\n\n" +
|
|
"You did not rob a bakery this morning. " +
|
|
"You were somewhere significantly worse, which is a different problem.\n\n" +
|
|
"The guard is waiting.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A guard has {name} by the collar. Bakery robbery. {name} has an alibi of sorts.",
|
|
OutcomeDM: "You explain where you actually were this morning in considerable detail.\n\n" +
|
|
"The guard listens with the expression of someone who cannot determine " +
|
|
"whether a dungeon is a better alibi than a bakery robbery. " +
|
|
"They're still deciding when a runner arrives: actual robber caught three streets over.\n\n" +
|
|
"The guard releases you. You ask about compensation.\n\n" +
|
|
"A long pause. The guard produces a voucher for a free loaf " +
|
|
"from the robbed bakery, which they apparently issue to witnesses as goodwill. " +
|
|
"You go to the bakery. You sell the loaf you bought before knowing about the voucher for €{gold}.\n\n" +
|
|
"The justice system has, in its way, provided.",
|
|
OutcomeRoomLine: "✅ {name} was detained and compensated with bread. The system works, loosely.",
|
|
GoldMin: 2500,
|
|
GoldMax: 6000,
|
|
XP: 5,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "tax_refund",
|
|
TriggerDM: "A tax collector approaches you with a ledger and an apologetic expression.\n\n" +
|
|
"The city has been over-collecting from you for several years. " +
|
|
"There is a refund.\n\n" +
|
|
"You have never paid city taxes. Not once. Not ever.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A tax collector has found {name} in a ledger. A refund is being discussed.",
|
|
OutcomeDM: "You accept the refund.\n\n" +
|
|
"You nod seriously while the amount is calculated. " +
|
|
"You say 'that sounds about right' in the tone of someone " +
|
|
"who has been thinking about this number for years. " +
|
|
"You sign the form. The collector apologises on behalf of the city.\n\n" +
|
|
"€{gold} is counted into your hand.\n\n" +
|
|
"Somewhere in the city, someone who actually paid those taxes " +
|
|
"is still waiting on their refund.\n\n" +
|
|
"Not your problem.",
|
|
OutcomeRoomLine: "✅ {name} accepted a refund for taxes they never paid. The city apologised.",
|
|
GoldMin: 10000,
|
|
GoldMax: 25000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "pickpocket_reversed",
|
|
TriggerDM: "Someone has just tried to pick your pocket.\n\n" +
|
|
"You felt it. They're still standing right next to you, " +
|
|
"hand inside your coat, making eye contact and smiling " +
|
|
"with the frozen confidence of someone whose plan has not fully resolved.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ Someone is in {name}'s pocket. Both parties are aware of this.",
|
|
OutcomeDM: "You look down at the hand. You look up at the person. " +
|
|
"The person looks at you. A long moment.\n\n" +
|
|
"You pick their pocket.\n\n" +
|
|
"While they are processing what just happened, " +
|
|
"while the hand is still technically inside your coat, " +
|
|
"you reach into their jacket and remove their wallet " +
|
|
"with the smooth efficiency of someone who has spent considerable time in dungeons " +
|
|
"and has a working relationship with fast decisions.\n\n" +
|
|
"The pickpocket looks at their own empty pocket. Looks at you. " +
|
|
"Has the expression of someone revising a career.\n\n" +
|
|
"You hand them back their own wallet, minus €{gold} for the inconvenience, " +
|
|
"and walk away while they work through the sequence of events.\n\n" +
|
|
"They do not follow you. They sit down on the nearest step " +
|
|
"and think about their choices. Good.",
|
|
OutcomeRoomLine: "✅ {name} was pickpocketed and immediately pickpocketed back. Net outcome: positive.",
|
|
GoldMin: 3000,
|
|
GoldMax: 8500,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
// ── WILDLIFE ─────────────────────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "runaway_pig",
|
|
TriggerDM: "A pig is running directly at you at a speed pigs should not be capable of.\n\n" +
|
|
"It is large. It has committed to its direction. You are in its direction.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} is in the path of a large fast pig.",
|
|
OutcomeDM: "You sidestep the pig at the last possible moment.\n\n" +
|
|
"The pig continues. You hear it round a corner. " +
|
|
"Then shouting. Then nothing. You choose not to investigate.\n\n" +
|
|
"A farmer arrives thirty seconds later, completely out of breath, " +
|
|
"and asks which way. You point. The farmer presses coins into your hand " +
|
|
"without breaking stride.\n\n" +
|
|
"You stood in a road and moved slightly to the left. €{gold}.\n\n" +
|
|
"The shouting was bad. " +
|
|
"You do not ask what happened to the pig.",
|
|
OutcomeRoomLine: "✅ {name} avoided the pig and was paid for it. The pig's status is unknown.",
|
|
GoldMin: 1500,
|
|
GoldMax: 4000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "suspicious_crow",
|
|
TriggerDM: "A crow has been following you for twenty minutes.\n\n" +
|
|
"Not flying past. Following. Fence to fence, tree to tree, " +
|
|
"making sustained eye contact every time you check.\n\n" +
|
|
"You have checked six times.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A crow is following {name}. Sustained eye contact has been established.",
|
|
OutcomeDM: "You stop and face the crow.\n\n" +
|
|
"It lands in front of you and drops a ring from its beak. " +
|
|
"Silver. Engraved with initials you don't recognise. " +
|
|
"Dropped with the deliberate energy of something being returned.\n\n" +
|
|
"The crow watches you pick it up. Then it leaves. " +
|
|
"Just flies away. Done. No further communication.\n\n" +
|
|
"You stand in the road holding a ring a crow gave you.\n\n" +
|
|
"A jeweller gives you €{gold} and asks no questions.\n\n" +
|
|
"You do not ask questions either.\n\n" +
|
|
"On the way home you see the crow drop a ring at someone else's feet.\n\n" +
|
|
"The crow looks up at you. Brief eye contact.\n\n" +
|
|
"The crow looks away. Business as usual.",
|
|
OutcomeRoomLine: "✅ The crow gave {name} a ring and left. It gives everyone rings. Questions: none.",
|
|
GoldMin: 5000,
|
|
GoldMax: 11000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "horse_standoff",
|
|
TriggerDM: "A horse is standing in the middle of the road and will not move.\n\n" +
|
|
"Not startled. Not lost. Just standing there with the settled energy " +
|
|
"of something that has made a decision and is at peace with it. " +
|
|
"A queue of people on both sides. Nobody doing anything.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A horse is blocking the road. {name} is the nearest person with any credentials.",
|
|
OutcomeDM: "You approach the horse.\n\n" +
|
|
"The horse looks at you. You say something — more of a tone than words. " +
|
|
"The horse considers this and then steps aside.\n\n" +
|
|
"The crowd applauds. A merchant whose cargo has been stuck forty minutes " +
|
|
"presses €{gold} into your hand.\n\n" +
|
|
"You do not know what you said to the horse. " +
|
|
"You walk away before anyone asks you to try.\n\n" +
|
|
"Behind you, someone else approaches the horse with great confidence.\n\n" +
|
|
"The horse bites them immediately.\n\n" +
|
|
"You do not look back.",
|
|
OutcomeRoomLine: "✅ {name} said something to a horse and it worked. The next person was bitten immediately. {name} cannot explain this.",
|
|
GoldMin: 2000,
|
|
GoldMax: 5500,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "cat_with_something",
|
|
TriggerDM: "A cat has dropped something at your feet and is sitting back " +
|
|
"looking at you with the expectant energy of a cat that has done its part " +
|
|
"and is waiting for you to do yours.\n\n" +
|
|
"The something is small and wrapped in cloth " +
|
|
"and the cat is not going to explain itself.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A cat has left something at {name}'s feet and is waiting.",
|
|
OutcomeDM: "You pick up the cloth and unwrap it.\n\n" +
|
|
"A key. Old. Specific. The kind that opens one thing " +
|
|
"and that one thing is somewhere.\n\n" +
|
|
"You spend an hour finding what the key opens. " +
|
|
"The cat follows you the entire time, maintaining three feet of distance, " +
|
|
"watching with total composure.\n\n" +
|
|
"The key opens a small lockbox behind a loose brick " +
|
|
"in a wall the cat led you to by sitting in front of it and waiting.\n\n" +
|
|
"Inside: €{gold} and a note that says 'good cat.'\n\n" +
|
|
"The cat has already left when you look up. " +
|
|
"The note was for the cat. " +
|
|
"The money was apparently for you. " +
|
|
"You do not understand any part of this and you never will.",
|
|
OutcomeRoomLine: "✅ A cat led {name} to a lockbox. The note inside was for the cat. The money was for {name}.",
|
|
GoldMin: 4500,
|
|
GoldMax: 10000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
// ── PEOPLE & SOCIAL DISASTERS ─────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "funeral_wrong_procession",
|
|
TriggerDM: "You have accidentally joined a funeral procession.\n\n" +
|
|
"You don't know how. One moment you were walking, " +
|
|
"the next you were part of a slow column of mourners " +
|
|
"and everyone assumed you belonged " +
|
|
"and you didn't correct anyone " +
|
|
"and now the church is very close.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has accidentally joined a funeral. The church is very close.",
|
|
OutcomeDM: "You attend the entire funeral.\n\n" +
|
|
"An hour and forty minutes. Third pew. You accept a memorial card " +
|
|
"for one Roderick Hannaway, beloved, " +
|
|
"and fold it carefully into a pocket.\n\n" +
|
|
"At the reception a woman assumes you were a business colleague " +
|
|
"and spends twenty minutes telling you what a genuinely difficult man Roderick was. " +
|
|
"She cries twice. You hand her a napkin both times " +
|
|
"because the napkins are right there and it would be weird not to.\n\n" +
|
|
"She presses €{gold} into your hand and says Roderick would have wanted you to have it.\n\n" +
|
|
"Based on everything you've heard today, " +
|
|
"Roderick would have wanted no such thing. " +
|
|
"Roderick sounds like he was awful. " +
|
|
"You have his money now. " +
|
|
"Karma is imprecise but directionally sound.",
|
|
OutcomeRoomLine: "✅ {name} attended Roderick Hannaway's funeral uninvited. Roderick was difficult. {name} has the money.",
|
|
GoldMin: 6000,
|
|
GoldMax: 13000,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "bar_fight_aftermath",
|
|
TriggerDM: "The bar fight is over.\n\n" +
|
|
"You weren't in it. You were at a corner table minding your business " +
|
|
"when it erupted and now it's done and there are people on the floor " +
|
|
"in various states of consciousness and the barkeep is looking at everyone " +
|
|
"like they're all someone else's problem.\n\n" +
|
|
"You look at the people on the floor.\n\n" +
|
|
"You look at your medical kit.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A bar fight has concluded near {name}. {name} has a medical kit and is looking at it.",
|
|
OutcomeDM: "You open the medical kit and get to work.\n\n" +
|
|
"You also get out your pricing chart.\n\n" +
|
|
"The first one is a large man with a broken nose. " +
|
|
"Standard rate. You patch him up, he pays, he leaves without making eye contact.\n\n" +
|
|
"The second is a woman who is, frankly, very attractive, " +
|
|
"which means she has had it easy her entire life " +
|
|
"and can afford to have it slightly less easy right now. " +
|
|
"You charge her triple. She pays it. You feel nothing about this.\n\n" +
|
|
"The third is a child.\n\n" +
|
|
"A sweet child. A small child with enormous eyes " +
|
|
"who had absolutely no business being in a bar during a bar fight " +
|
|
"and has a gash on their forehead that needs cleaning.\n\n" +
|
|
"You look at the child with sympathetic eyes.\n\n" +
|
|
"You charge the child the most of all.\n\n" +
|
|
"'This,' you say, cleaning the wound with practiced efficiency, " +
|
|
"'is what happens when you meddle in grown folks' business.'\n\n" +
|
|
"The parent shows up and pays you while glaring at you the entire time. " +
|
|
"In fact the whole room is staring daggers at you " +
|
|
"but you don't mind at all.\n\n" +
|
|
"You smile and wave back at them as you count your money " +
|
|
"while continuing on your way.\n\n" +
|
|
"Friends made today: -20.\n" +
|
|
"Money made today: €{gold}. A whole lot.",
|
|
OutcomeRoomLine: "✅ {name} treated the bar fight wounded on a sliding scale. The child paid the most. Friends made: -20.",
|
|
GoldMin: 8500,
|
|
GoldMax: 19000,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "duel_wrong_person",
|
|
TriggerDM: "Someone has challenged you to a duel.\n\n" +
|
|
"Wrong person. Wrong name. Wrong grievance. " +
|
|
"The passion with which they're delivering the challenge " +
|
|
"suggests this has been building for a long time " +
|
|
"in someone else's direction.\n\n" +
|
|
"There is a crowd. They are waiting for your response.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has been challenged to a duel. Wrong person. {name} hasn't clarified this.",
|
|
OutcomeDM: "You accept.\n\n" +
|
|
"Correcting the situation now feels impossible. " +
|
|
"There is a crowd. A duelling ground. A ritual. " +
|
|
"You go through all of it.\n\n" +
|
|
"Your opponent is very good. Specifically trained, " +
|
|
"for years probably, for a fight against a person who is not you.\n\n" +
|
|
"Halfway through the duel they stop, squint at you, " +
|
|
"and say slowly that you are not who they thought.\n\n" +
|
|
"A long silence.\n\n" +
|
|
"They sheathe their weapon. Press €{gold} into your hand " +
|
|
"as 'compensation for the inconvenience' and leave at speed.\n\n" +
|
|
"The crowd disperses. You stand on the duelling ground alone " +
|
|
"wondering who they were actually looking for " +
|
|
"and whether that person knows what's coming.\n\n" +
|
|
"They don't know. They will find out. " +
|
|
"That is not your problem.",
|
|
OutcomeRoomLine: "✅ {name} accepted a duel meant for someone else. Error discovered mid-duel. Compensation paid.",
|
|
GoldMin: 8000,
|
|
GoldMax: 17000,
|
|
XP: 30,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "wrong_house_dinner",
|
|
TriggerDM: "You have walked into the wrong house.\n\n" +
|
|
"The door was open. You thought it was somewhere else. " +
|
|
"It is very much not somewhere else.\n\n" +
|
|
"There is a family eating dinner. " +
|
|
"They are looking at you. " +
|
|
"You are looking at them.\n\n" +
|
|
"Nobody has said anything yet.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} is standing in a stranger's home. Dinner is in progress. Nobody has spoken.",
|
|
OutcomeDM: "You sit down.\n\n" +
|
|
"There is an empty chair and your body uses it " +
|
|
"before your brain can propose an alternative.\n\n" +
|
|
"The family, after a moment, continues dinner.\n\n" +
|
|
"They serve you a plate. The food is excellent. " +
|
|
"Nobody explains the empty chair. You don't ask. " +
|
|
"Conversation happens around you the way weather happens — " +
|
|
"you're present without being the cause of it.\n\n" +
|
|
"The eldest person at the table gives you €{gold} at the end " +
|
|
"and says 'for the road' and shows you out.\n\n" +
|
|
"On the way out you notice a painting on the wall.\n\n" +
|
|
"It is a painting of you.\n\n" +
|
|
"Not someone who looks like you. You.\n\n" +
|
|
"The door closes before you can say anything.\n\n" +
|
|
"You stand on the step for a moment.\n\n" +
|
|
"You walk home.",
|
|
OutcomeRoomLine: "✅ {name} sat at a stranger's dinner table. Was served. Was paid. The chair was waiting.",
|
|
GoldMin: 3000,
|
|
GoldMax: 8000,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "street_prophet",
|
|
TriggerDM: "A street prophet has stopped their sermon to point at you.\n\n" +
|
|
"The crowd is looking at you. The prophet is describing a prophecy " +
|
|
"that is clearly about you — your description, your general situation, " +
|
|
"several accurate details that are uncomfortably specific.\n\n" +
|
|
"The prophet is waiting.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ A street prophet has identified {name} in a prophecy. The crowd is watching.",
|
|
OutcomeDM: "You step forward.\n\n" +
|
|
"The prophet delivers the rest of it directly to you, " +
|
|
"in detail, for eleven minutes. A great task. A difficult road. " +
|
|
"A door that 'will know you when you find it.'\n\n" +
|
|
"You have no idea what door. You go through a lot of doors. " +
|
|
"One of them is apparently significant " +
|
|
"and you will not recognise the moment when it happens.\n\n" +
|
|
"The crowd donates €{gold} to you afterward, " +
|
|
"unprompted, as if this is simply what you do when someone is in a prophecy.\n\n" +
|
|
"You walk away with money and a prophecy you don't understand " +
|
|
"and the distinct feeling that something is now your problem " +
|
|
"that wasn't your problem this morning.\n\n" +
|
|
"Behind you the prophet points at someone else in the crowd " +
|
|
"and begins describing a new prophecy with the same specific details. " +
|
|
"Your description. Your equipment. Your general situation.\n\n" +
|
|
"The prophet makes eye contact with you briefly.\n\n" +
|
|
"The prophet looks away.",
|
|
OutcomeRoomLine: "✅ {name} is in a prophecy. A door will know them. Nobody can say which door.",
|
|
GoldMin: 5000,
|
|
GoldMax: 11000,
|
|
XP: 20,
|
|
Activity: "any",
|
|
},
|
|
|
|
// ── FOUND OBJECTS ─────────────────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "mysterious_clock",
|
|
TriggerDM: "There is a package on your doorstep.\n\n" +
|
|
"Your name on it, spelled correctly. " +
|
|
"No return address. " +
|
|
"A small but definite amount of ticking.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has received an anonymous package. It is ticking.",
|
|
OutcomeDM: "You open it.\n\n" +
|
|
"A clock. Small, ornate, running accurately. " +
|
|
"A note: 'Sorry about the clock. Keep it. — T'\n\n" +
|
|
"You don't know anyone whose name starts with T.\n\n" +
|
|
"You sell it to a jeweller immediately " +
|
|
"because a clock that arrives with a preemptive apology " +
|
|
"is not a clock you want in your home.\n\n" +
|
|
"€{gold}. The jeweller asks no questions.\n\n" +
|
|
"You are half a street away when the explosion happens.\n\n" +
|
|
"You turn around.\n\n" +
|
|
"The jeweller is standing in the smoking doorway, " +
|
|
"entirely unharmed, holding something aloft, " +
|
|
"screaming at the top of their lungs.\n\n" +
|
|
"'I'm rich! I'm rich! " +
|
|
"Fuck all of you dirty bitches because I'm stinking wealthy!'\n\n" +
|
|
"Congratulations. " +
|
|
"That explosion would have probably had your ears ringing for a bit. " +
|
|
"Whew.",
|
|
OutcomeRoomLine: "✅ {name} received a clock and an apology from T. Both have been processed.",
|
|
GoldMin: 5500,
|
|
GoldMax: 12000,
|
|
XP: 0,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "well_box",
|
|
TriggerDM: "There is something shining at the bottom of a well.\n\n" +
|
|
"The bucket is right there.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} is looking at something shining at the bottom of a well.",
|
|
OutcomeDM: "You go in.\n\n" +
|
|
"Not in the bucket — the bucket wouldn't hold you — " +
|
|
"but using the rope and the wall and a technique you invent on the way down " +
|
|
"that works better than it has any right to.\n\n" +
|
|
"At the bottom: an ornate box. Waterlogged. Locked. Heavy.\n\n" +
|
|
"You get it in the bucket and climb back out, " +
|
|
"which is harder than going down in the specific way " +
|
|
"that makes you hate yourself for not planning this.\n\n" +
|
|
"The box contains €{gold} in old currency and a letter.\n\n" +
|
|
"You read the letter.\n\n" +
|
|
"You read it again.\n\n" +
|
|
"You drop it into a different well.\n\n" +
|
|
"The money is yours. " +
|
|
"The letter is the other well's problem. " +
|
|
"You are not thinking about the letter.",
|
|
OutcomeRoomLine: "✅ {name} went into a well. Came out. The letter has been re-disposed of in a different well.",
|
|
GoldMin: 9000,
|
|
GoldMax: 21000,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "treasure_map",
|
|
TriggerDM: "Someone has pressed a piece of paper into your hand and walked away very fast.\n\n" +
|
|
"It is old. There are markings. There is an X.\n\n" +
|
|
"There is always an X.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has been given a piece of paper by someone who left immediately.",
|
|
OutcomeDM: "You follow the map.\n\n" +
|
|
"It leads, through three wrong turns and one moment of genuine doubt " +
|
|
"about your entire direction in life, " +
|
|
"to a loose flagstone in an unremarkable courtyard.\n\n" +
|
|
"Under the flagstone: a tin. Inside the tin: €{gold} " +
|
|
"and a note that says TELL NO ONE.\n\n" +
|
|
"You replace the flagstone. You pocket the money.\n\n" +
|
|
"You are telling everyone.",
|
|
OutcomeRoomLine: "✅ {name} followed the X. It worked. {name} has been asked to tell no one.",
|
|
GoldMin: 7000,
|
|
GoldMax: 16000,
|
|
XP: 5,
|
|
Activity: "any",
|
|
},
|
|
|
|
// ── ACTIVITY-SPECIFIC ─────────────────────────────────────────────────────
|
|
|
|
{
|
|
Key: "dungeon_staff_entrance",
|
|
TriggerDM: "You've found a back entrance to a dungeon.\n\n" +
|
|
"A side door. Half-hidden. " +
|
|
"The kind that exists because someone who worked here " +
|
|
"wanted a way in that the front-door things didn't know about.\n\n" +
|
|
"It's open.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has found an unmarked open door in a dungeon.",
|
|
OutcomeDM: "You go in.\n\n" +
|
|
"Staff area. A schedule in a language you don't read. " +
|
|
"A considerable amount of food the monsters keep back here. " +
|
|
"Three goblins on break who look up at you.\n\n" +
|
|
"Under the table: a strongbox the goblins were clearly not supposed to be near.\n\n" +
|
|
"You take the strongbox. You take some of the food. " +
|
|
"The goblins watch and say nothing, " +
|
|
"possibly because you've caught them somewhere they're not supposed to be " +
|
|
"and the situation is mutually awkward for everyone.\n\n" +
|
|
"You make eye contact with each goblin in turn. " +
|
|
"A tacit agreement is reached. " +
|
|
"You leave. The goblins file a complaint with management.\n\n" +
|
|
"Management investigates and finds nothing useful.\n\n" +
|
|
"Management is one of the goblins.\n\n" +
|
|
"The goblins know exactly what happened.\n\n" +
|
|
"The lock has already been changed.\n\n" +
|
|
"€{gold}. The food was decent.",
|
|
OutcomeRoomLine: "✅ {name} found the dungeon staff area. The goblins were on break. An agreement was reached.",
|
|
GoldMin: 8000,
|
|
GoldMax: 18000,
|
|
XP: 20,
|
|
XPSkill: "combat",
|
|
Activity: "dungeon",
|
|
},
|
|
|
|
{
|
|
Key: "surface_ore",
|
|
TriggerDM: "There is ore sitting on the ground.\n\n" +
|
|
"Not in a mine. Not behind anything. " +
|
|
"Just on the ground, in the open. " +
|
|
"Several people have walked past it.\n\n" +
|
|
"You don't know why nobody has taken it.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has found ore on the ground. Nobody has taken it. {name} is suspicious.",
|
|
OutcomeDM: "You pick it up.\n\n" +
|
|
"Nothing happens.\n\n" +
|
|
"No one objects. No one appears. " +
|
|
"The ground doesn't care. " +
|
|
"The ore is just ore that was on the ground " +
|
|
"and is now in your pocket.\n\n" +
|
|
"You sell it for €{gold}.\n\n" +
|
|
"The people who walked past it will think about this for the rest of the day. " +
|
|
"Some of them will still be thinking about it next week.\n\n" +
|
|
"You will not be thinking about it. " +
|
|
"€{gold} has a clarifying effect on the mind.",
|
|
OutcomeRoomLine: "✅ {name} picked up free ore off the ground. Nothing happened. €{gold}.",
|
|
GoldMin: 2000,
|
|
GoldMax: 6500,
|
|
XP: 5,
|
|
XPSkill: "mining",
|
|
Activity: "mining",
|
|
},
|
|
|
|
{
|
|
Key: "unusual_plant",
|
|
TriggerDM: "You've spotted a plant you've never seen before.\n\n" +
|
|
"It's doing something. Not moving — present in a way regular plants aren't. " +
|
|
"It's not on any foraging chart you've seen.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has found an unidentified plant that is present in an unusual way.",
|
|
OutcomeDM: "You take a cutting.\n\n" +
|
|
"A small piece. Just enough. " +
|
|
"The plant doesn't react. " +
|
|
"You're not certain what a reaction would look like " +
|
|
"and you don't push your luck.\n\n" +
|
|
"A herbalist in town goes very still when you show it to them. " +
|
|
"The kind of still that means they know exactly what it is " +
|
|
"and are working very hard not to show you that they know.\n\n" +
|
|
"They buy it for €{gold} with the focused calm " +
|
|
"of someone containing a significant emotion.\n\n" +
|
|
"You don't ask what it is. " +
|
|
"Whatever you just sold, the foraging skill has decided it counts.",
|
|
OutcomeRoomLine: "✅ {name} sold an unidentified plant to a herbalist who was very controlled about wanting it.",
|
|
GoldMin: 6000,
|
|
GoldMax: 14000,
|
|
XP: 25,
|
|
XPSkill: "foraging",
|
|
Activity: "foraging",
|
|
},
|
|
|
|
{
|
|
Key: "army_enlistment",
|
|
TriggerDM: "A company is giving away free clothing.\n\n" +
|
|
"You can see the table from here. Nice stuff too — " +
|
|
"proper fabric, clean lines, nothing corroded or held together by optimism. " +
|
|
"An actual upgrade over what you're currently wearing, " +
|
|
"which the game has already described at length and does not need to describe again.\n\n" +
|
|
"You get in line.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has spotted a free clothing giveaway and is getting in line.",
|
|
OutcomeDM: "You wait your turn. You get to the front. " +
|
|
"They hand you a very nice set of clothing that costs you absolutely nothing.\n\n" +
|
|
"You are shuffled into a changing room.\n\n" +
|
|
"You emerge from the changing room onto a battlefield.\n\n" +
|
|
"This was not a clothing giveaway. " +
|
|
"This was an army enlistment event. " +
|
|
"Your reading ability, never your strongest attribute, " +
|
|
"has failed you at a meaningful moment.\n\n" +
|
|
"You are assigned to the Commanding General's meat shield group. " +
|
|
"The arrangement is explained to you clearly: " +
|
|
"stand in front of the General with your shield raised, " +
|
|
"keep the General alive, receive 20,000 gold per day. " +
|
|
"This is, mathematically, an excellent rate of pay.\n\n" +
|
|
"You stand tall on the battlefield. Shield raised. General behind you. " +
|
|
"The others in your group doing the same. " +
|
|
"You are, for the first time in your life, part of something larger than yourself.\n\n" +
|
|
"You notice a shiny button on the ground.\n\n" +
|
|
"You bend over to pick it up.\n\n" +
|
|
"The arrow that would have been stopped by your shield " +
|
|
"strikes the Commanding General in the head, killing him instantly.\n\n" +
|
|
"You are discharged from the army on the spot. " +
|
|
"No gold. No commendation. No acknowledgement that you were " +
|
|
"technically doing your job correctly right up until the button.\n\n" +
|
|
"You do have a shiny button and €{gold} in back-pay for the twelve minutes you were technically enlisted.\n\n" +
|
|
"Huzzah.",
|
|
OutcomeRoomLine: "✅ {name} accidentally enlisted in an army and immediately got the General killed. Has a button and €{gold}.",
|
|
GoldMin: 800,
|
|
GoldMax: 2200,
|
|
XP: 5,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "tower_bird",
|
|
TriggerDM: "There is a tall abandoned lookout tower nearby.\n\n" +
|
|
"If you climbed it, you could survey the surrounding area. " +
|
|
"Tactically useful. Good information. A sound decision.\n\n" +
|
|
"It's time to do this like a professional.\n\n" +
|
|
"Let's climb this ridiculously tall and abandoned lookout tower that is in extreme stages of disrepair. " +
|
|
"The view from up there could be very enlightening!\n\n" +
|
|
"The tower sways slightly in the wind from down here.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has decided to climb an abandoned tower that is visibly swaying.",
|
|
OutcomeDM: "The tower sways violently back and forth as you climb. " +
|
|
"Each gust is a conversation between the wind and the structural integrity " +
|
|
"of something that has been abandoned for good reason.\n\n" +
|
|
"After what seemed like ages — but thanks to the miracles of narrative " +
|
|
"storytelling was just the next sentence for us — " +
|
|
"you reach the top.\n\n" +
|
|
"Before you can survey anything, something catches your eye. " +
|
|
"Something sparkly. Inside a bird's nest.\n\n" +
|
|
"A treasure, perhaps.\n\n" +
|
|
"From the size of the nest, even a half-wit could tell " +
|
|
"this is no bird to be trifled with. " +
|
|
"Thankfully, you are not the average half-wit, " +
|
|
"and you proceed to dig through the nest.\n\n" +
|
|
"You find what you're seeking because it cuts you. " +
|
|
"A worthless piece of broken glass. " +
|
|
"You yank your hand back in pain, knocking something out of the nest " +
|
|
"that makes a sound like an egg shattering.\n\n" +
|
|
"It was an egg.\n\n" +
|
|
"As luck would have it, mum is right about to arrive home.\n\n" +
|
|
"A miracle occurs: you finally understand the situation you are in " +
|
|
"and make haste down the ladder. " +
|
|
"The bird lands on top of the tower. " +
|
|
"For one brief moment you breathe a sigh of relief.\n\n" +
|
|
"The bird looks down.\n\n" +
|
|
"The bird begins descending.\n\n" +
|
|
"You put up what few would consider an effective counterattack. " +
|
|
"You are knocked off the ladder.\n\n" +
|
|
"Down and down and down.\n\n" +
|
|
"Splat.\n\n" +
|
|
"You are not dead.\n\n" +
|
|
"As luck would have it, you have landed on an enormous and moist pile of manure. " +
|
|
"The bits on the very top are still warm. " +
|
|
"You turn to see a farmer walking away with a shovel. " +
|
|
"Must be fresh.\n\n" +
|
|
"As you dig yourself out you notice something stuck in your hand. " +
|
|
"A claw. A beautiful one, from that very large and very angry bird. " +
|
|
"This ought to sell for a decent amount.\n\n" +
|
|
"Mission accomplished.",
|
|
OutcomeRoomLine: "✅ {name} climbed a tower, broke an egg, got knocked off the ladder, and landed in manure. Has a claw.",
|
|
GoldMin: 4500,
|
|
GoldMax: 9500,
|
|
XP: 10,
|
|
Activity: "any",
|
|
},
|
|
|
|
{
|
|
Key: "monkey_coin",
|
|
TriggerDM: "You're walking home from the market.\n\n" +
|
|
"You were so unsuccessful at haggling that you ended up " +
|
|
"paying more than list price for your items, " +
|
|
"which is an achievement in the wrong direction.\n\n" +
|
|
"As you make your way home, you spot a monkey.\n\n" +
|
|
"Ordinarily, most sensible folks would question what a monkey " +
|
|
"is doing out here, whether it escaped from somewhere, " +
|
|
"what the implications are.\n\n" +
|
|
"You are fixated on what's in its hand.\n\n" +
|
|
"A shiny gold coin.\n\n" +
|
|
"Reply `!adventure respond` within 2 hours.",
|
|
TriggerRoomLine: "⚡ {name} has spotted a monkey with a gold coin and is devising a plan.",
|
|
OutcomeDM: "What's a monkey doing with a gold coin? " +
|
|
"It doesn't need it. You'll use your superior wits to outsmart it " +
|
|
"and claim that coin for yourself.\n\n" +
|
|
"You devise an ingenious plan.\n\n" +
|
|
"You'll toss an interesting-looking rock at it and it'll grab the rock instead, " +
|
|
"leaving the gold coin behind. And why not? " +
|
|
"This stupid monkey will only care that the rock is way bigger than the coin.\n\n" +
|
|
"After a few moments you finally stop congratulating yourself " +
|
|
"long enough to put the plan into action.\n\n" +
|
|
"You gently toss the rock towards the monkey.\n\n" +
|
|
"Eureka.\n\n" +
|
|
"The monkey drops the coin exactly as planned and runs for the rock. " +
|
|
"You hurry over and snatch up the coin. " +
|
|
"You are about to perform your god awful victory dance " +
|
|
"when something clocks you in the back of the head " +
|
|
"causing you to drop your groceries.\n\n" +
|
|
"Instead of turning around to confront your assailant " +
|
|
"you focus on picking up the groceries, " +
|
|
"as getting smacked in the head is a common occurrence for you " +
|
|
"and the groceries are not.\n\n" +
|
|
"You finally get yourself together and look up.\n\n" +
|
|
"The monkey is holding the gold coin and your bananas.\n\n" +
|
|
"It laughs.\n\n" +
|
|
"It tosses you the coin out of pity and scurries away.\n\n" +
|
|
"You did it.\n\n" +
|
|
"Congratulations.",
|
|
OutcomeRoomLine: "✅ {name} outsmarted a monkey. The monkey took the bananas and gave back the coin out of pity.",
|
|
GoldMin: 100,
|
|
GoldMax: 100,
|
|
XP: 40,
|
|
Activity: "any",
|
|
},
|
|
}
|
|
|
|
// ── FORMAT CONSTANTS ──────────────────────────────────────────────────────────
|
|
|
|
const advEventRoomTriggerWrapper = "{trigger_room_line}\n" +
|
|
"They have 2 hours to respond with `!adventure respond`."
|
|
|
|
const advEventRoomOutcomeWrapper = "{outcome_room_line}\n" +
|
|
"(+€{gold}{xp_suffix})"
|