Files
gogobee/internal/plugin/adventure_flavor_babysit.go
prosolis 9e1a1f606c Adv 2.0 D&D layer: Phases 1-8 + Phase 9 SP1+SP2
Combines all uncommitted D&D work into one checkpoint:

Phases 1-8 (per gogobee_dnd_session_summary.md):
- Race/class/stats system, !setup flow, !sheet, !respec
- d20-vs-AC combat with race/class passives, auto-migration
- XP/level-up, skill checks, NPC refund hooks
- Equipment slot mapping, rarity, !rest short/long
- Pre-arm active abilities, resource pools
- Bestiary, !roll/!stats/!level, onboarding DM
- Audit fixes A-I, flavor wiring under internal/flavor/
- Phase 8 weapon dice + armor AC tables (gogobee_equipment_appendix)

Phase 9 SP1 — spell system foundations:
- 79 SpellDefinitions (76 in-scope + 3 reaction-deferred)
- dnd_known_spells, dnd_spell_slots tables
- pending_cast / concentration_* columns on dnd_character
- Slot tables for Mage/Cleric/Ranger, DC + attack-bonus math
- Long-rest refreshes slots; respec wipes spell state
- Auto-grant default known list on !setup confirm and auto-migration

Phase 9 SP2 — !cast / !spells / !prepare commands:
- Out-of-combat HEAL and UTILITY resolve immediately
- Damage/control/buff queue as pending_cast for next combat
- Audit-style save-then-debit, slot refund on save failure
- !cast --drop, concentration supersession, prep-cap enforcement
- Reaction spells refused with Phase 11 note

SP3 (combat-time resolution of pending_cast) and SP4 (full prep/learn
tests) are next. Build clean, full test suite green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:25:21 -07:00

49 lines
2.4 KiB
Go

package plugin
import "math/rand/v2"
// ── Babysitting Service Flavor Pools ────────────────────────────────────────
// babysitConfirmLines are shown on purchase confirmation.
var babysitConfirmLines = []string{
"Your adventurer is now in capable hands. Relatively speaking. We've done this before.",
"Service begins immediately. Go do whatever it is you do when you're not doing this.",
"Payment received. Your adventurer will be fine. Probably.",
"We've looked at your skill levels. We know what needs work. We'll handle it. You handle whatever you're handling.",
}
// babysitRivalRefusalLines are used when a rival showed up during babysitting.
// All lines use exactly two %s: (rival display name, date string).
var babysitRivalRefusalLines = []string{
"%s came by on %s with what appeared to be prepared remarks. They were turned away at the door. Their remarks went undelivered. This is probably for the best.",
"%s attempted to initiate a duel on %s. The babysitter informed them this was not possible. They stood there for a moment. Then left.",
"%s showed up on %s. The babysitter made them regret it in ways you could only dream of doing.",
}
// babysitDiaperLines appear once per summary, rotated.
var babysitDiaperLines = []string{
"The diapers have been handled. We don't discuss the diapers.",
"Diaper situation: resolved. No further details will be provided.",
"Standard diaper protocols were followed. The adventurer was cooperative. Mostly.",
"The diapers. They happened. They were handled. Moving on.",
}
// babysitHighlightLines fire on auto-babysit days when the haul was unusually
// good — making the babysitter feel like a companion rather than a silent
// insurance product. Each line takes one %s slot for the focused skill name.
var babysitHighlightLines = []string{
"The babysitter says your kid was a natural at %s today. They want it noted.",
"Solid day on the %s circuit, apparently. The babysitter looked smug about it.",
"Whatever the babysitter did with your %s gear — it worked. The numbers don't lie.",
"The babysitter handed in a %s haul and said nothing. The smug silence said plenty.",
"Your kid is, against the odds, getting alarmingly good at %s under TwinBee's care.",
}
// pickBabysitFlavor returns a random entry from the given pool.
func pickBabysitFlavor(pool []string) string {
if len(pool) == 0 {
return ""
}
return pool[rand.IntN(len(pool))]
}