mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Adv 2.0 D&D Phase 11 D4c: Tier 3 zone flavor files
New additive flavor files (zone_manor_blackspire_flavor.go,
zone_underforge_flavor.go) with elite-room intros, boss ability
callouts, and zone lore. Manor reuses RoomEntryHauntedManor from
twinbee_gm_flavor.go; Underforge had no canonical RoomEntry/BossEntry
pools yet, so both are defined in the new zone file.
Aldric Blackspire: Multiattack (life drain) / Charm / Children of the
Night / Mist Form / Phase Two
Emberlord Thyrak: Molten Strike / Forge Breath / Living Forge /
Construct Resilience / Phase Two
Wires zoneRoomEntryPool, bossEntryPool, zoneLorePool,
bossSignaturePool, and eliteRoomEntryPool to the new tier-3 pools.
Adds Tier 3 routing tests for boss-entry, elite line, lore, and
room-entry overlays.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
108
internal/flavor/zone_manor_blackspire_flavor.go
Normal file
108
internal/flavor/zone_manor_blackspire_flavor.go
Normal file
@@ -0,0 +1,108 @@
|
||||
// DO NOT REWRITE, SUMMARIZE, OR SHORTEN ANY ENTRIES IN THIS FILE
|
||||
// zone_manor_blackspire_flavor.go
|
||||
// Tier 3 zone flavor — Haunted Manor of Blackspire. Additive only. Pools
|
||||
// sampled by internal/plugin via deterministic per-run, per-room hashing.
|
||||
//
|
||||
// Voice rules (from gogobee_dungeon_zones.md §3.3):
|
||||
// • Third person for description; second person for outcomes.
|
||||
// • Boss callouts get a beat of cinema. Don't overrun.
|
||||
// • TwinBee references the right era — NES, SNES, arcade. Not modern.
|
||||
//
|
||||
// The canonical twinbee_gm_flavor.go ships RoomEntryHauntedManor and that
|
||||
// pool is wired in dnd_zone_narration.go. This file adds the boss-entry
|
||||
// pool, the elite-room intros (Revenant), boss ability callouts for Lord
|
||||
// Aldric Blackspire, and zone-specific lore.
|
||||
|
||||
package flavor
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// BOSS ENTRY — Lord Aldric Blackspire
|
||||
// Defined here because no entry exists in twinbee_gm_flavor.go for this boss.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var BossEntryAldricBlackspire = []string{
|
||||
"The portrait above the mantel was not finished — the painter clearly stopped partway through the eyes. The eyes in the portrait are now finished. They were finished by being looked through. Lord Aldric Blackspire steps out of the frame the way a man steps out of a coat: practiced, unhurried, the gesture of someone who has done this many times. His clothes are seventy years out of fashion and immaculate. 'You're early,' he says, and the word is polite the way a knife is polite — a tool that has not yet committed to its purpose. TwinBee says, very quietly, 'That's a vampire. The signet on his hand is not jewelry. Don't take what he offers.'",
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// ELITE ROOM ENTRY — Haunted Manor (Revenant)
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var EliteRoomEntryManorBlackspire = []string{
|
||||
"The chamber ahead was a study, once. The desk is still set for work — inkwell uncapped, ledger open, a pen laid down mid-sentence. The man at the desk turns his head with the slow patience of someone who has been waiting at this desk for forty years for one specific person to walk in. He is not looking at you. He is looking past you, at someone who isn't there. Yet. TwinBee identifies the silhouette and says: 'Revenant. He's not here for us. He's here for whoever wronged him. Try not to look like them.'",
|
||||
"You enter what appears to be a guest bedroom. The bed is made. The candles are lit. A man sits on the edge of the bed with his back to you, perfectly still. He has been perfectly still for a long time. When he turns, only his head turns, and TwinBee notes the impossible angle and files this under 'revenant — directed undead, single purpose, finite lifespan, very patient.' The patience is the part that worries TwinBee.",
|
||||
"The hallway dead-ends in a chapel. There is a kneeling figure at the altar. The candles around him are unlit but somehow casting shadows. He has been praying since before the manor was haunted, and the prayer was not a request — it was a contract. TwinBee says: 'Revenant. The contract is the encounter. Break the contract, end the fight.'",
|
||||
"A library. The man at the table is reading a book that has no pages. He is reading it carefully. He looks up when you enter and his expression does something that suggests he was expecting a different visitor and is willing to make do. TwinBee notes the revenant's hands — the bones in the wrong places, the joints set with intent — and recommends ranged engagement until the geometry of the threat is clear.",
|
||||
"The ballroom is empty except for one figure standing in the exact center, not dancing, not waiting, simply standing. The chandeliers above him are not moving. They should be moving — they were moving in the last room — and the fact that they have stopped where this figure is standing tells TwinBee everything TwinBee needed to know. 'Revenant in the middle of a stilled room,' TwinBee says. 'He brought the silence with him.'",
|
||||
"A nursery. Untouched. The cradle still rocks. The figure beside the cradle was, in life, the sort of man people did not survive being wronged by. In death he has been more thorough. TwinBee notes the revenant's grip on the cradle's edge and suggests, quietly, that whatever happened in this room is not the encounter — the encounter is what walks out of it.",
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// BOSS ABILITY CALLOUTS — Lord Aldric Blackspire
|
||||
// Used as a one-line cinematic suffix to BossEntryAldricBlackspire when combat starts.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
// Multiattack: Unarmed Strike + Bite (life drain) every turn.
|
||||
var AldricMultiattackLines = []string{
|
||||
"Aldric multiattacks every turn — Unarmed Strike, then Bite. The bite drains. Whatever HP he takes from you, he keeps. TwinBee says: 'He's a battery with manners. Don't let him charge.'",
|
||||
"Two hits a turn, and the second one is the one that funds the rest of the fight. The bite returns HP to him equal to the damage dealt. TwinBee notes that this changes the math on burst-vs-sustain considerably.",
|
||||
"Strike, then bite. The bite is the resource transfer. TwinBee files this under 'fights where defense is offense' — every point of damage you avoid is a point he doesn't get to take.",
|
||||
}
|
||||
|
||||
// Charm: WIS DC 17 or Charmed for 24h (broken by damage).
|
||||
var AldricCharmLines = []string{
|
||||
"He looks at one of you and the look is a question and the question is being answered without your permission. WIS DC 17. On a fail: charmed for twenty-four hours, broken by damage. TwinBee says: 'High DC. Have someone designated to slap the charmed party once.'",
|
||||
"Charm. WIS DC 17. The duration is twenty-four hours and the only out is taking damage. TwinBee notes the irony — the cure is in the room, applied by your own party, in the hardest possible way.",
|
||||
"Aldric's gaze settles. WIS save now. Failure is a long-term problem — a full day of charm — and the only solvent is a friendly hit. TwinBee files this under 'social-coded crowd control with a violent escape clause.'",
|
||||
}
|
||||
|
||||
// Children of the Night (1/combat): summons 2d6 Bat Swarms or 3d6 Rats.
|
||||
var AldricChildrenLines = []string{
|
||||
"Once per fight he calls. Bats from the chimney, rats from the walls — 2d6 swarms or 3d6 rats, GM's choice, both bad. TwinBee says: 'AoE clears the adds. Don't let them stack tokens on whoever's charmed.'",
|
||||
"Children of the Night. The walls produce. The ceiling produces. TwinBee tracks the adds and recommends an AoE before the swarms occupy enough squares to be a separate problem.",
|
||||
"He raises a hand and the manor answers. The room fills. Bats or rats or both. TwinBee notes this is a one-time effect per combat — survive the wave and the room belongs to you again.",
|
||||
}
|
||||
|
||||
// Mist Form: at 0 HP retreats to coffin; must destroy coffin in 30 turns or fully regenerates.
|
||||
var AldricMistFormLines = []string{
|
||||
"Drop him to zero and he doesn't drop — he goes to mist, retreats to a coffin somewhere in the manor. Thirty turns to find and destroy it. TwinBee says: 'Find the coffin first, fight the count second. The order matters.'",
|
||||
"Mist Form. At 0 HP he becomes mist and goes home. Home is a coffin. The coffin is somewhere in the manor and you have thirty turns to break it. TwinBee files this under 'zero is not death, zero is a timer.'",
|
||||
"Like the Castlevania bosses that didn't actually die — except those games gave you the next room. This one gives you a thirty-turn coffin hunt. TwinBee respects the design and recommends scouting on the way in.",
|
||||
}
|
||||
|
||||
// Phase 2 (Mist destroyed): all attacks have advantage; AoE Charm.
|
||||
var AldricPhaseTwoLines = []string{
|
||||
"Coffin destroyed. He returns furious. All attacks have advantage now and his Charm goes AoE — every party member, WIS DC 17 each turn. TwinBee says: 'You won the long game. The short game just got shorter.'",
|
||||
"Phase two: no more retreat, no more singles. AoE charm, advantage on every swing. TwinBee tracks the saves and reminds you that advantage on the boss means disadvantage on your continuing-to-stand.",
|
||||
"Without the coffin, Aldric's restraint is gone. The fight goes loud. Charm sweeps the room each turn. TwinBee stops narrating long enough to breathe and says: 'Burn him.'",
|
||||
}
|
||||
|
||||
// AldricSignatureCallouts — combined pool for boss-entry suffix.
|
||||
// Phase-two lines stay separate (surfaced via dedicated phase-two helper).
|
||||
var AldricSignatureCallouts = func() []string {
|
||||
out := make([]string, 0,
|
||||
len(AldricMultiattackLines)+
|
||||
len(AldricCharmLines)+
|
||||
len(AldricChildrenLines)+
|
||||
len(AldricMistFormLines))
|
||||
out = append(out, AldricMultiattackLines...)
|
||||
out = append(out, AldricCharmLines...)
|
||||
out = append(out, AldricChildrenLines...)
|
||||
out = append(out, AldricMistFormLines...)
|
||||
return out
|
||||
}()
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// LORE — Haunted Manor of Blackspire
|
||||
// Sampled by !lore inside this zone (zone-specific pool, generic fallback).
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var LoreLinesManorBlackspire = []string{
|
||||
"The Blackspire line was old before it was wealthy and wealthy before it was cursed. The portraits are in chronological order — TwinBee has counted them. The expressions get worse as the years go on. By the seventh portrait the painter has stopped pretending the family is well.",
|
||||
"Aldric was the seventh and the last. He was not the first to make the deal — the deal had been made twice already, by his grandmother and by his uncle — but he was the first to honor it past the term of his own life. TwinBee considers this the kind of stubbornness that becomes a curse on its own, before any vampires are involved.",
|
||||
"The manor wasn't always haunted. It became haunted on a specific night, in a specific hour, and the clock on the mantel still shows that hour. TwinBee notes the clock isn't broken. The clock is keeping correct time for that one night and refusing to acknowledge any other.",
|
||||
"The portraits are not paintings. The pigment is correct, the technique is correct, the canvases are correct — but the things behind the eyes are not. TwinBee has watched a portrait blink. TwinBee declines to elaborate on which one.",
|
||||
"The Blackspire signet ring — the one that drops if you beat Aldric — is not enchanted in any conventional sense. It is recognized. The undead in this region have been raised under it, contracted under it, organized under it. They will not attack the wearer unless attacked first. TwinBee finds this both useful and uncomfortable.",
|
||||
"The deed to the manor changes hands and the manor refuses each transfer. Eleven owners on paper since the curse settled. Eleven sets of estate records. TwinBee has seen the lawyers' files. The lawyers are no longer in the profession.",
|
||||
"The vampire spawn are not converts in the romantic sense — they are the previous owners. Each buyer who didn't leave became staff. TwinBee notes which uniforms match which historical fashions and stops counting at eleven, which is the correct number.",
|
||||
}
|
||||
127
internal/flavor/zone_underforge_flavor.go
Normal file
127
internal/flavor/zone_underforge_flavor.go
Normal file
@@ -0,0 +1,127 @@
|
||||
// DO NOT REWRITE, SUMMARIZE, OR SHORTEN ANY ENTRIES IN THIS FILE
|
||||
// zone_underforge_flavor.go
|
||||
// Tier 3 zone flavor — The Underforge. Additive only. Pools sampled by
|
||||
// internal/plugin via deterministic per-run, per-room hashing.
|
||||
//
|
||||
// Voice rules (from gogobee_dungeon_zones.md §3.3):
|
||||
// • Third person for description; second person for outcomes.
|
||||
// • Boss callouts get a beat of cinema. Don't overrun.
|
||||
// • TwinBee references the right era — NES, SNES, arcade. Not modern.
|
||||
//
|
||||
// The canonical twinbee_gm_flavor.go does not (yet) ship a RoomEntry pool
|
||||
// or a BossEntry pool for this zone, so both are defined here. This file
|
||||
// also adds elite-room intros (Helmed Horror), boss ability callouts for
|
||||
// Emberlord Thyrak, and zone-specific lore.
|
||||
|
||||
package flavor
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// ROOM ENTRY — The Underforge
|
||||
// Defined here because no entry exists in twinbee_gm_flavor.go for this zone.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var RoomEntryUnderforge = []string{
|
||||
"The chamber opens onto a foundry the size of a city block. Conveyor channels of slow-cooling iron. Bellows the height of houses. Anvils arranged for workers who haven't been here in three centuries. TwinBee notes the bellows are still moving. The bellows are moving on their own.",
|
||||
"You step out onto a basalt walkway over a river of lava. The heat is impossible. The walkway is engineered to hold. TwinBee has respect for dwarven engineering and a healthy suspicion of any walkway suspended over molten rock. The two coexist comfortably.",
|
||||
"A casting hall. The molds are still in place — armor pieces, weapon halves, parts of things TwinBee cannot identify by silhouette. One mold contains a shape that's still glowing red. Something was cast recently. TwinBee files this under 'occupied' and keeps moving.",
|
||||
"The corridor smells of hot iron and an absence — the absence of beards, of song, of the specific noise dwarven forges make when they're being tended properly. TwinBee notes the silence has a shape. The shape is not reassuring.",
|
||||
"You enter a chamber where the walls are arranged in tiers and each tier is a row of forges and each forge is lit. Nobody is at the forges. The hammers are striking on their own, in tempo, with the regularity of something that has not stopped striking in a very long time.",
|
||||
"A vault door, dwarf-made, three feet thick, ajar. Not blown — ajar. Someone opened it from the inside. TwinBee notes which side the hinges are on and considers which direction the something that opened it was facing. TwinBee does not like the answer.",
|
||||
"The walkway crosses a chasm of pure heat-shimmer. You can see the far side, more or less. You cannot see what's between, except by what it does to the air. TwinBee suggests not lingering on the bridge — lingering bridges are how lava bosses get introduced.",
|
||||
"A barracks. Bunks made. Boots paired and lined up. Beards on the floor where their owners stopped being. TwinBee notes the beards have not been disturbed. Whatever happened, happened cleanly and at speed and TwinBee does not want to find out what was in a hurry.",
|
||||
"The chamber ahead is a forge gallery — nine forges in a half-circle, all of them lit, all of them tended by armored figures that don't move when you enter. The figures are not waiting to fight. The figures are working. TwinBee notes which mode you don't want to interrupt and which mode you absolutely cannot afford to interrupt.",
|
||||
"Heat radiates from the floor. Not from anything on the floor — from the floor itself. TwinBee diagnoses the cause as 'a forge directly underneath us, fully active, somehow still operating without dwarves' and finds none of those words individually reassuring.",
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// BOSS ENTRY — Emberlord Thyrak
|
||||
// Defined here because no entry exists in twinbee_gm_flavor.go for this boss.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var BossEntryEmberlordThyrak = []string{
|
||||
"The chamber is the largest forge TwinBee has narrated and TwinBee has narrated several. Nine furnaces in a ring. A central anvil the size of a wagon. The figure at the anvil is twelve feet of articulated iron and inset rune-stones that pulse to a tempo TwinBee can feel in its plating. The hammer comes down. The strike rings the room. The figure does not turn — finishes the strike, then turns. The eyes are not eyes. They are vents. 'Visitor,' Thyrak says, and the word is a furnace door opening. TwinBee takes a half-step back and says, very evenly, 'Forge-golem. Three centuries of self-improvement. Don't fight him on the lava.'",
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// ELITE ROOM ENTRY — The Underforge (Helmed Horror)
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var EliteRoomEntryUnderforge = []string{
|
||||
"The armory ahead is full. Stands and stands of polished dwarven plate, weapons racked in order, the kind of inventory that takes a lifetime to build. One suit at the far end is wearing itself. It is also holding its weapon at guard. TwinBee identifies the silhouette and says: 'Helmed Horror. Spell-immune to a list. Hit it with metal, not magic.'",
|
||||
"A hall of dwarven banners, each lit by its own brazier. At the far end, a suit of armor stands in a place of honor. The suit pivots when you enter — the helmet first, then the torso, the way an aware thing acquires a target. TwinBee notes the lack of a body inside and recommends physical damage above all else.",
|
||||
"You enter a workshop that is still in service. Hammers strike. Bellows pump. None of the workers are alive and none of them notice you, except the one nearest the door, which sets down its hammer and picks up a sword. TwinBee says: 'Helmed Horror. The room is its job. We are its interruption.'",
|
||||
"A small chapel, dwarf-made, dedicated to a god of the forge whose statue stands in armor in the alcove. The statue is not a statue. The statue moves first. TwinBee files this under 'ambush by liturgy' and notes the immunity list does not include warhammers.",
|
||||
"The corridor narrows into a guardpost. There is a guard. The guard is articulated steel from a fashion three centuries old, and it has been at this post since the day the dwarves left. It greets you in a voice that is not coming from the mouth-slit — the mouth-slit is for venting heat. TwinBee straightens up. 'Sentry duty,' TwinBee says, 'taken to its conclusion.'",
|
||||
"A vault antechamber. Two suits of armor flank the inner door. They are alike in pattern, alike in posture, alike in the heat coming off them. The left one moves first by half a heartbeat. TwinBee tracks the asymmetry and says: 'One Helmed Horror is a fight. Two is a logistics problem. Pick a target.'",
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// BOSS ABILITY CALLOUTS — Emberlord Thyrak
|
||||
// Used as a one-line cinematic suffix to BossEntryEmberlordThyrak when combat starts.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
// Molten Strike: +4d6 fire on hit; target armor -1 AC until repaired (long rest).
|
||||
var ThyrakMoltenStrikeLines = []string{
|
||||
"Every hit lands +4d6 fire and pits your armor — AC -1 until you can repair, which requires a long rest. TwinBee says: 'The damage hurts. The AC penalty compounds. Don't take more than two if you can help it.'",
|
||||
"Molten Strike. The hammer doesn't just hit, it brands. Fire damage on top of physical, and your armor gets worse permanently for the encounter. TwinBee files this under 'attrition with paperwork.'",
|
||||
"Each connecting blow makes the next one easier for him. Your AC goes down. The fire damage goes through. TwinBee tracks the count and recommends taking the hit on something you weren't going to keep.",
|
||||
}
|
||||
|
||||
// Forge Breath: recharge 5–6; 30-ft cone, 10d6 fire, DEX DC 16 half.
|
||||
var ThyrakForgeBreathLines = []string{
|
||||
"The vents on his chest open. Thirty-foot cone, 10d6 fire, DEX DC 16 for half. TwinBee says: 'Don't bunch up. He'll get this back on a 5–6.'",
|
||||
"Forge Breath. He inhales — visibly — and the next exhale is a furnace. Cone, big DC, big damage. TwinBee marks the recharge and shouts the spread order.",
|
||||
"Like the Bowser fire breath in 8-3 except wider and with a saving throw. Thirty-foot cone, half-damage on save. TwinBee notes that 'half' of 10d6 is still meaningful and recommends not getting hit twice in a row.",
|
||||
}
|
||||
|
||||
// Living Forge: heals 15 HP/turn while standing on lava/forge tiles.
|
||||
var ThyrakLivingForgeLines = []string{
|
||||
"He heals fifteen a turn while standing on lava or forge tiles. TwinBee says: 'Move him off, or fight a boss who repairs faster than you can dent.'",
|
||||
"Living Forge. The lava floor is part of his kit. Pull him off it — shove, push, anything — and the regen stops. TwinBee files this under 'positioning is damage.'",
|
||||
"He's standing on a heat source and the heat source is fueling him. Fifteen HP a round, indefinitely. TwinBee tracks the regen and reminds the party that knocking him into the open hallway is worth more than a good attack roll.",
|
||||
}
|
||||
|
||||
// Construct Resilience: immune poison/psychic/charm/exhaustion; resist non-magical physical.
|
||||
var ThyrakConstructLines = []string{
|
||||
"Immune to poison, psychic, charm, exhaustion. Resists non-magical physical. TwinBee says: 'Magic weapons earn their keep here. Mundane steel does half.'",
|
||||
"He's a construct first and a boss second. The whole control-effect column on your sheet is greyed out. TwinBee files this under 'fights you win by hitting harder, not smarter — the smart options have been removed.'",
|
||||
"Construct Resilience: the standard package. Magic damage gets through clean. Mundane physical gets cut in half. TwinBee suggests checking which weapons are actually magical before assuming.",
|
||||
}
|
||||
|
||||
// Phase 2 (<50% HP): Forge Breath recharge 4–6; spawns 2 Fire Elementals.
|
||||
var ThyrakPhaseTwoLines = []string{
|
||||
"At half HP the vents widen. Forge Breath recharges on 4–6 now and two Fire Elementals come up out of the floor. TwinBee says: 'Phase shift. The cone is twice as common and you have new targets. Pick a priority.'",
|
||||
"Half-health. The forge wakes the rest of the way up. Two Fire Elementals burst from the lava channels. Breath weapon is half a turn away on every roll now. TwinBee tracks the new add count and reminds you that Thyrak is still the win condition.",
|
||||
"Phase two: the elementals come up the way bosses summon adds in every arcade beat-em-up — predictable, relentless, the kind of design that turns a fight into a war of attrition. TwinBee files the timing and asks who has fire resistance.",
|
||||
}
|
||||
|
||||
// ThyrakSignatureCallouts — combined pool for boss-entry suffix.
|
||||
// Phase-two lines stay separate (surfaced via dedicated phase-two helper).
|
||||
var ThyrakSignatureCallouts = func() []string {
|
||||
out := make([]string, 0,
|
||||
len(ThyrakMoltenStrikeLines)+
|
||||
len(ThyrakForgeBreathLines)+
|
||||
len(ThyrakLivingForgeLines)+
|
||||
len(ThyrakConstructLines))
|
||||
out = append(out, ThyrakMoltenStrikeLines...)
|
||||
out = append(out, ThyrakForgeBreathLines...)
|
||||
out = append(out, ThyrakLivingForgeLines...)
|
||||
out = append(out, ThyrakConstructLines...)
|
||||
return out
|
||||
}()
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// LORE — The Underforge
|
||||
// Sampled by !lore inside this zone (zone-specific pool, generic fallback).
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
var LoreLinesUnderforge = []string{
|
||||
"Kharak Dûn was a forge-city, not a mine. The dwarves here didn't extract — they finished. Raw stock came in from a hundred lesser holds and left as the kind of work the rest of the world named after the holds. TwinBee notes the distinction matters: this place was a destination, not a quarry.",
|
||||
"The dwarves left. They didn't die in place — they left. The boots in the barracks are paired because they were left paired, intentionally, on the last day. Somewhere, a clan-elder gave the order to walk out. TwinBee respects the discipline and is curious about the reason. The reason is not in any record TwinBee has read.",
|
||||
"Thyrak was not built to run the city. Thyrak was built to maintain the furnaces while the city ran itself. Three centuries of self-maintenance turned out to include self-improvement, and Thyrak has been improving the designs. TwinBee finds this less terrifying than it sounds and more terrifying than it looks.",
|
||||
"The seal on the outer doors was set from the outside. The dwarves walked out, then closed the door behind them, then sealed it with the kind of binding that takes a clan to set. TwinBee notes the bindings were aimed inward. They were sealing something in. The thing inside is the forge or the forge-golem or both — TwinBee declines to commit.",
|
||||
"The azers in the deeper chambers are not hostile by default. They are loyal to the forge. They will work with anyone the forge accepts, and they will burn alive anyone the forge rejects. TwinBee suggests not picking up the hammer at the central anvil unless you mean it.",
|
||||
"The flameskulls drifting in the upper galleries were dwarven mages, once. They volunteered. Their final task was to maintain the wards around Thyrak's casting chamber, and they have been at it ever since. TwinBee notes the wards are still active and that this is, on balance, probably good news.",
|
||||
"Thyrak's core — the crystalline heart that drops on his death — is what made the self-improvement possible. The dwarves didn't install it. It was already there when they built the chassis. TwinBee finds this implication concerning and suggests the core is not, technically, dwarven work.",
|
||||
"There is a second forge below this one. The 'bass note of something very large moving below' is not metaphor. The Underforge is the upper level. TwinBee will not speculate about the lower level except to note that it has not been opened in this run and would not be a small undertaking to open.",
|
||||
}
|
||||
Reference in New Issue
Block a user