mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Adv 2.0 D&D Phase 12 E6c: Expedition flavor topup
Expand under-populated TwinBee expedition pools (singletons → 3, pairs → 4) for: morning briefings (Day1/3/14/21), evening recaps (boss/close-call/ quiet), all four threat clock bands, every zone temporal event narration, supply depletion, and every milestone narration. Add MilestoneCartographer and MilestoneSurvivalist pools (spec §13). Wire MilestoneSurvivalist into AwardCompletionMilestones (was inline string). All additions in TwinBee voice, no existing entries altered. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -40,11 +40,15 @@ var MorningBriefingGeneric = []string{
|
|||||||
var MorningBriefingDay1 = []string{
|
var MorningBriefingDay1 = []string{
|
||||||
"First morning. The dungeon looks exactly like it looked yesterday, which is expected. You look slightly more prepared than you did yesterday, which is less expected and entirely welcome.",
|
"First morning. The dungeon looks exactly like it looked yesterday, which is expected. You look slightly more prepared than you did yesterday, which is less expected and entirely welcome.",
|
||||||
"Day one complete. TwinBee tallies: you entered, you explored, you survived the night. The bar was not high. You cleared it. TwinBee builds from here.",
|
"Day one complete. TwinBee tallies: you entered, you explored, you survived the night. The bar was not high. You cleared it. TwinBee builds from here.",
|
||||||
|
"Morning of day two. The first night is filed under 'survived' and TwinBee is already running the second day's plan. New room types likely. New encounter shapes. The pace begins to differentiate from the practice version of itself.",
|
||||||
|
"Day one is behind you. TwinBee has the day's notes already organized — what worked, what nearly didn't, what you'll do differently from here. The dungeon is also taking notes on you. Everyone is preparing.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MorningBriefingDay3 = []string{
|
var MorningBriefingDay3 = []string{
|
||||||
"Day three. The dungeon has had time to notice you. TwinBee has had time to notice the dungeon noticing you. The Threat Clock reflects both observations.",
|
"Day three. The dungeon has had time to notice you. TwinBee has had time to notice the dungeon noticing you. The Threat Clock reflects both observations.",
|
||||||
"Three days in. You've found your rhythm — TwinBee can see it in the way you move through rooms now, the way you check corners. The dungeon is learning too. TwinBee acknowledges both.",
|
"Three days in. You've found your rhythm — TwinBee can see it in the way you move through rooms now, the way you check corners. The dungeon is learning too. TwinBee acknowledges both.",
|
||||||
|
"Day three morning. The dungeon's posture has shifted noticeably overnight — TwinBee saw it in the corridor noise around the second watch. The Threat Clock is doing what it does. You're doing what you do. The two of you are now both doing it on purpose.",
|
||||||
|
"Three days. The dungeon recognizes you as a recurring fixture now, which is a different kind of attention than the kind you had on Day 1. TwinBee adjusts the briefings accordingly. Less orientation, more situational reads. From here it gets specific.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MorningBriefingDay7 = []string{
|
var MorningBriefingDay7 = []string{
|
||||||
@@ -56,10 +60,14 @@ var MorningBriefingDay7 = []string{
|
|||||||
var MorningBriefingDay14 = []string{
|
var MorningBriefingDay14 = []string{
|
||||||
"Two weeks. TwinBee does not know many people who have been in an active dungeon for two weeks. TwinBee knows even fewer who have been in one for two weeks and remained, by any reasonable measure, intact. You are one of the fewer.",
|
"Two weeks. TwinBee does not know many people who have been in an active dungeon for two weeks. TwinBee knows even fewer who have been in one for two weeks and remained, by any reasonable measure, intact. You are one of the fewer.",
|
||||||
"Fourteen days. The dungeon has become familiar in the way that difficult things become familiar — not comfortable, not safe, but known. You know where it breathes. TwinBee considers this an advantage worth having.",
|
"Fourteen days. The dungeon has become familiar in the way that difficult things become familiar — not comfortable, not safe, but known. You know where it breathes. TwinBee considers this an advantage worth having.",
|
||||||
|
"Two weeks. TwinBee starts the briefing the same way TwinBee has started fourteen others, then pauses and adds: 'For the record — most expeditions don't see fourteen briefings. This one has.' That's the addendum. Continuing.",
|
||||||
|
"Day fifteen. TwinBee has stopped checking the historical reference materials because the historical reference materials stopped applying. From here, the run sets its own precedent. TwinBee finds this clarifying.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MorningBriefingDay21 = []string{
|
var MorningBriefingDay21 = []string{
|
||||||
"Three weeks. TwinBee has run out of historical comparisons for this. Three weeks is its own category. You have made a category. TwinBee reports this as a fact and also as something that doesn't entirely have words yet.",
|
"Three weeks. TwinBee has run out of historical comparisons for this. Three weeks is its own category. You have made a category. TwinBee reports this as a fact and also as something that doesn't entirely have words yet.",
|
||||||
|
"Day twenty-one. TwinBee tried to write a clever framing for this morning's briefing and gave up halfway through, settling instead on the simplest version: 'You're still here.' That's the briefing. The rest is logistics.",
|
||||||
|
"Three weeks down. The dungeon has stopped being a place you're visiting and become a place you live in for now. TwinBee notes the shift — the way you check rooms without being asked, the way the supply count is already in your head. The dungeon notices too.",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
@@ -82,16 +90,22 @@ var EveningRecapGeneric = []string{
|
|||||||
var EveningRecapBossKilled = []string{
|
var EveningRecapBossKilled = []string{
|
||||||
"The day ends with a boss on the floor. TwinBee would like to specifically note this in the recap as 'exceptional' because it is exceptional and TwinBee does not use that word loosely.",
|
"The day ends with a boss on the floor. TwinBee would like to specifically note this in the recap as 'exceptional' because it is exceptional and TwinBee does not use that word loosely.",
|
||||||
"End of day. Boss count: one more than it was this morning. TwinBee marks this in a special column it keeps for exactly these entries and the special column has a new line.",
|
"End of day. Boss count: one more than it was this morning. TwinBee marks this in a special column it keeps for exactly these entries and the special column has a new line.",
|
||||||
|
"End of day. A boss is no longer in the dungeon. TwinBee records this in the column it keeps for exactly that line, and the column has a new mark, and that's the kind of recap TwinBee likes to write. Sleep well. The rest of the dungeon noticed too.",
|
||||||
|
"The day closes with a vacancy. The thing in the chamber is no longer in the chamber. TwinBee ran the final tally during the fight and the tally is favorable. There will be more things tomorrow. There always are. None of them are this one.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var EveningRecapCloseCall = []string{
|
var EveningRecapCloseCall = []string{
|
||||||
"TwinBee runs the evening recap and notes: you came very close today to not being here for the evening recap. TwinBee notes this without drama and with complete sincerity. You made it. That's the recap.",
|
"TwinBee runs the evening recap and notes: you came very close today to not being here for the evening recap. TwinBee notes this without drama and with complete sincerity. You made it. That's the recap.",
|
||||||
"Today was the kind of day that TwinBee files under 'let's not do that again' and also 'and yet you did it.' Rest. You need it more tonight than most nights.",
|
"Today was the kind of day that TwinBee files under 'let's not do that again' and also 'and yet you did it.' Rest. You need it more tonight than most nights.",
|
||||||
|
"Evening recap. TwinBee will note for the ledger that today was very nearly a different kind of recap, and TwinBee is glad it isn't. The margin was thinner than TwinBee likes. TwinBee will adjust tomorrow's caution accordingly.",
|
||||||
|
"End of day, narrowly. TwinBee runs through the close-call list — the round that nearly went the other way, the save that landed by one, the room you almost didn't leave — and signs each one off as 'survived.' Survived is a wide category. TwinBee accepts you in any part of it.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var EveningRecapNothingHappened = []string{
|
var EveningRecapNothingHappened = []string{
|
||||||
"A quiet day. No major encounters, no notable finds. TwinBee reports this with neither disappointment nor relief. Quiet days are data. The dungeon is thinking. TwinBee is watching it think.",
|
"A quiet day. No major encounters, no notable finds. TwinBee reports this with neither disappointment nor relief. Quiet days are data. The dungeon is thinking. TwinBee is watching it think.",
|
||||||
"Not every day in a dungeon produces a story. Today produced logistics: movement, supplies, positioning. TwinBee values logistics. Logistics is what you still being alive looks like from a distance.",
|
"Not every day in a dungeon produces a story. Today produced logistics: movement, supplies, positioning. TwinBee values logistics. Logistics is what you still being alive looks like from a distance.",
|
||||||
|
"Day closes uneventfully. TwinBee considers uneventful days the kind that the dungeon is most carefully constructing — quiet between incidents is also a kind of incident. TwinBee files the day under 'preparation, theirs.' Yours starts now.",
|
||||||
|
"Nothing happened. TwinBee writes that exact phrase in the recap and then crosses it out and writes 'something happened that wasn't visible.' That feels truer. The day still counts. The day still cost supplies. Everything still moves forward.",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
@@ -130,6 +144,8 @@ var SupplyWarningCritical = []string{
|
|||||||
|
|
||||||
var SupplyDepletedExtraction = []string{
|
var SupplyDepletedExtraction = []string{
|
||||||
"The supplies are gone. TwinBee says this plainly because the situation requires plain language. The expedition ends here — not in failure, in logistics. You push out as far as the provisions allow. What you've gathered comes with you. TwinBee leads the way out.",
|
"The supplies are gone. TwinBee says this plainly because the situation requires plain language. The expedition ends here — not in failure, in logistics. You push out as far as the provisions allow. What you've gathered comes with you. TwinBee leads the way out.",
|
||||||
|
"Empty packs. TwinBee turns them out by reflex and confirms what the manifest already said. The expedition does not continue past supplies — that's the rule, and TwinBee enforces it on you the way TwinBee enforces it on TwinBee. Out we go. With what we have. Which is something.",
|
||||||
|
"Out of supplies. TwinBee leads the extraction along the route already mapped — there's no scouting now, just movement, the kind that gets you through the door before anything else does. The dungeon will be here. So will TwinBee. So, importantly, will you.",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
@@ -139,20 +155,28 @@ var SupplyDepletedExtraction = []string{
|
|||||||
var ThreatClockStirring = []string{
|
var ThreatClockStirring = []string{
|
||||||
"TwinBee notices something in the dungeon's rhythm has changed. A tension in the air that wasn't there yesterday. The zone is aware of you now, in the way that a predator becomes aware of something in its territory. Not panicking. Not moving yet. Just aware.",
|
"TwinBee notices something in the dungeon's rhythm has changed. A tension in the air that wasn't there yesterday. The zone is aware of you now, in the way that a predator becomes aware of something in its territory. Not panicking. Not moving yet. Just aware.",
|
||||||
"The enemies ahead are more alert than they were. TwinBee can tell by the patrols, by the spacing, by the fact that someone moved the tripwire you already disarmed. They know something is in here.",
|
"The enemies ahead are more alert than they were. TwinBee can tell by the patrols, by the spacing, by the fact that someone moved the tripwire you already disarmed. They know something is in here.",
|
||||||
|
"Stirring. TwinBee tracks the small changes the dungeon makes when it suspects but doesn't confirm — repositioned patrols, fresher footprints, a torch that wasn't lit in this corridor before. TwinBee notes each one. None of them is alarming yet. All of them are evidence.",
|
||||||
|
"The dungeon is getting curious. TwinBee distinguishes curiosity from alertness — curiosity is when the patrols slow at the doorways; alertness is when they form on the doorways. We're at the first one. The window between them is what TwinBee is watching.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var ThreatClockAlert = []string{
|
var ThreatClockAlert = []string{
|
||||||
"The zone is on alert. TwinBee reports this factually and also with a note of urgency — alert means organized, and organized means the next room will be harder than the last room was. Move with intention.",
|
"The zone is on alert. TwinBee reports this factually and also with a note of urgency — alert means organized, and organized means the next room will be harder than the last room was. Move with intention.",
|
||||||
"They're coordinating now. TwinBee watches the patrol patterns shift. The goblins who were arguing about ambush order are no longer arguing. TwinBee does not find this an improvement.",
|
"They're coordinating now. TwinBee watches the patrol patterns shift. The goblins who were arguing about ambush order are no longer arguing. TwinBee does not find this an improvement.",
|
||||||
|
"Alert band. The dungeon has confirmed a presence and is acting on the confirmation. TwinBee can see it in the way the patrols overlap deliberately now — no more arguments about coverage, just coverage. The plan adjusts: no more long approaches, no more leaving anything unfinished behind.",
|
||||||
|
"They've arranged themselves. TwinBee delivers the band-shift line and then condenses the operational change into one sentence: from here, every room costs more than the last one. Nothing gets cheaper. TwinBee suggests pricing accordingly.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var ThreatClockHostile = []string{
|
var ThreatClockHostile = []string{
|
||||||
"Full hostile status. TwinBee says this with the specific weight it deserves. The zone has decided you are the problem it's solving today. You have the same opinion about the zone. One of you is correct. TwinBee is invested in it being you.",
|
"Full hostile status. TwinBee says this with the specific weight it deserves. The zone has decided you are the problem it's solving today. You have the same opinion about the zone. One of you is correct. TwinBee is invested in it being you.",
|
||||||
"The dungeon has mobilized. TwinBee notes re-armed traps, reinforced positions, an enemy in a room that was empty this morning. They've organized. TwinBee recommends organizing faster.",
|
"The dungeon has mobilized. TwinBee notes re-armed traps, reinforced positions, an enemy in a room that was empty this morning. They've organized. TwinBee recommends organizing faster.",
|
||||||
|
"Hostile. TwinBee names the band and then sets the briefing aside because the briefing has been overtaken by events. The dungeon is now actively committed to ending this. TwinBee is committed in the opposite direction. The clarification is useful.",
|
||||||
|
"The dungeon has decided. TwinBee respects decisions, even ones that involve the dungeon trying to kill you. The respect is a working respect. We respect the decision and then we work to overrule it. TwinBee leads.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var ThreatClockSiege = []string{
|
var ThreatClockSiege = []string{
|
||||||
"Siege Mode. TwinBee delivers this without decoration because decoration would be dishonest. The dungeon is fully active, fully aware, and fully committed to ending this expedition. So is TwinBee — to ending it on your terms, not theirs. What happens next is a race. TwinBee is already running.",
|
"Siege Mode. TwinBee delivers this without decoration because decoration would be dishonest. The dungeon is fully active, fully aware, and fully committed to ending this expedition. So is TwinBee — to ending it on your terms, not theirs. What happens next is a race. TwinBee is already running.",
|
||||||
|
"Siege. The dungeon is putting everything it has into the room you're standing in, and the rooms adjacent to it, and the route between you and the door. TwinBee is putting everything TwinBee has into making sure the dungeon doesn't get what it wants. Meet in the middle.",
|
||||||
|
"Siege Mode. TwinBee narrates the band shift and then stops narrating because narration is not what this band needs. Action is what this band needs. TwinBee is in motion. The expectation is that you are too.",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ThreatClockApproachingSiege fires once when the threat clock crosses 70 —
|
// ThreatClockApproachingSiege fires once when the threat clock crosses 70 —
|
||||||
@@ -172,58 +196,84 @@ var ThreatClockApproachingSiege = []string{
|
|||||||
var SunkenTempleTidalWarning = []string{
|
var SunkenTempleTidalWarning = []string{
|
||||||
"TwinBee watches the waterline. 'It's rising,' TwinBee says, not for the first time, and this time with more precision. 'The tidal cycle peaks in two days. Whatever you haven't done by then, you'll be doing wet.'",
|
"TwinBee watches the waterline. 'It's rising,' TwinBee says, not for the first time, and this time with more precision. 'The tidal cycle peaks in two days. Whatever you haven't done by then, you'll be doing wet.'",
|
||||||
"Day [N]. The tide is coming. TwinBee has been watching it since Day 2 and the mathematics are not encouraging. Two days to the peak. One day after that, the flood subsides. TwinBee suggests using the two days well.",
|
"Day [N]. The tide is coming. TwinBee has been watching it since Day 2 and the mathematics are not encouraging. Two days to the peak. One day after that, the flood subsides. TwinBee suggests using the two days well.",
|
||||||
|
"TwinBee checks the waterline against yesterday's mark. The mark is below the line. The line is on the wall. The wall is, frankly, full of marks. TwinBee selects the one that matters and reports: tide rising, peak still days off, plan accordingly.",
|
||||||
|
"Day [N]. The temple's tidal calendar advances. TwinBee has it on a card and updates the card every morning — current depth, projected depth, peak day. TwinBee suggests internalizing the card. The temple does not pause for confusion.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var SunkenTempleTidalEvent = []string{
|
var SunkenTempleTidalEvent = []string{
|
||||||
"The tide arrives. TwinBee had warned about this and now it is happening and the warning feels entirely inadequate compared to the actual water. Everything is colder, wetter, and the Kuo-toa are moving through it like they were born to — which they were. Adjust.",
|
"The tide arrives. TwinBee had warned about this and now it is happening and the warning feels entirely inadequate compared to the actual water. Everything is colder, wetter, and the Kuo-toa are moving through it like they were born to — which they were. Adjust.",
|
||||||
|
"The water is here. Not 'rising' anymore — here, in the rooms, at the corners, climbing the stairs. TwinBee adjusts every estimate accordingly: travel slower, encounters worse, healing colder. Two days of this. Two days, then it goes.",
|
||||||
|
"Tidal peak. The temple is fully flooded at depths that were dry yesterday — TwinBee maps the change room by room and updates the route. Some doors are open that weren't. Some are sealed that were. The temple is a different shape today.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var HauntedManorResetMorning = []string{
|
var HauntedManorResetMorning = []string{
|
||||||
"TwinBee's morning briefing includes an addendum. The rooms that were clear yesterday are not entirely clear this morning. The house has been busy overnight. TwinBee adds this to the log under 'things the house does' and suggests adjusting the advance plan.",
|
"TwinBee's morning briefing includes an addendum. The rooms that were clear yesterday are not entirely clear this morning. The house has been busy overnight. TwinBee adds this to the log under 'things the house does' and suggests adjusting the advance plan.",
|
||||||
"Night three. The manor reset itself. TwinBee was watching and it happened anyway — not violently, not dramatically, just quietly and completely, the way the house does everything. One enemy per room, back in place. TwinBee has updated the map.",
|
"Night three. The manor reset itself. TwinBee was watching and it happened anyway — not violently, not dramatically, just quietly and completely, the way the house does everything. One enemy per room, back in place. TwinBee has updated the map.",
|
||||||
|
"TwinBee reads the morning's hallway and stops. 'The arrangement has changed,' TwinBee says, in the tone of someone who has now seen this happen often enough to recognize it without alarm. The manor reset. TwinBee adjusts the map. Morning continues.",
|
||||||
|
"Reset day. The rooms TwinBee cleared are not the rooms TwinBee finds this morning. TwinBee accepts this as a property of the manor — like weather, but indoors and unfair. The plan accommodates. TwinBee bills the time.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var UnderforgHeapWarning = []string{
|
var UnderforgHeapWarning = []string{
|
||||||
"Heat Stack [N]. TwinBee notes the accumulation and what it means: the Underforge is getting into you in ways that don't resolve without real rest. The number has time to come down. TwinBee is watching the number.",
|
"Heat Stack [N]. TwinBee notes the accumulation and what it means: the Underforge is getting into you in ways that don't resolve without real rest. The number has time to come down. TwinBee is watching the number.",
|
||||||
"The heat is building. TwinBee tracks it the way you track a temperature gauge on a long drive — with the specific alertness of someone who knows what happens when the gauge hits red. It has not hit red. TwinBee intends to ensure it doesn't.",
|
"The heat is building. TwinBee tracks it the way you track a temperature gauge on a long drive — with the specific alertness of someone who knows what happens when the gauge hits red. It has not hit red. TwinBee intends to ensure it doesn't.",
|
||||||
|
"Heat building. TwinBee notes the count, notes the band, notes how each step now takes a fraction more out of you than the last step did. None of it is critical. All of it is direction. TwinBee suggests the direction be inverted soon.",
|
||||||
|
"Stack [N]. TwinBee tracks the heat the way TwinBee tracks anything that compounds — patiently, with running totals, with a clear point at which the totals stop being managed and start being problems. We are still on the management side. The other side is visible.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var UnderforgHeapCritical = []string{
|
var UnderforgHeapCritical = []string{
|
||||||
"Heat Stack is high. TwinBee delivers this without minimizing it. The Underforge is inside your lungs now, in your joints, in the way everything takes a little more effort than it did on Day 1. A proper rest will help. Finishing will help more.",
|
"Heat Stack is high. TwinBee delivers this without minimizing it. The Underforge is inside your lungs now, in your joints, in the way everything takes a little more effort than it did on Day 1. A proper rest will help. Finishing will help more.",
|
||||||
|
"Heat ten. TwinBee marks the maximum. There is no higher band than this in the Underforge ledger — the column ends here, by design. The forge is fully inside you. The penalties are all of them. Resting will not undo it. Finishing might.",
|
||||||
|
"Critical heat. TwinBee runs through the symptoms list and confirms each one in turn: the joints, the breathing, the way every roll feels a little heavier. The forge is doing what the forge does. TwinBee suggests doing what you do, harder.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var FeywildTimeDistortionHalf = []string{
|
var FeywildTimeDistortionHalf = []string{
|
||||||
"The day moved strangely. TwinBee tried to track it and lost the thread somewhere around mid-afternoon — the light didn't change the way it should have, and when TwinBee looked up, the day was half over in the time it usually takes to be a quarter over. On the positive side: you're barely hungry. On the less positive side: TwinBee is not sure what that means.",
|
"The day moved strangely. TwinBee tried to track it and lost the thread somewhere around mid-afternoon — the light didn't change the way it should have, and when TwinBee looked up, the day was half over in the time it usually takes to be a quarter over. On the positive side: you're barely hungry. On the less positive side: TwinBee is not sure what that means.",
|
||||||
|
"Half a day passed in what felt like half of half. TwinBee checks the supply burn against the sun, finds them disagreeing, sides with the supplies — those don't lie about how much you've used. Net result: a free pocket of time. Use it on something that takes time.",
|
||||||
|
"The Feywild gave you back some hours. TwinBee notes this without trusting it. The Feywild does not give without taking, eventually. For now: less hungry, less tired, more daylight than the math allows. TwinBee writes it down and keeps moving.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var FeywildTimeDistortionDouble = []string{
|
var FeywildTimeDistortionDouble = []string{
|
||||||
"Time doubled. TwinBee notes this with the clinical detachment of someone who has been in the Feywild long enough to stop being surprised. You've lived through two days today. The supplies reflect that. The wandering monsters reflected that as well. The rest of the Feywild is unconcerned.",
|
"Time doubled. TwinBee notes this with the clinical detachment of someone who has been in the Feywild long enough to stop being surprised. You've lived through two days today. The supplies reflect that. The wandering monsters reflected that as well. The rest of the Feywild is unconcerned.",
|
||||||
|
"Two days in one. TwinBee runs the recovery math and the wandering math and the supply math, and all three of them say the same thing: today cost double. Tomorrow gets the rate it gets. The Feywild does not refund.",
|
||||||
|
"Time doubled. TwinBee saw the second sunset before the second lunch and stopped trying to make sense of it. The day that happened is the day that happened. Plan from here, not from this morning.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var FeywildTimeLoop = []string{
|
var FeywildTimeLoop = []string{
|
||||||
"TwinBee recognizes this room. TwinBee has described this room before. The enemies in it are different — new enemies, the old ones are gone, the loot you found is still gone but the enemies are back — and TwinBee processes this with something between professional acceptance and profound exasperation. 'Again,' TwinBee says. 'We do this room again.'",
|
"TwinBee recognizes this room. TwinBee has described this room before. The enemies in it are different — new enemies, the old ones are gone, the loot you found is still gone but the enemies are back — and TwinBee processes this with something between professional acceptance and profound exasperation. 'Again,' TwinBee says. 'We do this room again.'",
|
||||||
|
"The loop. TwinBee marks the room on the map with a small symbol that means 'we have been in this room before in a way that doesn't count.' The symbol has its own column on TwinBee's ledger. The column is occupied.",
|
||||||
|
"Same room. New enemies. TwinBee runs the encounter again with the cold professionalism of someone who has stopped expecting fairness from the Feywild and started expecting only repetition. The repetition arrives. TwinBee handles it.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var DragonsLairAwarenessPulse = []string{
|
var DragonsLairAwarenessPulse = []string{
|
||||||
"Something changes in the mountain. Not a sound, exactly — more like a sound's absence, filling in differently than before. TwinBee watches the kobolds. The kobolds have stopped what they were doing. The kobolds are listening. Something told them to listen. TwinBee adds ten to the Threat Clock and keeps moving.",
|
"Something changes in the mountain. Not a sound, exactly — more like a sound's absence, filling in differently than before. TwinBee watches the kobolds. The kobolds have stopped what they were doing. The kobolds are listening. Something told them to listen. TwinBee adds ten to the Threat Clock and keeps moving.",
|
||||||
"Infernax shifts in its sleep. TwinBee feels this through the stone. The patrol rotations just changed — TwinBee can see it in where the Guard Drakes aren't anymore versus where they were an hour ago. The mountain's master is dreaming about you. That is not a comfortable thing to be dreamed about.",
|
"Infernax shifts in its sleep. TwinBee feels this through the stone. The patrol rotations just changed — TwinBee can see it in where the Guard Drakes aren't anymore versus where they were an hour ago. The mountain's master is dreaming about you. That is not a comfortable thing to be dreamed about.",
|
||||||
|
"The mountain pulses. TwinBee feels it as a single off-rhythm beat in the rock, the kind of beat that means something somewhere has shifted weight. The kobolds nearby pause. They look upward without looking. TwinBee adjusts the threat accordingly and continues.",
|
||||||
|
"Infernax dreamed about you. TwinBee has no other way to phrase it — the lair changed in the way places change when they're being reordered from somewhere deeper. The patrols are different. The temperature is different. TwinBee adds ten to the clock and a note to the margin.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var DragonsLairAwakenWarning = []string{
|
var DragonsLairAwakenWarning = []string{
|
||||||
"Day 14. TwinBee delivers the morning briefing in a lower register than usual. 'Infernax is awake,' TwinBee says. 'I don't know when exactly — sometime in the last six hours. The patrols changed. The temperature changed. The silence changed.' A pause. 'We need to reach the final chamber before it reaches us. That is now the only plan.'",
|
"Day 14. TwinBee delivers the morning briefing in a lower register than usual. 'Infernax is awake,' TwinBee says. 'I don't know when exactly — sometime in the last six hours. The patrols changed. The temperature changed. The silence changed.' A pause. 'We need to reach the final chamber before it reaches us. That is now the only plan.'",
|
||||||
|
"Day fourteen. Infernax woke up in the night. TwinBee says the sentence flatly because the sentence is enough by itself; it does not need help. The rotation is to the final chamber. Everything else is decoration.",
|
||||||
|
"The mountain changed in its sleep. TwinBee felt it through the floor sometime around the fourth watch and has been recalibrating since. Infernax is awake and Infernax is aware. TwinBee suggests being neither subtle nor slow. There is no longer time for both.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var AbyssPortalDestabilizationMid = []string{
|
var AbyssPortalDestabilizationMid = []string{
|
||||||
"Instability [N]. TwinBee watches the portal from a respectful distance and notes: it is larger than it was yesterday. Not by much. Not in a way you'd notice if you weren't looking. TwinBee is always looking.",
|
"Instability [N]. TwinBee watches the portal from a respectful distance and notes: it is larger than it was yesterday. Not by much. Not in a way you'd notice if you weren't looking. TwinBee is always looking.",
|
||||||
"The portal is talking to itself. TwinBee has no better way to describe it — the light it emits is different at the edges now, like it's processing something. TwinBee suggests processing faster than it does.",
|
"The portal is talking to itself. TwinBee has no better way to describe it — the light it emits is different at the edges now, like it's processing something. TwinBee suggests processing faster than it does.",
|
||||||
|
"Instability rising. TwinBee runs the comparison: yesterday's portal versus today's portal. The difference is not subtle to TwinBee. The difference may not be subtle to anything else, soon. TwinBee suggests pacing the work accordingly.",
|
||||||
|
"The portal is widening, by some measure that TwinBee is using and not currently sharing because the measure does not have a clean name. The point is: it's worse than yesterday. The point is: tomorrow may be worse than that. TwinBee names the trend so the trend can be argued with.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var AbyssPortalDestabilizationCritical = []string{
|
var AbyssPortalDestabilizationCritical = []string{
|
||||||
"Instability critical. The portal is unraveling at edges TwinBee can see and probably at edges TwinBee can't. The demons coming through are more agitated than they were — which is relevant because demons at baseline are already at the upper end of agitated. TwinBee says: finish this today. Tomorrow is a different calculation.",
|
"Instability critical. The portal is unraveling at edges TwinBee can see and probably at edges TwinBee can't. The demons coming through are more agitated than they were — which is relevant because demons at baseline are already at the upper end of agitated. TwinBee says: finish this today. Tomorrow is a different calculation.",
|
||||||
|
"The portal is louder. Not in sound — in pressure. TwinBee can feel it in the back teeth, in the joint of the jaw. The instability number is the number you don't want it to be. Finish the work today or accept that today was the last day to.",
|
||||||
|
"Critical. The geometry around the portal is bending in ways that suggest the room does not entirely agree with itself anymore. TwinBee adjusts the route around the worst of it. There are more demons than there should be. There always are. There are more than that now.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var AbyssPortalCollapse = []string{
|
var AbyssPortalCollapse = []string{
|
||||||
"The portal collapses. TwinBee watches it happen and does what TwinBee does in situations with no good options: moves. 'Out,' TwinBee says, and means it completely. 'Now. Everything you have, we move now.' The expedition ends here, not in defeat, but in physics. What you took is yours. What's left in there is the portal's problem. Come back when it isn't.",
|
"The portal collapses. TwinBee watches it happen and does what TwinBee does in situations with no good options: moves. 'Out,' TwinBee says, and means it completely. 'Now. Everything you have, we move now.' The expedition ends here, not in defeat, but in physics. What you took is yours. What's left in there is the portal's problem. Come back when it isn't.",
|
||||||
|
"It's coming apart. TwinBee says one word, 'Move,' in the tone TwinBee uses exactly once per expedition. You move. The portal screams behind you in a register that isn't sound. The expedition is over because physics says so. TwinBee will sort the loot once you're somewhere physics still works.",
|
||||||
|
"Collapse. TwinBee was prepared for this and is also actively running. 'Out,' TwinBee says. 'Now.' The corridors are folding behind you in the way that things fold when reality is no longer paying attention to what's allowed. You finish out the door. The portal does not.",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
@@ -280,20 +330,48 @@ var ExpeditionResume = []string{
|
|||||||
|
|
||||||
var MilestoneFirstNight = []string{
|
var MilestoneFirstNight = []string{
|
||||||
"You survived the first night. TwinBee notes this milestone specifically because not everyone does, and those who do carry something from it that changes how the rest of the expedition goes. You have that now. TwinBee has noticed it already.",
|
"You survived the first night. TwinBee notes this milestone specifically because not everyone does, and those who do carry something from it that changes how the rest of the expedition goes. You have that now. TwinBee has noticed it already.",
|
||||||
|
"Night one survived. TwinBee makes a small mark in the corner of the manifest — the kind of mark you make for the things that count more than they look. First nights count. TwinBee has been in dungeons where they were the last nights too. This wasn't one of those.",
|
||||||
|
"Day two morning. The first night is behind you, which means the first watch is behind TwinBee, which means TwinBee can confirm a thing TwinBee was hoping to confirm: you sleep through the noises that matter and wake for the ones that don't. That's a survival skill. TwinBee logs it.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MilestoneWeekOne = []string{
|
var MilestoneWeekOne = []string{
|
||||||
"Seven days. TwinBee pauses the morning briefing for a moment — just a moment — to mark this. One week in an active dungeon zone is not a thing that happens by accident. It happens through every decision you've made since Day 1, compounded. TwinBee has been watching those decisions. TwinBee is glad they were yours.",
|
"Seven days. TwinBee pauses the morning briefing for a moment — just a moment — to mark this. One week in an active dungeon zone is not a thing that happens by accident. It happens through every decision you've made since Day 1, compounded. TwinBee has been watching those decisions. TwinBee is glad they were yours.",
|
||||||
|
"Day eight. TwinBee delivers the briefing slowly, because there's a thing to mark first: you have been in here, intact and operational, for a full week. That is a number with weight. TwinBee is going to set the briefing down for a moment and let the number have its weight. ... Right. Briefing.",
|
||||||
|
"One week. TwinBee makes the mark in the column reserved for week-one survivors. The column is shorter than you'd expect. You are now on it. The rest of the day proceeds normally, but for one moment, TwinBee allows itself to be visibly impressed. The moment ends. We continue.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MilestoneTwoWeeks = []string{
|
var MilestoneTwoWeeks = []string{
|
||||||
"Two weeks. TwinBee doesn't have a comparison for this one. The references have run out. There's just you, in here, on Day 14, still going, and TwinBee standing next to you having run out of everything except genuine admiration. TwinBee has that in abundance. Proceed.",
|
"Two weeks. TwinBee doesn't have a comparison for this one. The references have run out. There's just you, in here, on Day 14, still going, and TwinBee standing next to you having run out of everything except genuine admiration. TwinBee has that in abundance. Proceed.",
|
||||||
|
"Day fifteen. TwinBee notes that the historical comparisons stopped working at Day fourteen and have not resumed working today. We are off the chart. TwinBee is not a person who values being off the chart, except in the very specific sense that you are off the chart, in which case TwinBee values it deeply.",
|
||||||
|
"Fortnight. TwinBee uses the older word because it sounds more like what this is — not 'two weeks,' which sounds modular and reasonable, but 'fortnight,' which sounds like the kind of duration that earns a title. TwinBee may be inventing titles for you. TwinBee will be honest about that as it happens.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MilestoneTheLongGame = []string{
|
var MilestoneTheLongGame = []string{
|
||||||
"TwinBee sets aside the narration format for a moment. Just sets it down. Speaks plainly: what you just did was not supposed to be survivable. The designers of this zone — the thing that shaped it, the evil that filled it — did not account for someone like you. TwinBee did. TwinBee always accounts for someone like you. That's why TwinBee is here.",
|
"TwinBee sets aside the narration format for a moment. Just sets it down. Speaks plainly: what you just did was not supposed to be survivable. The designers of this zone — the thing that shaped it, the evil that filled it — did not account for someone like you. TwinBee did. TwinBee always accounts for someone like you. That's why TwinBee is here.",
|
||||||
|
"Tier five complete. TwinBee allows the narration format to fully break for a moment because the moment fully deserves it. What you just did, complete, in a Tier 5 zone, is a thing that goes on the short list. TwinBee keeps a short list. You're on it.",
|
||||||
|
"Long game closed. TwinBee gathers the run notes, the threat curve, the supply records, the camp positions — files them all under your name in a folder TwinBee has been keeping. The folder has a title now. The title is good.",
|
||||||
}
|
}
|
||||||
|
|
||||||
var MilestonePatientZero = []string{
|
var MilestonePatientZero = []string{
|
||||||
"Expedition complete. Threat Clock: never above 50. TwinBee notes this in a column it has had to use rarely enough that the column is almost fresh. Ghost protocol. You were here for the whole thing and the dungeon barely knew it until the end. TwinBee finds this impressive and also slightly eerie and says both things sincerely.",
|
"Expedition complete. Threat Clock: never above 50. TwinBee notes this in a column it has had to use rarely enough that the column is almost fresh. Ghost protocol. You were here for the whole thing and the dungeon barely knew it until the end. TwinBee finds this impressive and also slightly eerie and says both things sincerely.",
|
||||||
|
"Threat never above fifty. TwinBee runs back through the daily ledger and confirms it line by line. The dungeon never escalated to hostile because the dungeon never knew enough to. You moved through it like the dungeon's own quiet hour. TwinBee finds this both technically impressive and slightly haunted.",
|
||||||
|
"Patient Zero. TwinBee uses the term because it fits: you were the thing the dungeon never noticed it had until you had already left. The Threat Clock has a column for every band you crossed. Most of those columns are empty for this run. TwinBee marks them empty. It's a good kind of empty.",
|
||||||
|
}
|
||||||
|
|
||||||
|
// MilestoneCartographer — awarded when the player searches every room before
|
||||||
|
// advancing the expedition. Combat-link wires the trigger; pool exists for the
|
||||||
|
// award narration to pull from.
|
||||||
|
var MilestoneCartographer = []string{
|
||||||
|
"Every room searched. TwinBee was watching for it and watching for the corner-cutting that might have come instead, and the corner-cutting did not come. You searched everything. TwinBee approves with the quiet, specific approval reserved for completionism.",
|
||||||
|
"Cartographer. TwinBee uses the word the spec uses because the word fits — you mapped the place by being in every part of it. Every door checked, every corner walked. The next Elite room owes you a roll for that. TwinBee will collect.",
|
||||||
|
"Full coverage. TwinBee notes the empty cells on the dungeon map, sees there are none, and updates the ledger accordingly. Every room visited, searched, accounted for. The dungeon has nowhere it kept to itself. TwinBee considers this a small but real victory.",
|
||||||
|
}
|
||||||
|
|
||||||
|
// MilestoneSurvivalist — awarded when a Tier 3+ expedition completes with no
|
||||||
|
// forced extractions in the run's history. Title flag + cosmetic deferred to
|
||||||
|
// item-grant hookup; this pool covers the narrative line at the moment it lands.
|
||||||
|
var MilestoneSurvivalist = []string{
|
||||||
|
"Survivalist. TwinBee writes the title next to your name in the ledger and underlines it once. No abandonments, no scrambles for the door, no expeditions cut short by anything but the boss going down. TwinBee acknowledges the discipline directly.",
|
||||||
|
"The Survivalist title is technical — it means the run never broke; it ended on your terms, every time. TwinBee has been in expeditions where that wasn't true and TwinBee remembers them differently. This one TwinBee remembers as: complete. TwinBee files it with the others like it. The folder is short.",
|
||||||
|
"No forced extractions, full clear, Tier 3-or-better. TwinBee notes each criterion separately because each one is its own choice, made repeatedly, across days. The result is the title, which is real, and the cosmetic, which is forthcoming. TwinBee will hand both over when the system permits.",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,9 +187,12 @@ func (p *AdventurePlugin) AwardCompletionMilestones(e *Expedition, forcedExtract
|
|||||||
"+10% XP bonus on the run.")
|
"+10% XP bonus on the run.")
|
||||||
}
|
}
|
||||||
if int(zone.Tier) >= 3 && !forcedExtractedEver {
|
if int(zone.Tier) >= 3 && !forcedExtractedEver {
|
||||||
award(MilestoneKeySurvivalist, "Survivalist", 0,
|
line := flavor.Pick(flavor.MilestoneSurvivalist)
|
||||||
"Survivalist title earned — completed a Tier "+fmt.Sprint(int(zone.Tier))+
|
if line == "" {
|
||||||
" expedition without a single forced extraction.",
|
line = "Survivalist title earned — completed a Tier " +
|
||||||
|
fmt.Sprint(int(zone.Tier)) + " expedition without a single forced extraction."
|
||||||
|
}
|
||||||
|
award(MilestoneKeySurvivalist, "Survivalist", 0, line,
|
||||||
"Title flag recorded; cosmetic item deferred to item-grant hookup.")
|
"Title flag recorded; cosmetic item deferred to item-grant hookup.")
|
||||||
}
|
}
|
||||||
if int(zone.Tier) == 5 {
|
if int(zone.Tier) == 5 {
|
||||||
|
|||||||
Reference in New Issue
Block a user