Files
gogobee/internal/plugin/adventure_flavor_twinbee.go
prosolis 41adfce9f1 Expedition autopilot Phase 4 + rogue sneak attack + TwinBee voice sweep
Tedium-removal pass driven by live play feedback. Three big threads:

Expedition autopilot Phase 4 — background auto-run + harvest-until-dry:
- New expeditionAutoRunTicker walks active expeditions every 15min
  (5min tick, per-expedition CAS on new last_autorun_at column). Skips
  combat sessions, briefing/recap quiet windows, expeditions <30min old.
- Walks up to 3 rooms/tick with compact narration; suppresses DMs when
  0 rooms walked or just hitting the per-tick cap (no "stretch complete"
  filler). Player only hears from the bot when a real decision is needed.
- Compact mode: one-line combat narration for trash/elite, auto-resolves
  elite doorways via the forward-sim engine (boss still pauses). Threaded
  via new advanceOnceWithOpts → resolveRoom → resolveCombatRoom.
- Auto-harvest now grinds each Common/Uncommon node until dry (cap at 8
  attempts/visit), mirroring manual !scavenge retries. Rare+ still pauses.
- Ambient ticker: anti-repeat by Kind via new last_ambient_kind column
  (avoids two pack_rat DMs in a row when the pool only has 6 lines).
- !expedition go <n> now routes to the fork-choice handler when active +
  numeric; fork footer rewritten to suggest !expedition go instead of
  !zone go. Boss/Elite doorway: formatNextRoomMessage routes the action
  hint by next room type and autopilot loop breaks via new nextRoomType
  field so "Room X/Y — Boss" doesn't double-print with contradictory
  hints (!zone advance vs !fight).
- runAutopilotWalk extracted from expeditionCmdRun so foreground and
  background share the loop body.

Rogue Sneak Attack actually exists now:
- Audit found the rogue's "Sneak Attack" passive was AutoCritFirst +
  5% damage rider. No Nd6, ever. Phase 2 Monte Carlo masked this
  with a small flat buff; the class's defining mechanic never matched
  its tooltip or 5e identity.
- Added SneakAttackDie int to CombatModifiers, per-hit Nd6 in
  combat_primitives.go (same lane as DivineStrikePerHit). Scales with
  level: 1d6 at L1-2 ... 4d6 at L7-8 ... capped at 10d6 at L19-20.
- AutoCritFirst + 5% rider retained as bonuses on top of working sneak
  attack — preserves the opener-burst feel.
- L7 rogue expected per-hit ~8 → ~22 damage. Valdris fight math goes
  from "16 rounds to kill, die in 8" to winnable.

TwinBee voice sweep (Phase B3):
- ~530 line changes across 24 files replacing third-person "TwinBee
  notes/files/tracks/respects/..." constructions with first-person
  inside flavor string literals. Code identifiers (TwinBeeLine,
  twinBeeLine, etc.), chat-prefix labels (🎭 **TwinBee:**), item names
  (TwinBee's Bell), achievements, and game-title references in
  fun.go (Konami TwinBee ship) left intact.
- Catches a real bug: Valdris fight rendered "TwinBee marks the
  Legendary Resistance" mid-combat in third person, contradicting
  the Phase B2 convention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 12:40:17 -07:00

615 lines
31 KiB
Go

package plugin
// ── TWINBEE NARRATIVE POOLS ───────────────────────────────────────────────────
// All strings are in third person. TwinBee never fails.
// TwinBee withdraws, pivots, repositions, reconvenes, and returns.
// TwinBee does not lose. TwinBee has setbacks that are tactically indistinct
// from victories, looked at the right way, which is TwinBee's way.
var TwinBeeSuccess = []string{
"I descended into {location} with characteristic enthusiasm " +
"and the kind of confidence that makes dungeon monsters briefly " +
"reconsider their career choices. Several reconsidered too slowly. " +
"I have returned with {loot} worth €{value} and a new personal philosophy " +
"regarding the optimum angle of attack on a Stone Golem. " +
"The philosophy works. It has been field-tested. Just now.",
"Another flawless operation. I entered {location}, assessed the situation " +
"with professional precision, and extracted {loot} worth €{value} " +
"with minimal collateral damage to me specifically. " +
"The dungeon has been informed it performed adequately. " +
"I do not give compliments freely. This was a compliment.",
"I have returned from {location} victorious, which is to say " +
"I have returned from {location}, because for me these are the same thing. " +
"{loot} worth €{value}. {xp} XP that I do not need " +
"but accept graciously, as a gift, from the dungeon. " +
"The dungeon can try harder next time. It probably won't. They never do.",
"I located {loot} worth €{value} in {location} after what I am " +
"describing in the post-mission debrief as 'a series of increasingly correct decisions.' " +
"The monsters involved have been described as 'adequate opposition' " +
"in the same debrief. I am generous with these things.",
"In. Retrieved {loot}. Out. €{value}. {xp} XP. " +
"I have the efficiency of someone who has done this many times " +
"and the confidence of someone who has never once considered " +
"that it might not go well. These two qualities, combined, produce results. " +
"The results are in your share of the haul.",
"I report: {location} cleared, {loot} secured, €{value} assessed, " +
"one near-miss that I am not classifying as a near-miss " +
"because I do not have near-misses, I have " +
"'moments of dynamic tactical adjustment that resolved favorably.' " +
"The moment resolved favorably. Obviously.",
"The {location} boss encountered me today. " +
"This is how I prefer to frame the encounter — " +
"the boss encountered me, not the other way around — " +
"because it accurately reflects the power dynamics. " +
"{loot} worth €{value}. The boss has been encountered.",
"I went to {location} and came back with {loot} worth €{value}, " +
"which is what I do, and {xp} XP, which I acknowledge " +
"with the quiet grace of someone for whom excellence " +
"has long since stopped being a surprise.",
"Professional assessment of today's {location} operation: successful. " +
"Loot: {loot}, €{value}. Opposition: handled. Duration: optimal. " +
"My equipment: immaculate. Me: as expected.",
"I extracted {loot} worth €{value} from {location} " +
"with the efficiency of a professional and the cheerfulness of someone " +
"who genuinely enjoys doing this, which I do, " +
"which is why I am better at it than everyone else, " +
"which I am.",
"The monsters in {location} gave it their best today. " +
"I noticed this and respected it for the duration of the encounter, " +
"which was brief. {loot} worth €{value}. {xp} XP. " +
"I have returned in excellent spirits, which is not news, " +
"but it is accurate.",
"My route through {location} was, according to my own review, " +
"'essentially perfect.' No argument has been presented to the contrary. " +
"I returned with {loot} worth €{value} and a complete absence " +
"of anything that went wrong, which is my preferred kind of absence.",
"A lesser adventurer would have found {location} challenging today. " +
"I found it brisk. {loot}, €{value}, {xp} XP, " +
"and the mild satisfaction of a problem that turned out " +
"to be an appropriately-sized problem. I appreciate appropriate sizing.",
"I entered {location} from the north approach, which I have determined " +
"is the correct approach, and exited with {loot} worth €{value}. " +
"The southern approach is noted. It is not the correct approach. " +
"I have opinions about approaches and they are correct opinions.",
"Operational summary: {location} visited, opposition encountered, opposition handled, " +
"{loot} extracted at €{value} assessed value, {xp} XP collected, " +
"I returned in the condition I left in, " +
"which is optimal, because I am always in optimal condition.",
}
var TwinBeeExceptional = []string{
"OUTSTANDING PERFORMANCE. I located and neutralised the dungeon boss " +
"— which I describe as 'a scheduling conflict that has now been resolved' — " +
"and recovered {loot} worth €{value}. " +
"This is, by my reckoning, a typical Tuesday. " +
"I have had many exceptional Tuesdays. The dungeons are aware.",
"I found {loot} worth €{value} in {location} after what I am " +
"calling 'a brief but educational exchange' with something very large " +
"that is no longer a going concern. Bonus XP noted. " +
"I noted it first. I note everything first.",
"The inner chamber. I reached the inner chamber. " +
"I note that reaching the inner chamber requires " +
"the successful navigation of everything between here and the inner chamber, " +
"which I navigated successfully, and then {loot} worth €{value} " +
"was in the inner chamber, and I took it. " +
"The inner chamber is now available to be an outer chamber.",
"A boss encounter. My assessment of the boss: 'interesting.' " +
"The boss's assessment of me: insufficient time to complete. " +
"{loot} worth €{value}. I have forwarded the boss's personnel file " +
"to the relevant afterlife authorities with a positive reference.",
"EXCEPTIONAL. My word, used sparingly. " +
"Today merits it. {loot} worth €{value} from the deepest chamber " +
"of {location}, retrieved past opposition that I describe " +
"as 'the most interesting opposition I've faced this week,' " +
"which is high praise from me and accurately assesses the week so far.",
"I found something the dungeon wasn't offering publicly. " +
"I find things dungeons aren't offering publicly. " +
"It's a skill. {loot} worth €{value}. {xp} XP. " +
"The dungeon has updated its offering. I approve of the update " +
"from a position of already having taken the thing.",
"A critical run. Every encounter resolved correctly. Every chamber yielded. " +
"Every roll, every decision, every approach: correct. " +
"{loot} worth €{value}. {xp} XP. " +
"I submit this run as the reference standard for {location}. " +
"Future runs should aspire to this. They will not reach it.",
"The boss was large. I am here. " +
"These two facts met in {location} and produced {loot} worth €{value} " +
"and a story that I am telling to everyone and will continue telling " +
"until a better story replaces it, which will also be my story.",
}
var TwinBeeWithdrawal = []string{
"I have completed today's operation and am taking the remainder " +
"of the afternoon for strategic planning. " +
"This is unrelated to {location}. {location} is unrelated to everything. " +
"I have already moved on and suggest you do the same.",
"I assessed {location} with characteristic thoroughness, " +
"identified that today's objectives had been sufficiently advanced " +
"by the reconnaissance phase, and withdrew in good order " +
"before the situation became interesting in ways I did not schedule. " +
"This is called professionalism. I have it.",
"Today's operation at {location} concluded earlier than projected. " +
"I encountered something very large, evaluated the encounter on its merits, " +
"and determined that returning tomorrow with more information " +
"was the superior strategic outcome. " +
"I was not running. I do not run. " +
"I was moving with purpose in the opposite direction. These are different.",
"I left {location} at a time of my own choosing, " +
"which happened to coincide with the arrival of something " +
"that I am describing in the official report as 'a scheduling conflict.' " +
"The conflict has been noted. It will be addressed. Tomorrow. " +
"At a time that suits me.",
"TACTICAL WITHDRAWAL EXECUTED. {location} has been informed, " +
"via the medium of my departure, that today was not the day. " +
"I know which days are the days. Today was for gathering intelligence. " +
"The intelligence gathered is: {location} still exists and should watch itself.",
"I retreated from {location} in the same way the tide retreats from the shore — " +
"deliberately, inevitably, and with the full understanding that it will be back, " +
"and the shore knows this, and the shore is thinking about it right now.",
"Something in {location} today required me to make a decision. " +
"I made the decision. The decision was: not today. " +
"My decisions are correct decisions by definition, " +
"which means 'not today' was correct, which will be proven correct " +
"when I return tomorrow and the thing is no longer a factor. " +
"These things always work out when I decide they will.",
"The mission objectives for today's {location} operation have been " +
"reclassified as 'Phase One of a Two-Phase Operation,' " +
"where Phase One is reconnaissance and Phase Two is tomorrow. " +
"Phase One is complete. Phase One was, in retrospect, always the plan.",
"I encountered something in {location} that I am describing " +
"as 'an opportunity to demonstrate strategic patience.' " +
"I demonstrated strategic patience. The patience was demonstrated " +
"at significant velocity in the direction of the exit, " +
"but the patience was present throughout.",
"Official statement from me regarding today's {location} operation: " +
"'Everything went according to plan.' " +
"The plan has been updated to reflect what happened. " +
"The updated plan describes what happened as planned. " +
"My plans are always accurate.",
"I am back. The thing in {location} is also still there. " +
"I am aware of the thing. The thing is aware of me. " +
"This is a stalemate that I will resolve on my own timeline, " +
"which is different from the thing's timeline, " +
"and my timeline is the one that matters.",
"The {location} situation has been described, by me, as " +
"'temporarily inconclusive,' which is a phrase I use " +
"when something very large expressed a strong position " +
"and I have chosen to revisit the position on better terms. " +
"The terms will be better. I will see to it.",
"Today, I gathered extensive tactical data on {location}. " +
"The data indicates that {location} is well-defended. " +
"The data was gathered by going in and then coming back out, " +
"which is a time-honoured data gathering methodology " +
"that I have employed before and will employ again, ideally less urgently.",
"My return today is best understood as a 'victory lap around the outside,' " +
"which is a phrase I have just coined and will be using going forward. " +
"A victory lap around the outside of {location} has been completed. " +
"I am home. The inside of {location} is tomorrow's victory lap.",
"Something the size of a building expressed interest in me at depth. " +
"I expressed equal and opposite interest in being elsewhere. " +
"Both interests were satisfied. I am elsewhere. " +
"The something is where it was. The relationship is stable.",
}
var TwinBeeEmpty = []string{
"I have returned from {location} and wish it to be known " +
"that the dungeon was empty, which I attribute entirely to my reputation " +
"preceding me. The monsters left. They knew. " +
"I respect this. I also found nothing. These facts are unrelated.",
"Intelligence suggested {location} would be productive today. " +
"My intelligence was incorrect. " +
"My intelligence is reviewing its methodology. " +
"The dungeon contained no loot, no monsters worth discussing, " +
"and one confused bat that I have agreed not to mention publicly. " +
"Moving on.",
"{location} was cleared. By whom is unclear. I suspect a rival. " +
"I do not have rivals, technically, " +
"but am prepared to invent one for the purposes of this grievance. " +
"No loot. No comment. The rival has been noted.",
"The {location} run today yielded nothing of material value, " +
"which I attribute to the universe's temporary misalignment " +
"with my interests. The universe will correct itself. " +
"I am giving it until tomorrow.",
"Empty. {location} was empty today, which is {location}'s problem. " +
"I showed up. I was prepared. I had the right equipment. " +
"The dungeon failed to provide an adequate challenge or adequate reward. " +
"This reflects poorly on the dungeon.",
"I cleared four rooms of {location} and found nothing worth the trip. " +
"I am not saying the trip was not worth it — I do not say that — " +
"but the material outcome was zero and the XP was minimal " +
"and I would like to register this as feedback for the dungeon.",
"The treasure was already gone when I arrived, " +
"which means someone got there before me, " +
"which is a sentence that has never previously been true " +
"and which I am treating as a statistical anomaly " +
"rather than a pattern that might develop.",
"No monsters. No treasure. No meaningful opposition. " +
"Just me in {location} swinging at things that weren't there. " +
"I have described this run as 'character-building.' " +
"My character was already built. " +
"This run has contributed nothing to the structure.",
}
// ── EQUIPMENT BREAKING ────────────────────────────────────────────────────────
// Indexed by slot name. Select randomly from the pool.
// The replacement is always the Tier 0 version of the slot.
var EquipmentBreaking = map[string][]string{
"weapon": {
"Your {item} has given everything it had, which in retrospect was not much " +
"and also embarrassing to admit out loud. It has returned to its natural state: garbage. " +
"You are now equipped with the Basic Ass Sword. " +
"The cycle of mediocrity turns.",
"Your {item} is dead. We gather not to mourn it — it was not good — " +
"but to acknowledge that it served. Poorly. Consistently, aggressively poorly. " +
"The Basic Ass Sword has been reissued. It is equally bad but at least new.",
"Gone. Your {item} is gone. Condition: zero. Structural integrity: none. " +
"Dignity: never present. You are back to the Basic Ass Sword " +
"and we are all pretending this is fine. It is not fine. Upgrade. Please.",
"Your {item} has shattered. The sound it made was brief " +
"and embarrassingly small for a weapon failing at a critical moment. " +
"The Basic Ass Sword, your original, your constant, your shame, " +
"is back in your hand. As if you never left.",
"The {item} has returned to its components, which are bad components " +
"that produced a bad weapon that has now finished being a weapon. " +
"The Basic Ass Sword is what you have. " +
"The Basic Ass Sword is, tragically, still a sword.",
"Broken. The {item} is broken, condition zero, " +
"broken in a way that happens to weapons that have been asked " +
"to do more than their condition could support for longer than their condition recommended. " +
"The Basic Ass Sword does not have these concerns because its expectations are already zero.",
"Your {item} snapped. The upper half is somewhere you cannot retrieve it. " +
"The lower half is a handle with opinions. " +
"You are holding the lower half. The Basic Ass Sword is the new situation. " +
"The new situation is the old situation.",
"The blade went one way and the handle went another " +
"and you went in the direction of 'holding a Basic Ass Sword again' " +
"because that is where broken weapons return their owners. " +
"The circle is unbroken. The sword is broken. Welcome back.",
},
"armor": {
"Your {item} has failed. Not dramatically — just failed, quietly, " +
"at the structural level, in a way that became apparent all at once " +
"when the last thing hit you. The Shitty Armor is back. " +
"The Shitty Armor has always been back, waiting.",
"Condition zero. Your {item} is now the Shitty Armor. " +
"Not figuratively — the item has been replaced by the actual Shitty Armor, " +
"the baseline, the floor, the thing below which armor does not go " +
"and from which you have apparently returned.",
"The {item} has been compromised. 'Compromised' is the polite word. " +
"The honest words are 'destroyed' and 'sorry' and 'you're wearing Shitty Armor again.' " +
"The Shitty Armor offers the protection of a strongly-worded letter. " +
"It always has. It still does.",
"Your {item} bent the wrong way. Armor should not bend. " +
"Armor that bends has broken the implicit contract between armor and wearer, " +
"which is: you stay rigid, I stay alive. " +
"The contract is void. The Shitty Armor is the new contract. " +
"It's a worse contract.",
"The {item} is done. Condition zero, function zero, " +
"protective value approximately matching the Shitty Armor that has replaced it, " +
"which is a different thing than matching actual armor " +
"but is now your actual situation.",
"Structural failure. Your {item} has experienced structural failure, " +
"which is a technical term for 'it broke' that makes you feel " +
"like an engineer rather than someone wearing broken armor and the Shitty Armor simultaneously, " +
"which you are. The Shitty Armor fits, though. Sadly, it always fits.",
},
"helmet": {
"Your {item} is gone. Condition zero. The Goddamn Offensive Helmet " +
"is back on your head, where it was always waiting, " +
"crouching in the back of your inventory, " +
"knowing this day would come. The helmet knew.",
"The {item} has been retired by force. In its place: the Goddamn Offensive Helmet. " +
"It is bad for your head. It is an insult to everyone who sees it. " +
"It fits perfectly, which is the most offensive thing about it.",
"Condition zero means the Goddamn Offensive Helmet. " +
"The Goddamn Offensive Helmet means you've come full circle. " +
"The circle is not a triumph. The circle is a shape your bad decisions make " +
"when you don't repair your gear.",
"Your {item} cracked in half. The two halves are not useful halves. " +
"The useful replacement is the Goddamn Offensive Helmet, " +
"which has been retrieved from the bottom of your pack " +
"where it was waiting with complete patience " +
"because it knew. It always knows.",
"The {item} has betrayed you in the specific way of head protection: " +
"by not being head protection anymore. " +
"The Goddamn Offensive Helmet has stepped in to fill the void. " +
"The Goddamn Offensive Helmet fills the void in the same way " +
"a bad apology fills a silence. Technically. Poorly.",
},
"boots": {
"Your {item} are gone. Condition zero. The Knobby-Ass Boots are your boots now. " +
"The knobs are not a feature. Nobody has ever established what they are. " +
"You will be wearing them until you can afford better.",
"The {item} have given out. The Knobby-Ass Boots are the replacement. " +
"The Knobby-Ass Boots do not explain themselves. " +
"They have never explained themselves. They are simply there, knobby, waiting.",
"Condition zero on the {item}. Condition zero means Knobby-Ass Boots. " +
"The Knobby-Ass Boots were in your pack. They were always in your pack. " +
"You kept them because getting rid of them felt like tempting fate. " +
"Fate has been tempted anyway.",
"Your {item} fell apart in the field, which is the worst time for boots to fall apart " +
"and also, historically, exactly when boots fall apart. " +
"The Knobby-Ass Boots are your boots. " +
"The knobs are less comfortable than the alternative of no boots. Marginally.",
"The {item} are done. The Knobby-Ass Boots are the present reality. " +
"You will walk in them. They will be uncomfortable. " +
"The knobs will be inexplicable. This is what condition zero costs.",
},
"tool": {
"Your {item} has broken. The Rusted PoS Pickaxe is your tool now. " +
"It is technically a pickaxe. That is the single nicest thing " +
"anyone can say about it. It says it with reluctance.",
"Condition zero on the {item}. The Rusted PoS Pickaxe has returned " +
"from wherever tools go when you stop using them, " +
"which is apparently the bottom of your pack, " +
"rusty and patient and not surprised.",
"The {item} is gone. The Rusted PoS Pickaxe is here. " +
"The Rusted PoS Pickaxe has always been here, spiritually. " +
"Now it is here physically. The mountain will not respect it. " +
"The mountain never respected it. The mining has become harder.",
"Your {item} cracked down the haft and the head separated at impact " +
"and the impact was on rock that did not move " +
"and you have the haft and not the head and " +
"the Rusted PoS Pickaxe, which has a head attached, for now. " +
"Mine carefully. Everything is worse.",
"The {item} made a sound that tools should not make " +
"and then it was in two pieces and the Rusted PoS Pickaxe " +
"was in your hand because that is what happens at condition zero. " +
"You are back to the beginning. The beginning bites rock poorly.",
},
}
// ── SYSTEM MESSAGES ───────────────────────────────────────────────────────────
var DeathDM = []string{
"📋 ADVENTURER STATUS: DEAD (RECOVERING)\n\n" +
"{name}, you have died. This is, frankly, on you.\n\n" +
"You are currently receiving care under the local healthcare system, which\n" +
"has reviewed your case, questioned several of your life choices, denied\n" +
"the first two claims, pre-authorized one bandage, and will see you in\n" +
"approximately 23 hours pending insurance confirmation. The insurance\n" +
"confirmation is pending. The insurance company is 'looking into it.'\n\n" +
"Expected return: {time} UTC\n" +
"Current condition: Alive (technically, and barely)\n" +
"Equipment damage: Applied. It's not pretty.\n\n" +
"The {location} has been flagged as 'hazardous' in your file,\n" +
"which will not change anything about anything.",
"📋 ADVENTURER STATUS: RECEIVING CARE\n\n" +
"You are dead, {name}. Temporarily. Healthcare is involved.\n\n" +
"The bill has been pre-estimated. The pre-estimate is not comfortable.\n" +
"The final bill will be different from the pre-estimate.\n" +
"Neither will be comfortable. This is healthcare.\n\n" +
"Your equipment has been assessed. The assessment was not kind.\n" +
"The assessment was accurate. Return expected: {time} UTC.\n" +
"The {location} has noted your visit in whatever records it keeps.\n" +
"You are in the record as 'visited once, briefly.'",
"📋 ADVENTURER STATUS: INDISPOSED\n\n" +
"{name}. You have died in {location}.\n\n" +
"The relevant parties have been notified. The relevant parties include:\n" +
"- Healthcare (notified, processing, unhurried)\n" +
"- Your equipment (notified, damaged, also unhurried about this)\n" +
"- The {location} (not notified; doesn't care; already moved on)\n\n" +
"You have not been notified because you are currently the situation.\n" +
"Return: {time} UTC. Rest. The {location} will still be there.",
"📋 ADVENTURER STATUS: TEMPORARILY NOT ADVENTURING\n\n" +
"Dead, {name}. The word is 'dead.'\n\n" +
"Healthcare has received your chart. Healthcare has seen this chart before.\n" +
"Healthcare has a file. The file is thick.\n" +
"Healthcare has not commented on the file's thickness, professionally,\n" +
"but the nurses make eye contact with each other when they see your name.\n\n" +
"Equipment: damaged in ways that will require attention.\n" +
"Return: {time} UTC.\n" +
"The {location} has not changed as a result of this incident.",
"📋 ADVENTURER STATUS: IN THE SYSTEM\n\n" +
"You are dead. This is current status, not commentary, {name}.\n\n" +
"The healthcare system has processed your intake.\n" +
"The healthcare system processed your intake with the efficiency\n" +
"of a system that processes many intakes and has a form for yours specifically.\n" +
"The form has been filled out. Several boxes checked.\n" +
"The box that says 'preventable' has been considered.\n\n" +
"Recovery: {time} UTC. Equipment: damaged. {location}: still standing.",
}
var RespawnDM = []string{
"📋 ADVENTURER STATUS: DISCHARGED (AGAINST MEDICAL ADVICE, AS USUAL)\n\n" +
"{name}, healthcare is done with you. You have been discharged.\n" +
"You signed a waiver on the way out. You do not remember signing it.\n" +
"It covered a lot of ground. Don't think about it.\n\n" +
"You are once again technically alive and available for terrible decisions.\n" +
"The hospital has asked that you please not come back,\n" +
"which is advice you will almost certainly ignore.\n\n" +
"Type !adventure to see today's options.\n" +
"Try to make better ones. You won't, but try.",
"📋 ADVENTURER STATUS: OPERATIONAL (RELUCTANTLY CERTIFIED)\n\n" +
"{name}. Healthcare has finished with you.\n\n" +
"You have been medically cleared for adventuring,\n" +
"which is a certification that healthcare gives\n" +
"while clearly feeling that giving it is a mistake.\n" +
"The certification has been given. The feeling was noted in your chart.\n\n" +
"Your equipment is in the condition it was when you were admitted.\n" +
"That condition was not good. It is still not good.\n" +
"Type !adventure to continue making it worse.",
"📋 ADVENTURER STATUS: RETURNED\n\n" +
"You're back, {name}.\n\n" +
"Healthcare has released you with a list of recommendations\n" +
"that you will not be following. They know you won't follow them.\n" +
"They give them anyway. It's in the protocol.\n\n" +
"The recommendations include: better equipment, lower-tier dungeons,\n" +
"a different career. These are good recommendations.\n" +
"Type !adventure to not follow them.",
"📋 ADVENTURER STATUS: DISCHARGED\n\n" +
"{name}, you are alive. Healthcare has confirmed this.\n" +
"Healthcare's confirmation comes with a bill that has been filed\n" +
"and will be filed again and will continue to be filed\n" +
"until something happens that resolves the filing.\n\n" +
"None of this is your immediate problem.\n" +
"Your immediate problem is that your equipment is worse\n" +
"and your options are the same and the dungeons are waiting.\n\n" +
"Type !adventure. The morning DM arrives at 08:00 UTC.\n" +
"Be there. Try to be there tomorrow too. And the day after.",
}
var IdleShameDM = []string{
"{name}, hey. Didn't see you out there today.\n\n" +
"I swung by the hovel — door was shut, no answer.\n" +
"Hope you're alright. The dungeon will keep. The mine will keep.\n" +
"They've been there a while; they're patient.\n\n" +
"Tomorrow: 08:00 UTC. We'll be ready when you are.",
"Quiet day for you, {name}.\n\n" +
"The morning DM went out and didn't come back. That happens.\n" +
"Real life sometimes shows up uninvited and stays for dinner.\n" +
"I picked up a little extra in the field — covered for you.\n\n" +
"Tomorrow morning the choices reset. Drop by when you can.",
"{name}, no sign of you in the field today.\n\n" +
"The forest is still there. So's the mine. So's that one rusted sword\n" +
"you keep meaning to replace. Nothing important moved.\n\n" +
"08:00 UTC tomorrow — fresh menu, same patient narrator.",
"Missed you out there, {name}.\n\n" +
"I went on a haul today and saved a corner of the splits for you,\n" +
"then ate it on principle when you didn't show. (Sorry. House rule.)\n" +
"Nothing's lost that can't be earned back.\n\n" +
"Tomorrow: 08:00 UTC. The dungeons are warm.",
"A quiet day, {name}. Those happen.\n\n" +
"You weren't on the trail. The trail didn't fall apart without you.\n" +
"It'll be there tomorrow, and the day after, and the one after that.\n\n" +
"08:00 UTC. Whenever you're back, we pick up where we left off.",
"{name}. Hope you had a good rest day.\n\n" +
"I held down the fort. Nothing dramatic, nothing lost —\n" +
"the world declined to end on your behalf, which feels generous.\n\n" +
"When you're ready, the morning DM hits at 08:00 UTC. No rush.",
}
var OnboardingDM = []string{
"Welcome, {name}.\n\n" +
"You are an adventurer. A hero. Probably.\n" +
"The opening scroll of your life has played and it was unfortunately\n" +
"quite short and mentioned nothing about destiny or treasure,\n" +
"only that you are broke and smell faintly of the starting village.\n\n" +
"You have been issued the standard starter kit:\n" +
"⚔️ Basic Ass Sword — it's a sword in the same way a parking ticket is legal documentation\n" +
"🛡️ Shitty Armor — offers the protection of a strongly-worded letter\n" +
"🪖 Goddamn Offensive Helmet — bad for your head, an insult to witnesses\n" +
"👢 Knobby-Ass Boots — the knobs are not a feature\n" +
"⛏️ Rusted PoS Pickaxe — technically a pickaxe, the nicest thing anyone can say\n\n" +
"Go forth. Try not to die in the Soggy Cellar.\n" +
"People have. It was embarrassing and they never fully lived it down.\n\n" +
"Your morning DM arrives at 08:00 UTC. Today's choices are ready now.\n" +
"Type !adventure to begin.",
}
var MorningDM = []string{
"⚔️ Good morning, {name}. Another day, another opportunity for regret.\n\n" +
"{character_sheet}\n\n" +
"Where are you headed? I would choose the dungeon.\n" +
"I would also survive it. You are not TwinBee. Choose wisely.",
"⚔️ {name}. You're alive. The options are:\n\n" +
"{character_sheet}\n\n" +
"The dungeon is there. The mine is there. The forest is there.\n" +
"None of them are getting safer. Reply to choose.",
"⚔️ Morning, {name}.\n\n" +
"{character_sheet}\n\n" +
"Today is a day. Days have outcomes. Reply with your choice\n" +
"and we will discover what today's outcome is together,\n" +
"at different levels of risk depending on what you pick.",
"⚔️ Rise and choose, {name}.\n\n" +
"{character_sheet}\n\n" +
"The world is dangerous and full of things worth taking from it.\n" +
"Some of those things are in dungeons. Some are in mines.\n" +
"Some are in forests, guarded by hornets who feel strongly about them.\n" +
"Reply with where you're going.",
"⚔️ Another morning. Another chance to make something happen, {name}.\n\n" +
"{character_sheet}\n\n" +
"Or don't. You could rest. You could do nothing.\n" +
"The bot will send you a disappointed DM at midnight.\n" +
"I will know. I always know.\n" +
"Reply to choose.",
}