<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]
!!! Character creation
The players make a plucky little resistance team.  It consists of the ~Al-Nisr brothers, clutch mates from [[Perch]], and some friends of theirs. Abu ~Al-Nisr got enlisted to fight the gnolls in Far Nujab, and came home worshipping Charnel, the laughing corpse god. Abu insists that he is the prettiest of the brothers. Tariq ~Al-Nisr spent his durance as a posh duelist, but hates the aelfir, and now spends his time in Perch as a revolutionary. "Fortunate" Tamar ~Al-Nisr spent his durance as a hunter, before returning home to join the Bound. 

Therratrix is a midwife who fought with Abu in the war. She was never enlisted, so we assume that the cult she joined was somehow involved in the war effort. Slav Icktus is a blood witch from downspire, hiding out in Perch. She and Tariq were once lovers. Lyddia Jath is one of the Vermissian Sages, whom Tamar caught when she fell off the Spire. She has since become involved in the group of revolutionaries, keeping secrets (like how Abu deserted during the war and fought for Nujab), and being connected to fates (according Slav, it is Lyddia who will one day kill Tariq).

!!! So, what exactly is our goal?
Having made characters, the players settle down to look at a map of Spire and consider the question: "What needs to burn first?"

After some discussion about the districts of Spire, everyone agrees that they want to focus on corrupting [[The Hive]] to the Ministry's interest. Or particular interest are it's proximity to Perch, it's constant need for corpse disposal, and the fact that revolutionaries are trapped there. 

!!! We need a headquarters, and some day jobs would be nice.
Every ministry cell needs a staging ground, and the players decide on a pub: [[The Rut & Wallow]].  It's a ramshackle pub in Perch, near the border to Middle City, and a favorite place for off-duty guards to come drink where they don't have to worry about any trouble that happens being in their jurisdiction.  The floor is slightly angled after the supporting ropes were hastily repaired, and it's a bit drafty, but is has that Perch charm.

Tariq ~Al-Nisr is the bartender. Slav Icktus is one of the beer wenches. Lyddia Jath is currently unemployed, and spends her time at the Rut & Wallow as an over-educated bar patron. Fortunate Tamar doesn't work there, but the bar is in his vigilante turf. 

Therratrix and Abu ~Al-Nisr work at the prison in [[Middle City]]. Both help with unwell prisoners, but in different fashions; Therratrix serves as a nurse, while Abu takes the corpse cart to [[New Heaven]] and back.

!!! Gathering information on the City Guard
The cell compares what they already know about the city guard: most of them are ill trained and poorly equipped. They're drawn from the working poor, and most live near the prison in mid-spire.  They aren't villains, just local folks trying to earn a living and maybe make the city a better place to live. Some of the guards are actually drow working off a durance, but most of them are career guards (it's a living). Corruption is rampant due to the low pay (or total lack of pay for those on a durance) and the ease of skimming a sten or two. The aelfir use the city guard to maintain basic order, but when they need serious head-cracking, they have separate forces they use (the Black Guard, the Paladins, the Solar Watch, etc).

The cell is particularly interested in the Hive, smack in the center of Middle City. The Hive serves three rolls: a guard station, a prison, and the bureaucratic heart of the city guard. [[Captain Blessed]], a human mercenary, is in charge of the Hive as a guard station. The prison is under the command of [[Warden Wind-Before-Dawn]], an aelfir poet-confessor.  The nominal head of the guard, city-wide, is [[Commissioner Armon LeVop]], a frazzled and ink-stained drow bureacrat whose office is in the hive. The prison also sees some number of aelfir visitors, mostly to visit imprisoned friends and rivals, or engaging in a sort of torture tourism.

The prison includes some noteworthy prisoners, whom the cell might want to liberate for the Ministry's purposes:
* Various gnoll prisoners of war 
* "The Menegarie": various experiments and pets of the aelfir
* Political prisoners, including a sampling of multiple revolutionary factions
* Warriors of various kinds which might be radicalized for the cause

!!! A plan, to be followed, or maybe abandoned later
The cell decides to identify a few ("like 4 or so") guardsmen to cultivate as friends, and then work to get them promoted. They start looking for sympathetic guardsmen, and locate [[Lt. Ziminar Langley]], a fairly hardworking drow beat cop.  Ziminar majored in drow studies in college, and has a fashionable number of spouses; she seems like a drow's drow.

Looking for a job to get her promoted to, they decide that [[Quartermaster Baub]] needs to go. Baub is a blatant aelfir collaborator, owes money to various silver quarter casinos, and steals from the guard's widows and orphans fund to cover his debts. Ziminar can have his job.  

!!! Getting leverage on Langley
It's no use getting someone promoted if you can't control them afterwards. The cell sets about trying to figure out how to get leverage on Ziminar Langley. Therratrix collects some of Ziminar's blood while treating her for a light shanking in the prison wards. She takes the blood to Slav, who tastes it, and learns that Ziminar is having an affair with a human, [[Professor Thule]].  

The cell debates the virtues of blackmailing Langley, and Therratrix notes that (via secret midwife powers) she knows that Langley loves her career more than any affair. The cell debates using the information to manipulate Langley into a debt of obligation.

They ultimately decide on the more convoluted plot, and spend some time creating evidence that Professor Thule is a professional liability to Langley. They bring this to Langley's attention as, you know, concerned friends. Langley reacts with anger and alarm, and the ministry cell helps Langley end the affair smoothly and with minimal damage to her career. Due to some lucky die rolls, Ziminar suspects nothing, and Therratrix adds Ziminar Langley as a bond.

!!! Destroying the Quartermaster
The cell decides that they want to buy out Baub's debts from the casinos. Then, use that to blackmail Baub into early retirement.  Then they'll give evidence of the Widow and Orphan fund embezzlement to Langley, so she can get credit for the bust, and get promoted into the Quartermaster role.

However, this will take money.  They want decide the easiest way to get money will be to rob a guard station payroll.  But, if they're going to rob a payroll, they want a patsy to frame for their crime – they identify a local street gang, the [[Roaring Boys]].  The Roaring Boys live in the garden district, where they can collect *corpse fruit* (which causes hallucinations of the dead) and *godsmoke* (a euphoric and pain dulling drug), which they transport to midspire to sell to middle class drow.

Tamar and Abu intercept a roaring boy drug mule, and rob him of his supply. They figure the missing drugs will agitate the gang, and provide an apparent motive for when the guard payroll shipment goes missing. Tariq and Lyddia then take the stolen drugs to the casino disctrict, and simply trade them for Baub's gambling debts. This confuses Tamar, who thought that was what the stolen payroll was going to be for. 

Tamar asks "does this mean we don't need to rob the payroll?"  
Lyddia replies "well, we're not going to waste all that planning."
Tariq confirms "I don't even know what the plan is anymore, but lets rob a payroll."
However, we're out of time, so that will have to wait for next session.

!!! End of Session
The cell's impact on the Spire was minimal at best, so everyone gets a low advance.
One of the landlords of [[Ivory Row]].  He worships the aelfir gods, and is working on a giant monument to them.
We need to ally with Mr. Alas and attack Veq’s syndicate!
But he hates religion, and we’re technically a cult.

Let’s throw a party!
What’s our theme? (Abu: “Corpses!” &nbsp;Everyone else: “no”)
Let’s have Esmer round up some students. &nbsp;And get the rut and wallow to host it.
The blood witch lair provides weird things from the university fire.
Tariq gets drugs from his threadneedle square bond, Charlindra
Abu calls on his Faithful of Charnal to provide extra party goers and decorations.
Avante garde music a la the Sound of Noise!
Everyone recovers 1d10 stress
Tamar has an argument with Hedarhi over condiment ethics, which gets several people to join the conversation and casually confess to crimes. Later, Hedhari drags him off to beat him with a punch ladle.

Mamas Thinrees gets them a meeting with Wicked Mr. Alas.
The party discusses sales pitches for an alliance with Mr. Alas - problem: he hates religions and cults. &nbsp;Bonus: they already want to go after Lord Veq, so getting kickbacks from Alas would be nice.

Alas wants more chaos, in order to move into Pilgrim’s Walk. Destroy two guard outposts:
Vulgate Post (based on old Vermissian station)
Godstreet Post

Players agree, and leave to plan.
Reassign one station to Gwynn Enforr
Destroy the other one, and frame the syndicate

Tamar has a plan: someone get arrested, and I’ll switch places with them (armed), and kill everyone.

Armon LeVop says he can’t just shut down a station that has good results. The station would need to have local complaints or bad results.
OTOH, he’s mustering guards (1 per station) to create a couple news stations in Ivory Row
(PCs: this sounds like a clerical error waiting to happen!)

Therratrix whips up some false documents to drain Godstreet Post of it’s guards.
Tamar gets Hedarhi a posting at the new Ivory Road station, just because he can.

Godstreet post looks like a twisting tower reaching from floor to ceiling of the chamber, covered with weird windows
Vulgate post looks like a train station, but with the vermissian tube at a 45 degree angle.

Tariq plans on creating a riot outside of Godstreet post. &nbsp;This is successful. The Altar of the Hungry Deep and the Asbinian Heresy are very angry with the guard post now,.

The guard responds by reinforcing the guard post and engaging in goodwill efforts allying with the local Sect of the Great Glass Eye and the Church of the Eight.

Tamar robs the Sect of the Great Glass Eye, and steals their main holy relic (Steal + Religion), and sneaks it in the Godstreet post (Sneak + Order). &nbsp;Framing Lt. Evil John.

Slav spreads rumors that one of the local cults is being targeted by guards (Decevie + Religon), which is somewhat successful. Tariq has his cadre of revolutionaries to similarly spread lies, which is also successful. &nbsp;The Marble Lady turns against the guard station.

Enough local faiths revolt against the guard station that it gets shut down.

Abu gets himself arrested at at Vulgate station, by harrassing the followers of Plur by running naked (mask on though) through their temple and claiming that sex with the frog idol will cure social diseases.

Fortunate Tamar uses Saint of Hidden Places to swap places with Abu. Abu gets dressed. Tamar, geared with murder tools, finds himself in the Vulgate jail cells. &nbsp;He extricates himself, and prowls about unseen.

Therratrix uses pluck the web to get the syndicate and the guard to act on each other.

Tariq uses My Name is Legion to march on Vulgate station as an entire riot. &nbsp;At the time of peak chaos, the PCs strike Vulgate station. 

While combat goes on, the PCs debate the causes of gentrification, and constructive means of combating it.

The guard station has roudy jail cages, loose railings, and a giant chandelier

Slav spreads blood on three guards. &nbsp;Abu shoots a guard with a crossbow. Therratrix rips out a guard’s throat. 
One of the guards slaps Slav with a halberd
Slav yells “Police Brutality” and stabs the guard with her sword, sending him falling over a loose railing.he
Abu and Miracle pushes a guard against the rowdy cage, and then stabs him. &nbsp;The guard dies.
Tariq posses an unusually burly rioter, to have them yells “Police Brutality! They’re attacking people!” (Compel + Religion). A horde of angry rioting pilgims flood the station.
Tamar appears on top of the chandalier, and cuts the cord, dropping it on the guard and killing him.
Guards attack Slav and Therratrix. Therratrix avoids damage, but Slav takes a halberd strike.
Slav stabs the guard, but hits back. Slav’s leg is broken.
Tariq’s rioter runs to Slav’s rescue, and swats at the guard with a chair.
Abu stabs the guard that’s attacking Therratrix, doing 3 damage.
Therratrix runs over to defend Slav, who is defenseless, and kills the guard. This is a refresh action.
Fortune Tamar leaps on the last guard, but takes a halbert to the belly for his troubles. At least this distracts the guard, and Abu and Miracle rip it apart.

The rioters start a fire in the post’s main office. The PCs free the prisoners in the jail.

The PCs leave the guard post lieutenant, and try to convince him that the Syndicate Sinister is behind this. Deceive + Crime. &nbsp;Tamar takes d3 shadow stress.
Therratrix wraps Slav Iktus in a perfect cocoon to heal her broken leg.

Later an uptick in crime in pilgrim’s walk is noted.

The return to Mr. Alas!

He is impressed, and they make a deal - in return for securing either the Hemlock Fruit Market or the L’Enfor Noir for him, and he’ll give them free use of Bridge Station.

Tamar investigates the Fruitmarket. He gets caught asking around, and draws attention from undying lieutenants. &nbsp;Stone-Strong-Grass-Green, an undying aelfir enforcer, takes notice of Tamar and bans him from the fruit market.

Therratrix investigates L’Enfor Noir to offer her services as a midwife. &nbsp;The staff member she speaks with (Temperance) declines, provides Therratrix with a complimentary drink, and departs. Therratrix opens her Eyes of Ishkral to see for magic - the various drugs have magic effects, and the staff members are all connected to some sort magic upstairs.

Abu decides to visit the L’Enfor Noir brothels to sleep with a gnoll prostitute, and Therratrix joins in. They all go upstairs. &nbsp;Their gnoll prostitute is named “Gwendolyne.” Therratrix slips away while Abu has an enjoyably deviant event. Therratrix sneaks to the top floor.

Ring artifact, four surgical chambers, clockwork beetle surgeons, ducts everywhere
She sees a Yssian Dark Goat, which beckons her to stay silent “shh” &nbsp;She backs away.

Tariq goes to Threadneedle Square, to talk to Charlindra. He buys some Carotid.
Finds out that The Three run the smugglers, and Stone-Strong-Grass-Green runs the market.

Everyone gets a moderate advance for destroying guard posts.

A human mercenary and city guard captain.

He's basically *Brian Blessed* with a mask on.
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Author:|Simon Baird <simon.baird@gmail.com>|

  handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

  handler: function(event,src,title) {
    if (!story.isDirty(title) && !store.tiddlerExists(title) && !store.isShadowTiddler(title))
    return false;


Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

The long suffering guard commissioner. He is a small man, often appearing bewilderingly stressed. He's also a master bureaucrat, trying to create order in the strange chaos caused by aelfir legal codes.
A mostly human cult with takes fragments of a prokatakos crystal mind and imbeds them into their brains to join a weird group mind.

Responsible for a number of mysterious deaths at [[The Hive]] prison.

[[Tristan Avanod]] is one of them.
[[Session Summaries]]
A department at [[Gywwn-Enforr]] researching the military uses of electricity.

They have been responsible for unethical experiments on prisoners at [[The Hive]]

[[Professor Thule]] is one of them.
|Description:|Adds a New tiddler button in the tag drop down|
|Author:|Simon Baird <simon.baird@gmail.com>|

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
  var tag = this.getAttribute("tag");
  var title = this.getAttribute("tiddler");
  // Thanks Saq, you're a genius :)
  var popup = Popup.stack[Popup.stack.length-1].popup;
  wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
  return false;

One of [[Wicked Mr. Alas]]' lieutenants. A massive aelfir (due to muscle graft surgery) with blinded eyes, but augmented ears that let him "see."

Is Alas' main hitter, especially for murdering trespassing cultists.

A human run university that specializes in retroengineering and hard sciences. 

Connected to [[The Hive]] by way of the [[Department of Applied Galvanics]] and their experiments on prisoners.

Home to [[Professor Thule]]
A human run university in middle city which focuses on retroengineering and hard sciences. Much of the research there benefits the war efforts, the professors constantly compete for research grants from the military.

[[Professor Thule]] teaches there.
A drow intern working with [[Johnny Mar]] and [[Smurgeon]] in Gywnn-Enforr campus security. Very sardonic.
|Description:|Allows conditional inclusion/exclusion in templates|
|Author:|Simon Baird <simon.baird@gmail.com>|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}

Warning: the showWhen and hideWhen macros will blindly eval paramString.
This could be used to execute harmful javascript from a tiddler.

(TODO: Make some effort to sanitize paramString. Perhaps disallow the equals sign?)

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
  window.hideWhenLastTest = test;
  if (test) {


  hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( eval(paramString), place );

  showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !eval(paramString), place );

  hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAll(params), place );

  showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAll(params), place );

  hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAny(params), place );

  showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAny(params), place );

  hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAll(params), place );

  showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAll(params), place );

  hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place );

  showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place );

  hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.title == params[0], place );

  showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.title != params[0], place );

  'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !window.hideWhenLastTest, place );


A member of the bound, and Fortunate Tamar's bitter rival. Their feud extends from a game of darts and some petty name calling, but spiraled out of control from there.
|Description:|A handy way to insert timestamps in your tiddler content|
|Author:|Simon Baird <simon.baird@gmail.com>|
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.

config.InstantTimestamp = {

  // adjust to suit
  timeFormat: 'DD/0MM/YY 0hh:0mm',
  dateFormat: 'DD/0MM/YY',

  translations: [
    [/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
    [/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

    // thanks Adapted Cat


  excludeTags: [

  excludeTiddlers: [
    // more?


TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

  tags = tags ? tags : []; // just in case tags is null
  tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
  var conf = config.InstantTimestamp;

  if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

    var now = new Date();
    var trans = conf.translations;
    for (var i=0;i<trans.length;i++) {
      newBody = newBody.replace(trans[i][0], eval(trans[i][1]));

  // TODO: use apply() instead of naming all args?
  return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);

// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

One of [[Wicked Mr. Alas]]' lieutenants.  Formerly one of [[The Hidden]], and he still dresses like one. He carries an illegal rapier and parrying blade, and seems formidable.

Has met Fortunate Tamar at a [[Sunlight Collective]] party.
A district of dilapidated mansions above [[Middle City]]

Run by three landlords:
[[Archbishop Wynn]]
[[Wicked Mr. Alas]]
[[Lady Thorns on Silk]]

[[The Hidden]] live here in secret.
The [[Sunlight Collective]] parties here in the open.
A human mercenary working for Gywnn-Enforr campus security. Wildly overqualified for his job.
Missing Players
	Both Fortunate Tamar and Therratrix are missing today's sessions, due to (respectively) Gloranthan obligations and grad school.  The rest of the group concludes that Therratrix is busy doing nursing rounds at the prison, and Tamar has been arrested by campus security again.
	There is some suggestion that Tamar is actually in a relationship with Hedarhi Nivresod (the campus security jail clerk), and getting himself arrested as a pretense to hang out with her.

Slav Icktus gets a new lair
	Slav has a new Blood Witch advance: her own lair!  She wants a lair near the Rut & Wallow, but not too close. She notes that there is an old abandoned shrine near the tavern: a Tavian Crux.  She decides to convert it into a blood witch lair.
	No one is particularly sure what a Tavian Crux actually is, but it's on the map.
	She asks the rest of the cell to help her move her belongs over, which they do. The interior of the lair is pretty creepy, with the walls now constantly dripping efluvia and viscera, strange rattles and noises, and Slav's pet hexitongue goat just hanging out and screaming at the shadows. Lydda notes that there is a hole in the floor that drains into the Vermissian, which is probably what allows Slav to maintain contact with the Heart.

What to do with the captive?
	Now that the cell has dealt with the madness of Professor Vex, they consider taking additional action against the Department of Applied Galvanics. Tariq suggests that as long as the remaining professors aren't electrocuting Perch, this isn't really any problem with them, and there are more pressing problems.
	The cell turns to their captive, the grad student Esmer.  She is brilliant, beautiful, and connected to at least middle class wealth, so she'll likely to far in spire. Also, usefully, the cell has blackmail on her, due to her involvement with Vex's campaign to electrocute Perch, and worse, steal research from other professors.
	Slav Icktus claims Esmer as an individual level bond.

To Red Row!
	The cell discusses what to do now.  They have their usual list of suspects causing problems in the prison, plus indications that at least a couple of those groups have pulled people out of the prison and unleashed them on the city: a gaggle of demonologists have apparently open an incursion in Pilgrim's Walk, and a collection of murderous toughs have reappeared as undying thugs in Red Row. 
	Tariq presses the rest of the cell to look into the Red Row business; he has a bond in Threadneedle Square that he'd like to look after. Abu agrees, on account of wanting to catch a Joust in the North Docks on the way.
	The journey takes about a day to get downspire, between the constant guard checkpoints and switchback corridors.

Gathering Intel
	Abu and Lydda hand out seditious leaflets (from Tariq's team of rebellious printers) while asking around about the Undying Gang.
	Lydda meets a merchant selling lizards on a stick (“Live, or dead?”  “Oh, both. We got all kind of lizards and all kinds of sticks.  Dead lizards, live lizards, jerkied lizards, biting lizards, accusatory lizards, short sticks, long sticks, double sticks. Whatever you want.” “Can I get a lizard without a stick?” “Get the fuck out of my store.”) After some coaxing, the shopkeep describes the gang as Mommas Thinees' Boys.
	(Tariq: “Of course. Every Spire gang has to end with the word 'boys.' Even the girl gangs”)
	They're a gang of eight drow, with undying surgeries and muscle grafts, who started a protection rack in Red Row.  They've also expanded to the Hemlock Fruit Market and Threadneedle Square. They wear bulky robes to hide their surgical scars, and the armor they wear, and the wicked knives they carry at their backs and hips. 
	The grafts make them taller and more muscular than the typical drow. They all wear featureless porcelain masks and hang spice bags from their belts; the former to hide scars and the later to hide their own rotting flesh. 
	Mommas is an upspire drow who was disgraced and fell to Red Row. She started as a fence, but recently acquired the Undying Gang; she is rumored to be an ex-member of the Mortician's Guild. This used to be Underboss Mycroft's territory, but he got himself killed by Hellionites, and now Mommas Thinrees is moving into the power vacuum.

Following the Undying Boys
	Slav and Kreth decide to tail Mommas Thinrees boys as they make their rounds. Thanks to a critical success, the gangsters have no idea they are being watched. 
	They travel as a team of eight, but when they get to a business, two go in and the rest wait outside. After a few hours, they start to return home, but make a sport of catching gutterkin. The undying move with surprising speed as they suddenly dart down a side alley and return with a struggling gutterkin (sometimes a goblin, or a gnome, or a snottling, and a neblin, or a street urchin) and shove them in a sack.
	Their eventual destination is Mommas Thinrees House, a pub and godsmoke den of ill reputation. By the time they get there, they have half a dozen gutterkin squirming in a sack.  

Checking Out Mommas Thinrees' House
	The cell goes to Mommas Thinrees' House. The doorman is a massive seven foot tall figure in a hooded cloak, with two glinting eyes looking out.  
	Tariq: “It's probably just three gutterkin in a coat. I've seen that before.”
	Slav: “You're making that up.”
	The doorman confiscates obvious weapons, and moves in an inhuman manor. Slav and Abu pay it no heed, but Tariq is convinced that really is a trio of gutterkin, and the bottom one is aiming a crossbow at kneecap height under the cloak.
	Inside, there are godsmoke addicts littering the floor. A drow bartender smirks at the new arrivals. Mommas Thinrees sits at a table in the back, counting coins and marking a ledger. She is a diminutive drow, with a giant sphere of hair festooned with hair sticks. She smokes a cigarette on a long holder, and has multiple incense sconces burning nearby.
	Tariq is impressed: “she has type 4 hair. I say we ally with her.”
	Abu Al-Nisr decides to go scouting around, and looking for ghosts. He goes off looking for a bathroom, gets “lost,” and rolls sneak. A crit! He determines that the kitchen is manned by gutterkin, and a lot of them have had undying surgery. There is a sugery table with a gutterkin-sized gurney, and a locked room containing still beating gutterkin hearts.
	Abu also finds a ghost: Underboss Mycroft! He is furious with Mommas, and claims he was assassinated, not killed by Hellionites.  He also claims he has proof, but when pressed for it, admits his proof is his word, which used to carry a lot of weight when he was alive. Abu promises to help Mycroft's ghost get vengeance in exchange for information:
	Mommas Thinrees works for the Syndicate Sinister, just as he did. The undying heavies are a “gift” from her upspire bosses; they act as enforcers, but also serve to keep her in line. Their constant threat keeps her pliable to the Syndicate's will. The undying gang's hearts are kept somewhere upspire.
	Abu is aware (along with the rest of the cell) that the Syndicate Sinister is directly controlled by the gangster/councilman Light-Through-Splintered-Glass.
Where are their Hearts?
	If Thinrees doesn't have the enforcers' hearts, who does? And where? The cell concocts a plan: Kreth and Tariq will stage a “lover's quarrel” near an enforcer to distract them, then Abu will run by and shank the guy to get a blood sample for Slav to taste. Because undying don't feel pain, the enforcer doesn't even notice a little bit of light shanking.
	Slav slurps up the blood sample, and can feel a heartbeat coming from upspire. She things she can follow if for perhaps a day. Lydda and Slav lead the cell through the Vermissian, traveling quickly up the spire, where they observe that Slav walks on the ceiling. Slav is unaware of this, and thinks she is walking with the rest of the PCs.  Later, during a passage where water drips up to the ceiling, Slav complains about how wet her feat are, and seems perplexed that none of the rest of the cell are having any problems with this.
	They exit at Steerpike Station in Amaranth and note a) it's really cold, and b) the orchard of trees twisted into geometric shapes are both impressive and creepy.  They observe a group of Aelfir dilettantes lounging in scanty clothing, being massaged by shivering drow servants also wearing scanty clothing. The cell grit their teeth at the injustice and move on.
	Eventually, the heartbeat leads the cell to Light-Through-Splintered-Glass' mansion.

Light-Through-Splintered-Glass' crib
	Light-Through-Splintered-Glass's mansion is multiple stories, guarded by paladins, and swarming with servants. 
	Slav has Spot transform into six legged house cat and enter the house to go scouting.  Spot finds the house to be a massive estate, crewed by masked drow servants in parkas (Tariq: “he may allow his servants to wear parkas, but I refuse to see this guy as a sympathetic villain”), until she finds a massive room filled with hundreds of cages; some cages contain still beating hearts, but most contain exotic song birds.  The song birds give up a scream at the site of the cat, which causes psychological backlash on Slav (mind stress). Spot flees.

The BrasBerry Plan
	The cell discusses various ways to turn the situation to something that favors the ministry, and decide they want to streal the undying hearts from Councilman Veq. However, they also want to keep Veq from realizing the theft, so Tariq and Kreth concoct the “Brasberry Plan” (a brasberry being a blueberry shoved inside the hollow of a raspberry): they will steal undying gutterkin hearts from Mommas, insert them into plain old dead drow hearts. The undying gutterkin hearts will provide a pulse, and the drow heart shell will mask the small size and misshapen appearance of the gutterkin hearts. This will cover up the theft of undying drow hearts from Light-Through-Splintered-Glass.

More Planning
	Problem 1, how to get in: Kreth can just walk right in, but can't take anyone with her. Tariq suggests stealing the masks from some servants, but Lydda suggests using anastomosis to create false servant identities.  
	Tariq buys stolen servant masks off the black market, from a tall and severe looking drow woman (think Cruella de Vil, drow arms dealer). He takes some silver stress for his trouble. Lydda then uses Anastomosis to release knowledge that Tariq's black market masks are servants (who still have their masks) that work for Light-Through-Splintered-Glass. This is now widely believed. 
	Problem 2, creating decoy hearts: Abu the Carrion Priest steals drow hearts. Since his day job involves handles a lot of dead folks, this isn't a problem. Abu and Lydda then sneak into Mommas' House to steal gutterkin hearts. They accomplish this, but at the cost of some shadow stress. Lydda stuffs the undying gutterkin hearts into the stolen drow hearts. Accomplished with a critical success; they will pass as the beating undying hearts of drow for at least a week.
	Problem 3, the songbirds: Lydda suggests earplugs to counter the songbird security. She makes several out of paper and wax (no silver stress required).
	Problem 4, exfiltration: Lydda plans to open a vermissian exit to flee quickly. This will risk some psychological trauma for her cell-mates, but she suggests using drugs to dampen the effect.

Like Ocean's Eleven, but Weirder	
	Kreth leads Lydda and Slav into the mansion. While she does this, Abu summons a flock of crows and throws it against the mansions's windows and open doors to counteract the song bird singing and sow confusion. 
	It works, to some degree; the house servants close doors, somewhat starts shooting a scattergun at the crows, Veq's hellscreamer goats run around screaming more than usual, and some drow children (adopted/exploited by Veq in a shameless attempt to appear benevolent) scream too.  It is chaos.
	The inside team is lead by Krieth the Mask who sneaks them into the Heart Vault and avoids the psychological damage of the song birds. Slav goes around licking hearts until she identifies the eight hearts belonging to the Undying gang. They switch out the hearts and leave via the Vermissian Tunnels. 
	Lydda: “Do you want to be drugged before or after we enter the Vermissian tunnels?”
	Kreth: “Before”
	Slav: “After”
	Lydda opens a portal to the Vermissian, and encounters a field of tentacles (Slav: “I chose wrong”).  At least the tentacles are helpful, and assist in transporting Kreth's drugged form, crowd surfing style.

	Abu and Tariq meet up with Lydda, Kreth, and Slav at the Rut & Wallow.  They discuss how best to use their new wealth of undying hearts, and come up with the following plan:
	They give half their hearts to their Ministry handler (whom the players name Tio Silencio, in reference to their handler in the Eclipse Phase game). They'll give a couple hearts to Mommas as proof, and keep two for themselves. They then pressure Mommas into working for the Ministry.
	They meet with Tio Silencio, who accepts the four hearts and agrees to send another cell to Red Row to monitor and instruct Mommas. The coterie keeps two hearts to use for future favors/bartering.

Meeting Mommas Thinrees
	The cell goes to Mommas Place in the Red Row. Tariq requests an audience with the crime lord, and is granted one. He opens up with the virtues of the resistance, but Mommas cuts him off; she has little patience for crackpot revolutionaries. She keeps her public goodwill confined to orphanages and food banks and not outright rebellion. 
	Deciding this is going no where, Tariq simply hands her a pair of beating hearts. She looks skeptical as he explains that these belong to her undying enforcers and jailors. Mommas explains that she has even less patience for two-bit charlatans, and stabs one of the hearts to express her disdain.
	One of the undying immediately falls over. After a pause, Mommas tells Tariq that he has her attention. She listens to Tariqs proposal for alliance with ministry, and requests time to consider it.
	The coterie agrees, and spends the rest of the day planning for Mommas to betray them at tomorrow's meeting. They also meet up with the second ministry cell, which consists of a couple knights, an idol, a hellionite priest, and a midwife; they look ready for violence.
	The next morning, Abu and Kreith sneak in the back door. The rest enter the front with a full compliment of weapons (the cloaked doorman no longer tries to stop them). The Ministry goon squad also accompanies them inside. 
	The godsmoke den is largely empty at this early hour. Tariq and Lydda sit down at a large table with Mommas. Lydda shares out spider tacos to everyone from a cheese cloth bag. Mommas demands support and protection (since the Syndicate Sinister will likely have reprisals) and a degree of autonomy. Tariq agrees, just relieved that she isn't trying to kill/betray them. They work out details, and Tariq Al-Nisr adds Mommas Thinrees as a new street level bond.
	In the back, Abu witnesses some gutterkin being beaten for stealing undying gutterkin hearts, but decides to remain silent, since 1) he's sneaking, and 2) he doens't actually want Mommas to know what the ministry cell stole the hearts from her.
	As the meeting concludes, Mommas Thinrees mentions in passing that she has a meeting with an exorcist because her business house is apparently haunted. Later, Tariq asks Abu about this, and Abu confims that Underboss Mycroft's ghost is, in fact, really pissed about this turn of events.

Game  Session  July  29  2018  •Plan  “Con  Air”•Chain  gang  program  to  send  sections  of  prisoner  to  various  work  details  including  “living  experiments”  at  Dept  of  Galvanics.•Short  term  plan  is  to  establish  as  “a  new  program  that  works”.•Slav  arranges  for  a  bond,  Ezmer,  to  set  up  a  college  program  to  house  living  experimentson  college  property.•Terratix  forges  the  Warden  Winter-Before  Dawn  signature  for  a  chain  gang  program.•Long  term  plan  is  to  ship  a  bunch  of  violent  criminals  to  an  enemies  door  step.•Tariq  uses  this  as  opportunity  to  hand  revolutionary  pamphlets  to  the  prisoners  and  a  fewguards.•Fortunate  Tamar  learns  that  the  work  gangs  return  from  the  college  with  many  stolen  items,  which  he  purchases  on  the  cheap  and  re-sells  thru  his  pawn  shop  bond.•The  short  term  plan  is  ran  successfully  for  many  weeks.Page  11  of  16
•The  long  term  plan  leads  to  an  orgy  of  violence  and  such...•an  army  of  demonologists  and  riotists  are  let  loose  on  campus  with  galvanics  weaponry  and  arsonist  materials•Slav's  bond,  Ezmer,  arranges  a  major  party  in  the  quad•Abu  assassinates  key  professors  working  at  the  college  including  head  of  campussecurity.•Lyddia  uses  Anastomis  to  make  the  Galvanics  Dept  believe  they  can  sell  their  experimental  weapons  now  to  the  High  Elf  government  for  treasury  notes  that  arepayable  later.    She  gets  a  retroengineered  galvanics  arquebus  that  removes  water  from  a  one  block  area  (extreme  range,  dangerous,  unreliable,  1d8  stress).  Spireblack  Grenades  that  unsettle  ghosts  (d6  stress,  spread  d6,  dangerous,  ranged,  one-shot).•Fortunate  Tamar  is  to  use  his  bond/girlfriend  to  steal  the  college's  armory.•Tariq  arranges  for  a  riotous  group  of  Bohemian's  to  show  up  and  murder  those  folks  who  experimented  on  their  crystal  using  brethern.•Terratix  arranges  for  the  various  college  factions,  particularly  the  fraternities  and  sororities  to  hate  each  other  enough  to  commit  murder,  arson,  and  such.•Everyone  uses  their  abilities  to  dial  the  chaos  and  violence  up  to  11  during  the  whole  ordeal.    Slav  preaches  it  is  “the  end  of  times”,  Terratix  “Predator”  murdersGuards  responding  the  rioting,  Abu  drags  in  more  ghosts,  Lyddian  uses  her  galvanics  weapons,  Lyddian  cuts  deals  with  various  factions  that  want  to  buy  cheap  (arsoned)  property  to  make  the  riot  last  longer,  Fortunate  vigilantes  his  way  thru  rioters,  and  Fortunate  also  steals  student  records.•General  Snow  On  A  Stone  shows  up  with  the  military  to  clean  up  the  mess  that  is  the  Unversity.His  high  elf  warrior  poets  clean  house  while  shouting  poetry.    They  kill  people  until  the  riot,  arson,  murder,  looting,  etc...  ends.•The  coterie  escapes  while  extracting  witnesses  (various  means)  to  the  carnage  and  brutality  of  the  high  elf  military.    •The  fall  out:•The  college  is  no  longer  an  entity.•Professors  Thule  and  Mandalite  are  dead.•Professor  Boost  is  living  high,  temporarily,  at  a  casino  on  his  military  funding  and  attempting  to  cheat  at  dice  using  galvanics  tech.    Tariq  tries  to  recruit  the  man  and  fails,  so  Abu  and  his  hyena  murder  him.•Reporter  Stella  Blue  and  her  paper  are  feed  lie  after  lie,  fact  after  fact  to  frame  Dean  Bothwell  and  Warden  Wind-Before-Dawn  for  the  who  thing.    Dean  Bothwell  is  kidnapped  and  dies  at  the  hands  of  high  elf  torturers.    •The  coterie  pushes  buttons  to  get  Quartermaster  Langly  in  charge  of  the  Hive...  but  she's  drow  and  its  a  hard  push.    Langly  becomes  Warden.•Lyddia  becomes  the  Quartermaster  and  gains  a  city  wide  bound.•Terratix  puts  Lyddia  into  a  cocoon  of  spider  silk  to  remove  her  fallout.    It  takes  a  week  and  gives  her  a  point  of  Blood  resistance.•The  game  ends  with  everyone  getting  a  high  advance.•Lyddia  takes  Glass  Library
!!! New Player
A new player joins the group, adding Kreth to the party (a Masked).

Stress Relief – is discussed but enough of the coterie is worried about Lower Perch that they opt to continue operations against to Professor Vex.

Professor Vex is revealed to be a member of the Cult of Spire Ascendent, who wants to electrocute sections of the Spire to revitalize and awaken it as a living entity, which means there is someone or someones that would continue her work.

Remove Professor Vex
Abu Al-Nisr and Fortunate Al-Nisr stake out Professor Vex's factory building – they wait and watch, then recognize a trio of student workers leave including Ezmer a young, drow female that Vex dotes on because she's brilliant.
Abu picks an Ivory Row property for his ambush.  It is choked with topiary.  
Ezmer runs away when the first of her companions, a male human, is strung up in the topiary.  
Abu drops a kind looking spider gargoyle into their path forcing them deeper into the topiary where Ezmer is captured.
Ezmer is interrogated by the brothers – she reveals that Professor Vex's doesn't know who the coterie members are.  Her drow students get exempted from the durance.  

Department of Applied Galvanics
Dean is senile and hanging on by luck and seniority
Five professors, all humans, are attempting to replace the dean:
Bosst – Galvanic Defenses
Mandalite – Civilian Galvanic Applications (central lighting).  Practical uses for every day life rather than weapons.
Loque – History of Lightning – collecting texts of lightning gods to found her own religion.  Example:  Ben of Franklin and his Kite of Galvanic Attraction..  Example 2 (not galvanics):  Cult of Garrick, a human industrialist who replaced his body parts with mechanical parts.  
Thule – Galvanics “therapy”
Vex – Weather Galvanics
Lyddia applies investigation and academia to divert some of Professor Vex's student factory workers into abandoning Vex's team for Professor Thule.
Slav and Kreth and Therratix work together to assassinate Professor Vex in her campus office.  They successfully divert an electrical experiment on display output into her desk and chair.  While in the office they investigate a device that is copying texts to find that the device is interpreting and copying any text given to it; it is currently working thru a stack of texts by her rivals for Dean of Applied Galvanics.
The assassination fails to kill her but it does damage her reputation and destroy her copying machine.

The Al-Nisr Brothers interrogate Ezmer and decide she is perfect to black mail into being an asset.  They are informed by Slav's pet spider about that section of the coterie's operations.

Slav, Kreth, and Therratix follow a “bad luck” spell's back trail out of Professor Vex's office to a gambling section of the Silver Quarter, in particular a casino named the Mermaid.  

Ezmer is stashed in a broom closet in the Rut & Wallow Bar.  Quent the owner notes which broom closet and puts up a sign that announces, “Beware of Hynea!  Don't open!”

The Assassination
The brothers arrange a ransom note to Professor Vex for Ezmer.  “Come to Lower Perch's Honeymoon Suite at Thumb's.  Come alone.  Bring a bag of silver and your research notes.”
Professor Vex arrives with her three spider pack enforcers, two teams of student workers, and her trio of student security.  
Kreth, Lyddia, and Therratix are in the suite with Ezmer. The rest of the coterie wait outside and nearby to cut the cords that suspend the suite.
A duo of student workers enter the suite to scope it out before the professor enters.  They exit once Therratix ensures them that Ezmer is safe and on the premises.
The killing begins:  Abu's crossbow bolt hits Vex in the heart; her corpse tumbles from the cat walk.  The campus security team fires a rescue line at Vex that ropes her corpose and slams it with horrible noise against the spire.  A student fires a Galvanic arquebus that misfires and blows up in his hands.  A blackspire bomb is thrown and misses, plunging into the structures that hang far below.  
Lyddia bravely rescues the injured Slav by plunging them both into the Vermissian Tunnels via the Back Door.  Slav keeps her eyes squeezed shut.
Abu and Fortunate fight a pair of cultists armed with spider back packs.  One is spared the horror of impact when she falls off a catwalk and is killed by the lite black spire bomb stuck to her hand.  Fortunate takes wounds clambering up onto a catwalk with more victims... cultists.  Abu plunges his saber into a cultist then pushes his corpse off the blade and into the void.  
Therratix's claws professionally cut a cultist's head off at the shoulders.  She throws the severed head at other combatants.
Kreth calmly leaves the battle by doning another mask and walking away.

Slav and Kreth work on Ezmer hoping to convert her to the cause leveraging her involvement to Destroy Perch as blackmail.

Therratix researches the coterie's notes on the Cult of Intelligence and Department of Applied Galvanics, which are both active in the Hive Prison and both tied back into the Gwynn-Enfer university.  

The Discussion:  Who do we want to tackle next in the Hive Prison 
Investigate the Cult of Intelligence – Kreth uncovers Councilman Drynn, the only human member, is also the Primary Communications Node of the Cult of Intelligence.
Prof Bosst – Galvanic Defenses
Prof Thule – Galvanics “therapy”
Prof Loque - History of Lightning – collecting texts of lightning gods to found her own religion.  Example:  Ben of Franklin and his Kite of Galvanic Attraction..  Example 2 (not galvanics):  Cult of Garrick, a human industrialist who replaced his body parts with mechanical parts.  
Prof Mandalite – Civilian Galvanic Applications (central lighting).  Practical uses for every day life rather than weapons.
Prof Xavier – No crystal implant.  Working on crystal thinking machine.
Convince Thule and/or Galvanics that Cult of Intelligence members are a good experimentation stock.  Lyddia uncovers that the humans mined into Protocoticoss colonies to gain hi-tech crystals which they built a steam punk empire off of.  Humans can only really use the instantaneous communications of said crystals by implanting said crystals in human, elf or drow brains.  An experiment line would involve running varying currents through those crystals to attempt instantaneous communications...  Cultists have clicks that are at odds with each other.  The crystals act as a vast library rather than mind control.
Therratix shares this information slyly with Professor Thule.  Kreth and others convince Thule that experimenting on crystal heads is ethical.  
Make Professor Mandalite the new dean (or at least the current dean's executor) of Galvanics.  Make it so he needs the support of the other three professors and vice versa.
!!!What are our day jobs again?
To refresh, everyone describes some day-in-the-life scene for their characters.

Abu ~Al-Nisr, the Carrion Priest, spends his day chatting with corpses and transporting corpses for the Guard

Therratix, the Midwife, serves as secretary to [[Warden Wind-Before-Dawn]] while doing some midwifery on the side.

Slav Icktus, the Blood Witch, works a tiring shift as a waitress at [[The Rut & Wallow]]

“Fortunate” Tamar Al-Nisr, the Bound, always has cigarettes and beer thanks to the small gods. And he spends the day on rooftops, drinking and smoking and staring moodily at the horizon.

Lyddia Jath, the Vermissian Sage, is now a member of the guard. She does paperwork and builds her own criminal coterie of City Guard members.

//Tariq fades into the background noise, as he is without a player today.//

!!!Exciting News!
The ministry cell learns that there's a bunch of weird and threatening things going on. 

Lyddia finds records that twelve prisoners have escaped from the Polyphecon, which is unusual. 

Tamar hears news that Lower [[Perch]] was struck by lightning. Repeatedly. At regular, three second intervals. Burning sections were cut loose to save other sections. The cell takes issue with this, since Perch is where they live.

Skav Icktus hears stories of a demonic incursion in Pilgrim's row. It seems to have emanated from a Vermissian station, and several blocks have been evacuated.

Finally, through ministry contacts, the cell learns about a new gang appearing in Red Row. It's a cadre of 12 undying drow, all large and violent, learning on businesses for protection money. They run a circuit from Red Row to the Hemlock Fruit Market.

!!!Investigating the Lightning Situation
While undying gangsters and subway demons are problems, the first priority for the cell is keeping Perch from getting blasted off the side of Spire by lightning. 

Fortunate Tamar investigates the lightning strikes on Lower Perch.  He finds a series of six foot iron spikes, with melted tips of brass and glass, embedded in the outer wall of Spire. The spikes are now very brittle due to the super heating via lightning. Tamar recovers several feet from one of the spikes, and determines that it is hollow except for a length of copper wire inside.

Lyddia Jath investigates the recovered spike, and part of the spike uses devices associated with Gywnn-Enforr. The cell agrees that this looks a lot like the [[Department of Applied Galvanics]] is up to something..

Tamar cuts off several more spike tips and sells them to an [[Ivory Row]] junk dealer hoping that these items get found by the Gywwn-Enforr scientists. He stakes out the shop. Not much comes of it, however.

Lyddia takes a more direct route, and wanders the Gywnn-Enforr campus looking for people to question. She uses her new Everbody Is Guilty of Something trick on some janitorial staff, and finds that Jenny Gierson is guilty of petty theft, arson, and stabbery. Lyddia uses this knowledge to lean on Jenny for information from the inside, and Jenny spills what she knows. She's done some clean up in the weapons research labs, and recognizes the spike designs as belonging to [[Professor Vex]]. Vex is upset that her grant was rejected, and was talking about doing something to revitalize the research.

!!!Tailing Professor Vex
Tamar and Slav follow the professor, but they get spotted by a trio of campus security (two humans and a drow). Tamar and Slav flee, and are astonished at how persistent and effective the campus security are at chasing them; they barely escape.

Tamar later sees the drow from campus security putting up signs offering a 500-sten reward for the "Terrible ~Anti-Intellectual Acrobat" with a sketch of Tamar's "burner" mask from last night. Tamar discards that mask.

Slav tries tailing the professor again, this time with Abu's help. The two notice that Vex is now accompanied by a trio of large, buklky guards wearing heavy backpacks, lots of straps and buckles, and weird breather tubes attached to their masks. Vex goes to [[Little Whitecross]], a human district between [[Ivory Row]] and Gywnn-Enforr. Her house is large, if worn down, and filled with human and drow students. Slav and Abu watch the place, and observe the students assembling even more spikes in a fit of industry. The operation looks larger than the last one, in terms of spikes needed. They count a total of a dozen students, and a half-dozen bulky guards with heavy backpacks. There is also an old woman with a blind dog who brings people snacks.

!!!Who are these backpack guys?
Lyddia and Slav look into the weird backpack guys, and ID them as members of the Cult of Garrick - a fringe religion with a small presence in the factories and in the human University. A subset of the cult wear the backpack rigs, which are filled with devices. Garrick cultists are known for being tough, mechanically skilled, and weird.

!!!Spying on Vex's house
Slav sends her spider familiar inside the house to spy, but it is quickly chased off by a massive hound (well, "massive" according to the spider). It's not a complete loss; the spider does come back with:  “The next test will be in Perch.  It will be larger. And its important to remove The Perch from the Spire.  Within the week.”

Abu and Tamar press for an immediate attack, and the others agree. Four of the band infiltrate the building, with only Fortunate Tamar failing; he is spotted, chased, and captured by the trio of campus security guards for yesterday (moderate shadow fallout).

The remaining ministers infiltrate then house, seeing a large parlor ringed by a mezzanine level. They decide to attack from stealth on the mezzanine, picking off as many as possible until the defenders run upstairs to engage of flee. However, the plan continues to slide south when the opening attacks instead result in the mezzanine partially collapsing, dropping several ministers into the lower floor among the students.

Lyddia decides the best plan is chutzpah, and simply strolls into the manufacturing area and back out with a single iron spike over her shoulder. She continues walking away from the professors house, and disappears into the night.

Abu summons a murder of crows to spead confusion and cover his and Therratrix' escapes.  Slav simply goes full blood witch, and levitates off into the night while screeching curses in dead languages; none of the students are willing to give chase.

Tamar finds himself in campus security jail. Even with a different "burner mask," campus security recognized his silhouette and profile. He identifies the trio of security as [[Johnny Mar]], a muscle-bound human, [[Smurgeon]] a human sharpshooter, and [[Hidari Nivrasod]] their drow girl friday. Tamar patiently waits until the next evening to escape, using simple lockpicking skills to open the cell. He doesn't realize that Hidari is still at her desk watching him escape, but she just notes his escape in a log book as he walks through the front office. Tamar later notices that his wanted posters describe as an: //Acrobat, Mysterious Escaper, Arsonist, Petty Stabbist, and ~Anti-Intellectual.//  

!!!More Fallout
Abu seeks to stalk and murder a Garrick Cult member, but it goes very poorly. More moderate fallout! 

Unbeknownst to Abu, a trio of the backpack cultists trail him back to the Rut & Wallow, 

!!!Defending the Hideout
So, later on, Abu is in the Rut & Wallow with the rest of his coterie, some corrupt City Guard, various employees, and other patrons (including [[Ickbad Walzon]], another Bound and Fortunate Tamar's most hated rival).
("Why do you hate that guy?" "Once, after a game of darts, he said 'more like ~UN-Fortunate Tamar, amirite?' and everyone laughed. How they laughed. I will never forgive him.")

Suddenly, a trio of armored cultists burst in the door! And, from their heavy backpacks, extend four gimble-limbed spider legs, which allow them to scurry over walls, ceiling, and across tables. The ministry cell leaps to the attack, and Abu declares several useful features for the pub (did you know it has a ratty old chandelier? or bathrooms?). The cultists are skilled fighters, heavily armed and armored, but they go down without inflicting any casualties.  

The cell recovers three backpacks, which act as weapons, armor, and climbing equipment. However, they only work for Garrik cultists. They also recover three gas masks, which work for anyone. It looks like the human cultists were using the breather masks because they weren't used to breathing outside of the noxious environment of the factories.

!!!Let's try this again
Feeling emboldened by their victory over the Cult of Garrik, the PCs decide to try messing with Vex some more.

They decide to stake out Lower Perch to find where Professor Vex's second Lightning Call operation will take place. They find it around the Great Pipe, where two of the Lightning Callers are already placed, and 12 more chalk marked locations are found.

The cell tries to set an ambush, but they tip their hand while staking out the sites and the students abort the mission and avoid them. The ministers do, however, recover four spikes.

Later, a recon of Professor Vex's mansion shows everyone is still there, but now the students are all armed, traps and noise makers are placed at all entrances, and anti-Blood Magic sigils have been placed around the windows. Everyone is on high alert. Slav is relieved to notice that the blood magic sigils are powerless tripe someone found in a book, but she's impressed that they tried. ("I think that's actually a ward against a Plür Spitting Curse, but, you know, A for effort.")

!!!End of session
Everyone gets a low advance
One of the landlords of [[Ivory Row]]
|Description:|Intelligently limit the number of backup files you create|
|Author:|Simon Baird|
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
  config.lessBackups = {
    // comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
    modes: [
      ["YYYY",  365*DAYS], // one per year for ever
      ["MMM",   31*DAYS],  // one per month
      ["ddd",   7*DAYS],   // one per weekday
      //["d0DD",  1*DAYS],   // one per day of month
      ["h0hh",  24*HOURS], // one per hour
      ["m0mm",  1*HOURS],  // one per minute
      ["s0ss",  1*MINS],   // one per second
      ["latest",0]         // always keep last version. (leave this).

window.getSpecialBackupPath = function(backupPath) {

  var now = new Date();

  var modes = config.lessBackups.modes;

  for (var i=0;i<modes.length;i++) {

    // the filename we will try
    var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,

    // open the file
    try {
      if (config.browser.isIE) {
        var fsobject = new ActiveXObject("Scripting.FileSystemObject")
        var fileExists  = fsobject.FileExists(specialBackupPath);
        if (fileExists) {
          var fileObject = fsobject.GetFile(specialBackupPath);
          var modDate = new Date(fileObject.DateLastModified).valueOf();
      else {
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
        var fileExists = file.exists();
        if (fileExists) {
          var modDate = file.lastModifiedTime;
    catch(e) {
      // give up
      return backupPath;

    // expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
    // June file on disk that's more than an month old then it must be stale so overwrite
    // note that "latest" should be always written because the expiration period is zero (see above)
    var expiry = new Date(modDate + modes[i][1]);
    if (!fileExists || now > expiry)
      return specialBackupPath;

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
  return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));

A human district in between [[Gywwn-Enforr]] and [[Ivory Row]].

Home of [[Professor Vex]]' manor house and headquarters.
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Date:''|mar 17, 2007|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 return bidix.core.loadRemoteFile(url,callback,params);

An undying member of the Spire high council, and the leader of the [[Syndicate Sinister]].

In competition with [[Wicked Mr. Alas]] to be the top crime lord in the city.
A drow's drow, she majored in drow studies at university (which has limited her guard career somewhat) and maintains a fashionable number of spouses. She is professional and competent, and devoted to her career.

The PCs convinced her that an affair with a Gywwn-Enforr professor was putting her career at risk, and helped her quietly call things off. Ever since, she has been in their debt.
[[Session Summaries]] [[People]] [[Locations]] [[Groups]] [[Other Stuff]]
!!!Further antics at the hive
Tariq is worried about the ministry actions coming back on [[Quint]], the proprietor of [[The Rut & Wallow]], so Lyddia drafts up paperwork to get Quint's family listed as "confidential informants." This way, there aren't so many questions as to why they keep being near City Guard scandals.

Abu Al-Nisr meets with [[Warden Wind-Before-Dawn]], to take his corpse cart into the prison proper (previously he hadn't been allowed further in than the infirmary). The Warden agrees, but wants Abu to tell him about Desang - Abu isn't familiar with theater stuff, so he just makes things up. When meeting with the Warden's secretary, [[Pinioned-Limbs-in-Shadow]], Abu becomes convinced that the secretary actually runs the prison, while the Warden is pursuing weird theater projects.

!!!Hey! I can talk to ghosts now!
Abu is now a ghost speaker, and starts using his talents to help the guard solve crimes (on occasion). Sometimes it's just good conversation.

!!!Those wacky demonologists
Later, while corpse carting in the prison, he tries to get information on the demonologists, and confirms that most of the genuine demonologists in [[The Hive]] have worked for one of either [[Lord Veq Light-Through-Splintered-Glass]] or [[Wicked Mr. Alas]]. He finds that Mr. Alas was using demonologists to curse rich land owners so he could buy their property on the cheap. Abu even gets some names. Some of his information came from ghosts.

!!!Operation "replace the warden's sectary"
After Abu's meeting with the warden, they think he could be controlled and manipulated. They decide that the best place is to install a new secretary, as his current one is a bit too competent.

They look for exploitable secrets relating to Pinioned-Limbs-in-Shadow, and find that she's a frequent brothel visitor, and a regular at [[The Cage]]. The cell decides that assassinating her at the brothel is a good idea.

The cell decides that they want to set up the [[Cult of the Intelligence]] as patsies, especially some of the ones in the Sunlight Collective. Fortunate Tamar shops resale stores and finds some appropriately moody looking crystals to serve as planted evidence. Slav Icktus uses blood magic to identify Intelligence-infected bohemians, and Tariq and Fortunate Tamar set to work drugging and kidnapping them.  

!!!Infiltrating a brothel
The ~PCs bribe the brothel staff (using funds from the stolen payroll) and Tariq takes the prostitutes place for Pinioned-Limbs-in-Shadow's next visit. Other prostitutes warn him that she likes to submerge drow in ice water, and they've taken to using an insulating grease, so Tariq follows their lead. Fortunate Tamar brings the drugged bohemians in through the roof, and stores them in a pantry closet. 

When Pinioned-Limbs-in-Shadow visits the brothel visits the brothel later that night, she is none the wiser. 

Which is how Tariq finds himself shivering in a cold water tub with an aelfir secretary straddling him. When he decides her guard is down, he shouts and stabs her with a drugged dagger, and... finds she's lethally competent in a fight. Therratrix, covered in spider carapace and spines, bursts into the room, and joins the fight. Pinioned-Limbs-in-Shadow puts up a surprisingly solid defense, considering that's naked and fighting a multilimbed spider monster and knife wielding maniac at the same time. 

Then Abu shoots her with a crossbow, killing her.

The rest of the cell manages crowd control during the fight, and then cleans up the murder scene: removing evidence linked to them, and planting evidence linked to the Cult of Intelligence (Tamar's moody crystals and the drugged bohemians). Lyddia also executes the bohemians, lest their memories interfere with the frame up. The ministry cell then flees into the crowded cities of Middle City.

!!!New Secretary Day
Theratrix visits the warden when he finds out about the death of his secretary. She intends to influence his choice of replacement, but through a series of absurdely good die roles, becomes the new Secretary herself.

!!!End of session
Everyone gets a low advance, since they certainly changed Pinioned-Limbs-in-Shadow's life, her murder doesn't really affect much of anyone else.
!!!Session 2 – Hijacking a payroll!
Therratrix is laying low this session, clearing her stress tracks. (also, her player couldn't make it today)

!!! Framing Up the Roaring Boys
Tariq travels to the garden district, and manages to buy enough local clothing to cobble together four sets of Roaring Boys gang colors. With those, everyone should be able to impersonate a Garden District ganger. Some spying and research leads the cell to the [[Roaring Boys]] safe house, which honestly wasn't that hard to find. Fortunate Tamar sneaks in and plants [[Quartermaster Baub]]'s debt record there, so it will look like the Roaring Boys are blackmailing Baub.

!!! Finding a payroll caravan
Next, the cell needs a payroll shipment bound for downspire, which will travel from the hive through Roading Boys territory in the leach canals. After being stymied with trying to find an existing payroll route, they decide to make their own luck. Lyddia Jath gets a job as a clerk at the Hive, and uses her academic skills to start forging documents. She alters the planned route for the next payroll shipment.

Lyddia also snags herself a shrike pistol, because it might be useful to have later. Guns are always useful.

!!! Ambush!
The ministry cell returns to the Garden District to stake out the new payroll route.  They set their ambush point on a bridge over the leech canal, and hide in wait for the barge carrying the payroll.

The payroll barge has eight people on it: four of them have decent armor, and four have ill fitting armor and obviously less discipline. The four guards in better armor are armed with clubs, plus one of them has a halberd, and one of them has a gun. The four in ill fitting armor look unarmed. The ~PCs decide this must be four career guards, with four durance guards brought along for heavy lifting. The barge also has multiple crates.

The barge runs into some ropes that the ~PCs tied just below the water's surface, and comes to a sudden halt. Several PC's open fire with guns (or weird magic, in the blood witch's case), while Tamar runs nimbly across the ropes to engage in melee ("I'm a Bound!  I love ropes!").

Tariq shoots the gun-toting guard leader with his pistol, and Lyddia does the same, dropping him. Tamar cuts down the halberd bearing guard. Slav Icktus leans over the bridge and sprays blood from her eyeballs, dowsing the barge near Tamar. A couple durance drow grab a ladder and lean it on the bridge, and Tariq shoots one of them. A guard goes for his fallen mate's pistol, and gets shot by Lyddia for his troubles ("this new shrike pistol is great!"). One of the durance guards decides to swim for it, and Tamar noticed that the poor guy is covered in leeches. Then he cuts down the last career guard with his godknife.

The remaining durance guards surrender, plainly terrified.  Tamar threatens them, "Don't tell anyone the Roaring Boys did this!  Or else!" but takes some shadow stress in the process ("Why did I take shadow stress? I was wearing a mask!  Is the guy going to remember my eyebrows?").

The ministry cell escapes with the stolen payroll, plus a guard's pistol, and their lives.  All four durers are left alive, though one is coated in leeches. The durers are told they can help themselves to the stens in the dead guard's pockets, which turns out to be a decent sum; the guards had already skimmed some cash from the payroll.

Lyddia notes the stolen payroll as a bond. If they use the cash to bribe someone or buy something, they can roll dice against the stolen loot bond.

!!! Back at the Hive
Returning to the hive, the Lyddia finds the staff agitated. Several prisoners were found dead, with crystals jammed in their skulls. A group of visiting professors are denying involvements. Some officers are busy interrogating the durers from the payroll run, which seems to involve a lot of blunt impact and screaming. Lyddia feels sort of bad about this.

Tariq drops by Ziminar Langley's office, on the pretense that he's handing out drink coupons from [[The Rut & Wallow]] to the guard HR office, and tells her that he overheard the [[Roaring Boys]] bragging about the payroll heist, and how they got [[Quartermaster Baub]] to help them set it up.

!!! Wait, what's this about crystalheads?
Lyddia gets curious about the dead prisoners, and looks into the professors being blamed for it. The [[Department of Applied Galvanics]] has been experimenting on prisoners, for research into warfare, brainwashing, and close quarter combat. However, none of what they are doing actually involves crystals.

She takes a trip to the Vermissian Vault, to research the crystals.  It turns out that human researchers found a giant crystal brain buried in their homeland; some of them like to break off chunks and implant them into their brains to form a sort of weird group mind. These people are called the [[Cult of the Intelligence]], and it's not clear what they're doing at the prison. She finds reference to the name [[Tristan Avanod]], an ex-student from [[Gywnn-Enforr]] who travels in bohemian circles, trying to recruit people into the intelligence cult.

Slav Icktus also looks for mysterious visitors to the prison, using creepier blood-magic methods, and notes that two major criminal groups have been trying to get people out: the [[Syndicate Sinister]] and the [[Wicked Mr. Alas]]. It seems the two are rival crime lords, and both have a number of enforcers locked up on charges of demonology.  Slav suspects that they've both been using trumped up demonology charges to get each other's enforcers off the field.  Fortunate Tamar notes that it's something of an open secret that the Syndicate Sinister is controlled by Councilman [[Light-Through-Splintered-Glass|Lord Veq Light-Through-Splintered-Glass]], so that's bad news.

Abu looks into crystal-headed bohemians, which tracks back to the [[Sunlight Collective]] of [[Ivory Row]], which is in Mr. Alas' territory.  The cell speculates for a while on what all of this means.
!!! Time to make a murder board
The ministry cell spends some time pinning little pieces of paper to a wall in the back room of the Rut & Wallow, along with lots of red string connecting pictures together.  The eventually conclude that there are four factions/interests trying to control the Hive's prison ("the Polyphecon").  These are:
* The Wicked Mr Alas: a crime lord who wants to save or comfort his own troops who have been imprisoned, and to gain intelligence from his enemies.
* The Syndicate Sinister: same goals as Mr. Alas (controlled by Councilman ~Light-Through-Splintered-Glass)
* Cult of the Intelligence: goals unclear
* Gywnn-Enforr Department of Applied Galvanics: they just want to experiment on prisoners with electricity.

This is in addition to the city guard, who just want to do their jobs and skim some stens for themselves.

As a side-note, the players wonder what the giant sphere of eyes at the center of the Polyphecon is. It's a giant fungal tree covered in eyes, that screams whenever prisoners try to escape. And sometimes when they aren't escaping. Once it screamed for a month straight, and no one knows why.

!!! Approaching Mr. Alas
The cell travels up the Spire (via Perch) to visit Ivory Row.  They want to investigate both Mr. Alas and the Sunlight Collective.

What the cell already knows:
Ivory Row is run by three landlords. Mr. Alas is one, along with [[Lady Thorns on Silk]], an aelfir heiress, known for cruelty.  Also, a patron to at least one Bloodwitch. Her pet blood witch: a drow noble woman who conspired with the high elves, but was revealed as a Bloodwitch during high society party. The third landlord is [[Archbishop Wynn]], a human cleric, who worships the aelfir gods.  He refuses life extending surgeries.  Rumor has it he is buying up land to build monuments to the aelfir gods.

The dilapidated mansions are also home to [[The Hidden]]: drow squatters hiding in the empty spaces. They live quietly and steal from the estates nearby. The Sunlight Collective is a disorganized group of bohemians who like partying and art and the occult. They throw their parties on the rooftops in Ivory Row.

Tamar spies on a bohemian party before just deciding to crash the party and enjoy himself. There, he meets [[Itz'bin]], a retainer of Mr. Alas. He still dresses as one of the Hidden, but with items of wealth displayed openly, including an illegal rapier and parrying blade. Tamar suspects that Itz'bin isn't merely a retainer, but one of Alas' lieutenants, and likely formidable. He makes no progress trying to gather information from the man.

Lyddia Jath has better luck talking to the bohemians, perhaps due to her academic background. Alas sells narcotics to the collective, and lets them party in his domain. However, he's hostile to those bohemians who join cults (including the Intelligence Cult), and drives them out of his territory. Sometimes he simply murders trespassing cultists. His primary hatchet man is an enormous aelfir named [[Gentle-On-Blinded-Orbs]], who has been augmented by muscle surgery, is blind, and sees via enhanced hearing.

Slav asks around with local cultist circles to see if Mr. Alas has any occult interests. She finds out that he's very interested in the gods and acquiring relics of said gods. He believes that all of the gods have failed him and he resents them, so he collects relics and defiles them. He has dealings with the various occultists, but treats them as mercenary weapons, not as a group he would join. Still, working for him as an occultist can be good money.

Tariq has the high society domain, and looks into how to contact Wicked Mr Alas: he's reclusive, so you start with one of his lieutenants, and work with them to get an audience. Very powerful people can jump that line, but the ~PCs are not particularly powerful people.

Comparing notes, the ~PCs think that Alas would be interested in the Slav and Lyddia (for their occult knowledge), hostile to Abu and Tamar (for their religious faiths), and neutral to the others. He wants to be the Godfather of the spire, and they might be able to get favors for the ministry if they help his ambitions.

!!! A vague plan for next session and the near future
After a brief round of marry-fuck-or-kill, the ~PCs decide that:

The guard has the most potential for being a positive force for the drow, and should be cultivated as a possible Ministry asset.
Mr. Alas is a bad man, but at least he's a drow, and not necessarily hostile to the revolution, and could be an ally.
The department of Applied Galvanics seems kind of harmless, and might be viable allies.
Councilman ~Light-Through-Splintered-Glass is an aelfir, and the cell would be happy destroying him.
The Cult of the Intelligence creeps everyone out, so the cell would like to destroy them.

Next session, they plan to meet Mr Itz'bin and make nice with Wicked Mr Alas.

Everyone gets a medium advance, on account of actually removing the corruption in the Widows and Orphans fund, which noticeably improves the lives of the fund's recipients. (even if it's off camera)
The middle part of spire, home to [[The Hive]] and [[Gywwn-Enforr]] and bordering on [[Perch]].
[[The Cage]], a bordello, can also be found here.

Below it is the Garden District, and above it is Ivory Row.
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

// Pretty sure this is incomplete and experimental
// TODO: Fix it or remove it.


  mptwCollapse: {
    handler: function(place,macroName,params) {
      createTiddlyButton(place, params[0] == '+' ? '\u25AD' : '\u25AC', 'collapse/uncollapse', function(){

/* this doesn't work unless you have a modified ViewTempate */
config.shadowTiddlers["MptwCollapsePluginStyles"] = ""
  +".collapsed .uncollapsedView { display:none;       }"
  +".collapsedView              { display:none;       }"
  +".collapsed .collapsedView   { display:block;      }"
  +".tiddler.collapsed          { padding-bottom:1em; }"
  +".tiddler.collapsed .title   { font-size:100%;     }"



|Description:|Miscellaneous tweaks used by MPTW|
|Author:|Simon Baird <simon.baird@gmail.com>|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;

config.options.chkHttpReadOnly = false;  // means web visitors can experiment with your site by clicking edit
readOnly = false;                        // needed because the above doesn't work any more post 2.1 (??)
showBackstage = true;                    // show backstage for same reason

config.options.chkInsertTabs = true;     // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = "";  // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";    // don't need message when creating a new tiddler

config.options.chkSaveBackups = true;         // do save backups
config.options.txtBackupFolder = 'twbackup';  // put backups in a backups folder

config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

config.mptwVersion = "2.7.4";


if (config.options.txtTheme == '')
  config.options.txtTheme = 'MptwTheme';

// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see \[\[AdvancedOptions\]\])/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';

Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Description|Mptw Theme with some rounded corners (Firefox only)|



{ -moz-border-radius: 1em; }

.tab {
	-moz-border-radius-topleft: 0.5em;
	-moz-border-radius-topright: 0.5em;
#topMenu {
	-moz-border-radius-bottomleft: 2em;
	-moz-border-radius-bottomright: 2em;


Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Description|Mptw Theme including custom PageLayout|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
	<div class='headerShadow'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>

<div class="uncollapsedView">

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>

<div class="tagglyTagging" macro="tagglyTagging"></div>
<div class="collapsedView">
	<span class='toolbar'>
		<span macro='toolbar closeTiddler'></span>
		<span macro='mptwCollapse +'></span>
	<span class='title' macro='view title'></span>


<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
	<!--span macro='mptwCollapse -'></span-->

<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>


/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS', sans-serif;
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas', monospace;

/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS', sans-serif;

/* more subtle tiddler subtitle */
.subtitle {
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];

/* a little bit of extra whitespace */
.viewer {

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
#topMenu br {
	display: none;
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
#topMenu {
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
.selected .toolbar {

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
#sidebarOptions .sliderPanel .select br {

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	.headerShadow {
		visibility: hidden ! important;
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	.quickopentag a.button, .miniTag {
		display: none ! important;

/* get user styles specified in StyleSheet */


|Description|Mptw Theme with a reduced header to increase useful space|


<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
<div id='sidebar'>
	<div id='sidebarOptions'>
		<div refresh='content' tiddler='SideBarOptions'></div>
		<div style="margin-left:0.1em;"
			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>

For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|

config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

config.options.txtTheme = 'MptwTheme';

The uppermost level of Spire, and the fashionable place to dispose of corpses.

In particular, Abu ~Al-Nisr's friends in the cult of Charnel are strongest there.
|Description:|Creates the new here and new journal macros|
|Author:|Simon Baird <simon.baird@gmail.com>|
merge(config.macros, {
  newHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
  newJournalHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);

|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Author:|Simon Baird <simon.baird@gmail.com>|
!!Note: I think this should be in the core

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
  numberRegExp = / \(([0-9]+)\)$/;
  var match = numberRegExp.exec(this);
  if (match) {
  var num = parseInt(match[1]) + 1;
    return this.replace(numberRegExp," ("+num+")");
  else {
    return this + " (1)";

config.macros.newTiddler.checkForUnsaved = function(newName) {
  var r = false;
  story.forEachTiddler(function(title,element) {
    if (title == newName)
      r = true;
  return r;

config.macros.newTiddler.getName = function(newName) {
  while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
    newName = newName.getNextFreeName();
  return newName;

config.macros.newTiddler.onClickNewTiddler = function()
  var title = this.getAttribute("newTitle");
  if(this.getAttribute("isJournal") == "true") {
    title = new Date().formatString(title.trim());

  // ---- these three lines should be the only difference between this and the core onClickNewTiddler
  if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
    title = config.macros.newTiddler.getName(title);

  var params = this.getAttribute("params");
  var tags = params ? params.split("|") : [];
  var focus = this.getAttribute("newFocus");
  var template = this.getAttribute("newTemplate");
  var customFields = this.getAttribute("customFields");
  if(!customFields && !store.isShadowTiddler(title))
    customFields = String.encodeHashMap(config.defaultCustomFields);
  var tiddlerElem = story.getTiddler(title);
  var text = this.getAttribute("newText");
  if(typeof text == "string")
    story.getTiddlerField(title,"text").value = text.format([title]);
  for(var t=0;t<tags.length;t++)
  return false;

Session  Summary  10/07/2018•Mr  White,  now  a  Ministry  resource/employee,  is  under  threat  of  assassination  from  the  Mortician's.    So,  the  coterie  thinks  thru  some  options  to  get  that  resolved,  coming  up  with  putting  Mr  White  thru  Undead  surgery...  because  by  law  executions  and  death  sentence's  in  Spire  have  no  weight  if  the  individual  is  already  dead...  and  by  definition  Undead  surgery  is  considered  “death”.•Mr  White  is  escorted  to  Heaven  (a  level  of  the  Spire)  by  Lyddia  Jath  via  the  Vermissian  Tunnels.    They  encounter  weirdness  along  the  way,  including  a  drow  violinist  who  claims  that  his  constant  violin  playing  is  keeping  Spire  from  collapsing.•The  rest  of  the  coterie  (Slav,  Abu,  and  Toriq)  travel  to  Heaven  separately  where  they  arrange  the  Undead  Surgery  thru  the  licensed  practice  of  the  Mortician's.•Abu  gets  a  lead  on  Doctor  Ickabod  Salard  who  lives  in  a  war  zone  between  fighting  factions  of  Bee  Druids,  Blood  Witches  and  Cats.•Doctor  Salard  turns  out  to  be  an  elder  drow  whose  enthusiasm  verges  on  senility.    He  agrees  to  perform  the  surgery  immediately,  well,  as  soon  as  his  assistant  Monique  says  he's  done  with  the  current  patient.•The  surgery  is  a  success,  though  some  of  his  organs  have  been  replaced  by  Rust  Spiders.•The  next  subject  is  the  Blind  Oracle  that  is  calling  shots  via  visions  for  the  Solar  Guard's  Paladins.•Najlkae  Gleefully  Greets  the  Murmuration  ritually  blinded  herself  at  15  years  old  (she's  now  100  years  old)  during  her  stint  with  a  cult  of  the  old  gods.    Nothing  came  of  that,  she  later  joined  the  Solar  Church  who  was  able  to  deliver  on  the  “powers”.    Her  visions  now  come  true.    And  she  went  thru  Undying  Surgery.•Four  questions:•Where  is  she?    She's  lives  in  the  Solar  District's  Solar  Basilica  in  an  estate  that  has  Solar  Clerics,  magical  defenses,  mundane  defenses,  and  servants.•Who  has  the  greatest  influence  over  her?    She  greatly  admires  one  of  the  Councilman,    Page  14  of  16
Minnie  the  Seedling.    His  approval  influences  her  decisions.    She  also  has  a  bevy  of  masked  retainers  that  manager  her  day  to  day  life,  because  she's  blind;  they  are  dedicatedto  her.    Mr  Collins,  Mrs  Dirty  Shire,  and  Mr  Arconstrik.•Whose  in  charge  of  her  bacchanals?      The  church  is  divided  into  four  groups.    The  Father  Summer  and  Sister  Spring  are  the  most  powerful  and  popular.    Sister  Spring  is  responsible  for  the  celebrations;  one  priestess  sponsored  by  Najlkae  takes  care  of  Najlkae's  bacchanals.    Mary  Hears  the  Secrets  of  the  Sting.•Who  is  Mary's  lover  or  husband?    Sexless  marriage  to  an  Undying  to  an  High  Elf  Lord.    She  does  maintain  a  sex  life  with  a  cadre  of  gnoll  refugees  living/imprisoned  on  her  estate.•Toriq  runs  an  investigation  using  his  power  to  determine  that  Najlkae  is  allied  to  the  resistance  unwittingly.    She  unwittingly  spends  a  lot  of  money  that  flows  to  the  Ministry  coffers.    And  the  drag  nets  that  having  been  taking  out  Ministry  people  is  also  taking  out  anti-Ministry  persons.•The  coterie  decides  to  start  with  the  bacchanals.  Slav  is  able  to  pass  herself  off  a  member  of  the  Solar  Church  and  get  invited  to  the  upcoming  bacchanals.    She  and  Toriq  attend  as  a  couple.•They  find  that  bacchanal  is  “gnoll  technology”  fueled  by  “elf  sex  magic”.    Basically,  gnoll  demon  magic  is  collecting  the  elf  sex  magic.•Slav  requests  a  “goblet  of  her  blood”  which  Toriq  delivers  via  “sex  game”.    From  this  she  determines  why  Secrets  of  the  Sting  is  interested  in  gnoll  culture.

|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Date:''|Apr 19, 2007|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			// checkbox linked with this password "save this password on this computer"
			// text savePasswordCheckboxLabel
		onChange: config.macros.option.genericOnChange

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
		return config.options[name] ? "true" : "false";

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
		set: function(name,value) {config.options[name] = decodeCookie(value);}

// need to reload options to load passwordOptions

if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

		pasPassword: "Test password"

Perch is built along the outside of Spire, tied, bolted, welded, glued, and otherwise affixed to the available surfaces. It's a place of shanties, catwalks, and dangerous falls. The PC ministry cell calls it home.

[[The Rut & Wallow]] can be found here.
The secretary to [[Warden Wind-Before-Dawn]] and hidden power directing the prison. 

A sadist who liked submerging prostitutes in freezing water.

Was assassinated at [[The Cage]] by the ministry cell.
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Author:|Simon Baird <simon.baird@gmail.com>|
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
Date.prototype.prettyDate = function() {
  var diff = (((new Date()).getTime() - this.getTime()) / 1000);
  var day_diff = Math.floor(diff / 86400);

  if (isNaN(day_diff))      return "";
  else if (diff < 0)        return "in the future";
  else if (diff < 60)       return "just now";
  else if (diff < 120)      return "1 minute ago";
  else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
  else if (diff < 7200)     return "1 hour ago";
  else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
  else if (day_diff == 1)   return "Yesterday";
  else if (day_diff < 7)    return day_diff + " days ago";
  else if (day_diff < 14)   return  "a week ago";
  else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
  else if (day_diff < 62)   return "a month ago";
  else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
  else if (day_diff < 730)  return "a year ago";
  else                      return Math.ceil(day_diff/365) + " years ago";

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
  return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';

A professor at [[Gywwn-Enforr]] and former lover of [[Lt. Ziminar Langley]]
A professor of [[Gywnn-Enforr]] and a member of the [[Department of Applied Galvanics]]

She lives in [[Little Whitecross]]

She tried to blow up [[Perch]] with lightning.
A city guard bureacrat who stole from the widows and orphans fund in order to maintain his gambling addictions. Also, a shameless aelfir collaborator. 

The PCs use stolen drugs from the [[Roaring Boys]] to buy off Baub's gambling debts, and then plant evidence implying that Baub was on the take from the Roaring Boys.
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Author:|Simon Baird <simon.baird@gmail.com>|
config.quickOpenTag = {

  dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

  createTagButton: function(place,tag,excludeTiddler) {
    // little hack so we can do this: <<tag PrettyTagName|RealTagName>>
    var splitTag = tag.split("|");
    var pretty = tag;
    if (splitTag.length == 2) {
      tag = splitTag[1];
      pretty = splitTag[0];

    var sp = createTiddlyElement(place,"span",null,"quickopentag");

    var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
    if (excludeTiddler)

  miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
    var tagged = store.getTaggedTiddlers(tiddler.title);
    if (tagged.length > 0) {
      var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
      theTag.className = "miniTag";

  allTagsHandler: function(place,macroName,params) {
    var tags = store.getTags(params[0]);
    var filter = params[1]; // new feature
    var ul = createTiddlyElement(place,"ul");
    if(tags.length == 0)
    for(var t=0; t<tags.length; t++) {
      var title = tags[t][0];
      if (!filter || (title.match(new RegExp('^'+filter)))) {
        var info = getTiddlyLinkInfo(title);
        var theListItem =createTiddlyElement(ul,"li");
        var theLink = createTiddlyLink(theListItem,tags[t][0],true);
        var theCount = " (" + tags[t][1] + ")";
        var theDropDownBtn = createTiddlyButton(theListItem," " +

  // todo fix these up a bit
  styles: [
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",

  init: function() {
    // we fully replace these builtins. can't hijack them easily
    window.createTagButton = this.createTagButton;
    config.macros.allTags.handler = this.allTagsHandler;
    config.macros.miniTag = { handler: this.miniTagHandler };
    config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;


Proprietor of [[The Rut & Wallow]].

He's a tough old lump who knows which questions he doesn't want answers to.
1. Skills
Spire uses Domain+Skill, and Reign uses Stat+Skill. There's no room for domains in Reign, unless I treat them as Skills, which would work fine. That gives me 18 skills, which is only 3 per stat.  If I split each Spire skill and domain into two, that gives me 36 skills, which is closer to the granularity that Reign looks for.

Compel - Intimidate, Persuade
Deceive - Lie, Disguise
Fight - Melee Combat, Ranged Combat
Fix - Medicine, Repair
Investigate - Scrutinize, Notice
Pursue - Chase, Track
Resist - Endurance, Willpower
Sneak - Stealth, Smuggling
Steal - Theft, Traps & Locks

Academia - Education (domain), Bureaucracy
Crime - Streetwise, Career Criminal (some sort of "profession: crime" skill)
Commerce - Haggling, Business
High Society - Style & Class, Art
Low Society - Expert (skill), Survival
Occult - Occult Magic, Dark Secrets
Order - Law, Tactics & Strategy
Religion - Divine Magic, Theology
Technology - Retroengineering, Guild Politics

2. One roll character creation
The one-roll tables should reflect various backgrounds.  Probably one column for each domain, maybe.
Option 1. Base life paths on durances.
There are 17 durances: Acolyte, Agent, Builder, Dealer, Duellist, Enlisted, Guard, Human Emissary, Hunter, Information Broker, Killer, Laborer, Occultist, Personal Assistant, Pet, Sage, Spy
There are 9 non-durances: Kept a low profile in Derelictus, Fought to protect your community, Led a doomed uprising, Joined a cult or two, Toughed it out in Red Row, Fell in with a gang of thieves, Spent your time in jail, Hid in plain sight, Helped the Ministry wage their war
Total: 26

Option 2: Base life paths on classes and extra advaces
There are 11 classes: Azurite, Bound, Carrior-Priest, Firebrand, Idol, Knight, Lajhan, Masked, Midwife, Vermissian Sage, and Blood Witch
There are 11 extra advances: City Guard, Chosen of the Hungry Deep, Enlisted, Faithful of King Teeth, Greymanor Investigator, Hellionite, Luck-Priest of Stolz, Minister, Solar Devotee, Vigilite, Vyskant
There are 7 new gods that grant advances: Ishtuk, Luxulyan, Apash, The Many, Miah, Garrack, the Masked God
There are 3 black magic advances: Grangou, Deep Apiarist, Demonologist
There are 3 codex of the deep spire advances: Katakos Delver, Dust Warden, Maiden of the Mother of Shadows
There is 1 other advance: the Corpsefruit Dealer
Total: 36

Option 3: Base life paths on the districts/factions of Spire
4 in Academia: The Benevolent Order of Wisdom and Discovery, Brazacott Technical Institute, The High Elven University of Divine Magic, The Academy of Gywnn-Enforr
3 in Commerce: The North Docks, The Sky Docks, The Blue Port
1 in Crime: Red Row
3 in High Society: Amaranth, Ivory Row, Silver Quarter
4 in Low Society: Derelictus, Perch, The Garden District, The Works
5 in Occult: The Vermissian, The Heart, The Guild of Morticians, The Necropolis, The Midwives
3 in Order: City Guard, Allied Defense HQ, the Council
6 in Religion: The Cathedral of Our Glorious Lady, The Ministry of Our Hidden Mistress, The Sect of Our Crimson Vigil, Pilgrim's Walk, The Solar Basilica, New Heavan
0 in Technology: /(though Gywnn-Enforr and the Works could both be considered Technology/
Total: 28, or 29 if I treat the Guild of Morticians and the Necropolis as separate.

I like option 3 the best.  I can make three tables, for generating one-roll upspire drow, one-roll midspire drow, and one-roll downspire drow.
* Upspire drow: The High Elven University of Divine Magic, The Sky Docks, Silver Quarter, Amaranth, The Guild of Morticians & The Necropolis, The Council, The Solar Basilica, New Heaven, plus something for high-class crime and something for technology (maybe grimaldi's tower? the inverted telescope? the obsidian orrery?)
* Midspire drow: Brazacott Technical Institute, Ivory Row, Perch, The Garden District, The Midwives, The City Guard, The Cathedral of Our Glorious Lady, The Academy of Gywnn-Enforr, plus something involving commerce, and something involving crime.  Maybe use the Feather Island location from the map?
* Downspire drow: The Benevolent Order of Wisdom and Discovery, The Blue Port, The North Docks, Red Row, The Works, Derelictus, The Heart, The Allied Defense HQ, Pilgrim's Walk, The Vermissian
I might move the Vermissian to midspire and Brazacott to downspire. It balances a bit better, but I seems like the "nexus" or whatever for the vermissian would be near the heart.

3. Schools of magic
Occult Magic
* Blood Witchcraft
* Demonology
* Idolatry
* Masks
* Midwifery
* Vermissian Lore

Divine Magic:
* Solar Worship
* Lajhan
* Ministers
* Vigilites
* Azurites
* Charnalites
* The Small Gods
* Luck Priests of Stolz
* Hellionites
* Hungry Deep
* Ghouls of King Teeth

4. Martial styles
* Knightly Orders
* Enlisted Training
* Guard Training

5. Other esoteric disciplines
* Firebrands
* Greymanor Investigation
* Vyskant Infection
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Author:|Simon Baird <simon.baird@gmail.com>|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
config.renameTags = {

  prompts: {
    rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
    remove: "Remove the tag '%0' from %1 tidder%2?"

  removeTag: function(tag,tiddlers) {
    for (var i=0;i<tiddlers.length;i++) {

  renameTag: function(oldTag,newTag,tiddlers) {
    for (var i=0;i<tiddlers.length;i++) {
      var title = tiddlers[i].title;
      store.setTiddlerTag(title, false, oldTag); // remove old
      store.setTiddlerTag(title, true, newTag);  // add new
      store.getTiddler(title).modified = new Date(); // touch modified date

  storeMethods: {

    saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

    saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator) {
      if (title != newTitle) {
        var tagged = this.getTaggedTiddlers(title);
        if (tagged.length > 0) {
          // then we are renaming a tag
          if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))

          if (!this.tiddlerExists(title) && newBody == "")
            // dont create unwanted tiddler
            return null;
      return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator);

    removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

    removeTiddler: function(title) {
      var tagged = this.getTaggedTiddlers(title);
      if (tagged.length > 0)
        if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
      return this.removeTiddler_orig_renameTags(title);


  init: function() {


A lowlife gang operating out of the Garden District. They collect low-end drugs from the farms, and move them to middle city to sell them to middle class drow and humans.

The ministry cell first steals their drugs, and then later frames them for stealing a guard payroll.
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Author:|Simon Baird <simon.baird@gmail.com>|
To use these add them to the commands in ToolbarCommands under EditToolbar,
or in the MptwTheme tiddler under EditTemplate.

  saveCloseTiddler: {
    text: 'done/close',
    tooltip: 'Save changes to this tiddler and close it',
    handler: function(ev,src,title) {
      var closeTitle = title;
      var newTitle = story.saveTiddler(title,ev.shiftKey);
      if (newTitle)
        closeTitle = newTitle;
      return config.commands.closeTiddler.handler(ev,src,closeTitle);

  cancelCloseTiddler: {
    text: 'cancel/close',
    tooltip: 'Undo changes to this tiddler and close it',
    handler: function(ev,src,title) {
      // the same as closeTiddler now actually
      return config.commands.closeTiddler.handler(ev,src,title);


|Description:|Lets you easily switch theme and palette|
|Author:|Simon Baird <simon.baird@gmail.com>|
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette

config.macros.selectTheme = {
  label: {
    selectTheme:"select theme",
    selectPalette:"select palette"
  prompt: {
    selectTheme:"Select the current theme",
    selectPalette:"Select the current palette"
  tags: {

config.macros.selectTheme.handler = function(place,macroName)
  var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
  // want to handle palettes and themes with same code. use mode attribute to distinguish

config.macros.selectTheme.onClick = function(ev)
  var e = ev ? ev : window.event;
  var popup = Popup.create(this);
  var mode = this.getAttribute('mode');
  var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
  // for default
  if (mode == "selectPalette") {
    var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
  for(var i=0; i<tiddlers.length; i++) {
    var t = tiddlers[i].title;
    var name = store.getTiddlerSlice(t,'Name');
    var desc = store.getTiddlerSlice(t,'Description');
    var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
  return stopEvent(e);

config.macros.selectTheme.onClickTheme = function(ev)
  var mode = this.getAttribute('mode');
  var theme = this.getAttribute('theme');
  if (mode == 'selectTheme')
  else // selectPalette
  return false;

config.macros.selectTheme.updatePalette = function(title)
  if (title != "") {
    if (title != "(default)")

config.macros.applyTheme = {
  label: "apply",
  prompt: "apply this theme or palette" // i'm lazy

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
  var useTiddler = params[0] ? params[0] : tiddler.title;
  var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
  btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
  createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });

I've lost my notes for this session.

Something about protecting Winters from green faced assassins, and haunted theater performances, and then assassinating Veq's kid.  It was a messed up session.
Next session:

Investigate Hemlock fruit market and l’enfor noir. &nbsp;L’enfor noir is run by khaats, who built the gentlemen, who hire the staff, who manage the regular employees. &nbsp;They are afraid of the thing that waits behind the coldest flames, and build a ward to seal off its access to this world.

One of the khaats has had dealings with the ministry, and the PCs seek it out. &nbsp;(Name unpronouncable, nicknamed Snarf by the PCs). Snarf is working on exorcising TTTWBTCF from a local madman, Il’zer Shigo.

Lydia uses vermissian powers to exorcise Il’zer, and Snarf thanks them. The PCs negotiate an alliance between Mr. Alas and L’Enfor Noir. &nbsp;This gets them access to Mr. Alas’ smuggling routes, which they want to use to get arms upspire.

Next they set about dismantling Light-Through-Splintered-Glass’ criminal empire. &nbsp;His main lieutenants are:

Mother Moon, the gnoll who runs Arena
The Sisters, three drow who run threadneedle square
Mr Winters, who is engaged in smuggling, weapons, kidnapping, and extortion

Tamar goes spying on Mr Winters, and follows the lieutenants to a great foundry built into the vents below spire. &nbsp;There he spies kidnapped tradespeople from the works chained to forges, forced to make weapons by cruel overseers, led by Corze Drisuzai. He steals Mr Winters’ mask and flees, murdering some guards on the way.

The PCs decide to destroy Mr Winters through reputation damage, since stealing his mask already humiliated him. &nbsp;Next they hire the gladiatrix Molly Millions to wear the mask in her next fight, (which she loses) so everyone knows that Mr Winters lost his mask. &nbsp;

They spy on his money operation to see how he pays of Light-Through-Splintered-Glass. &nbsp;Each week, a trio of aelfir enforcers come downspire, count the cash, and (together with some of Winter’s own soldiers) take the earnings up from Red Row out to the Aelfir District in the Blue Docks. &nbsp;From there, it’s loaded onto a megacorvid to be flown upspire. In exchange, it looks like Light-Through-Splintered-Glass smooths a lot of government wheels for Winters.

The PCs considers means of stealing the money, and instead settle on bombing it. &nbsp;Lydia makes the bomb, Tamar sneaks it into the money pouches, and both roll 10s so a megacorvid explodes over the Blue Port, showing the stalls with feathers and stens. &nbsp;
Light-Through-Splintered-Glass is now disgusted with Winters, and puts out a hit on him, in order to put someone else in charge of the operation. &nbsp;The PCs approach Winters, and Kreth uses a mask of romance to make Winters fall in love with her. He agrees to work with the Ministry if it can protect him from LTSG’s hitmen and provide the infrastructure support to smuggle his goods upspire.

Session  Summary  9/9/2018•Red  Row  crime  leaders•Mr  Alas  allied•Mommas  Thinrees  –  back  door  surgery•Light-Splintered-Glass  allied•Mother  Moon  –  Gnoll  female,  fight  pits,  sports  beating,  an  army  of  pit  fighters,  and  a  gang  of  gnoll  males.•Three  Sisters  –  Three  sisters  who  run  drug  trade.    The  oldest  one  marries  for  society  and  money;  she  has  many  children  but  no  living  husbands.    The  youngest  cooks  the  drugs,  the  middle  one  does  the  books.•Mr.  Winter  –  extortion,  weapons,  kidnapping,  smuggling.•His  operation  is  a  large  foundry  in  the  lower  level  ventilation  shaft.  It  is  fully  operational  with  hordes  of  upper  level  craftsmen,  drow,  elf,  and  human,  chained  to  their  work  stations.    An  overseer  with  a  cat  of  nine-tails  keeps  them  working.•Mr  Winter  is  wearing  a  mask  that  is  of  Mother  Winter,  which  Fortunate  steals.•The  group  discusses  what  to  do  with  the  mask  and  hits  upon  a  scheme  where  the  mask  is  given  to  a  Mother  Moon  pit  fighter.    Abu  seduces  and  pays  a  friendly  female  gnoll  to  place  it  on  her  next  opponents  face,  assuming  he  losses,  then  tea  bagging  him.    This  fails.•Fortunate  spies  on  Mr  Winter  long  enough  to  see  how  he  pays  off  Light-Splintered-Glass'  lieutenants.    This  leads  to  a  bomb  being  placed  on  the  dire  raven  flying  the  pay  roll  to  Mr  Winter's  boss.    This  causing  d8  reputation  stress,  which  causes  huge  fall  out  with  Light-Splintered-Glass  and  Mr  Winter's  reputation  within  his  own  organization.•Kreth  and  Fortunate  meet  with  Mr  Winter  and  offer  a  helping  hand.    Kreth  wears  the  Mask  of  the  Lover  to  make  this  seem  more  like  good  fortune  than  black  mail.    Mr  Winter  signs  on  with  them  for  protection  Light-Splintered-Glass  and  a  replacement  of  Light-Splintered-Glass'  up  spire  services.•Independent  operators•Gentlemen  –  L'enfor  Noir  Club.    Prostitution.•Corpses  never  come  out  of  this  place•Glass  Library  –  Researching  their  technology.    He  Who  Waits  Beyond  theColdest  Flame  and  binding  thereof.    The  Gentlemen  come  from  elsewhere,  clock  work  constructs,  who  were  created  by  the  Khaat  (a  seven  eyed  race  that  drift  and  flow  through  our  reality).    They  have  strange  gifts.    The  Khaat  are  refugees  hiding  from  He  Who  Waits  Beyondthe  Coldest  Flame.    Khaat  technology  of  reality  bending  clockworks  is  based  on  keeping  that  entity  away.    The  club  is  behind  a  ward.    The  Gentlemen  are  their  mouth  piece  to  the  Drow  and  others.    The  Khaat  are  hedonists  thus  the  club.    The  corpses  feed  the  ward  and  go  back  through.Page  13  of  16
•One  khaat,  Snarf,  is  a  friend  of  the  revolution.•The  khaat  feed  corpses  to  HWHBtCF  to  keep  that  one  sleepy.    They  kill  when  enough  corpses  are  not  readily  normal.•The  khaat  need  a  laundry  list  of  things  from  the  Spire.    All  of  it  is  weird.•The  midwife  locates  IL'zer  Shigo  a  drow  haunted  by  the  supernatural  after  having  glimpsed  HWHBtCF  where  a  bathrobe.    A  memory  blank  clears  his  supernatural  problem.    They  drag  his  unconscious  form  to  a  nearby  rent-a-hovel,  where  Snarf  appears  to  them.    They  successfully  broker  a  treaty  of  mutual  benefit  between  Wicked  Mr  Alas  and  Snarf.•Brother  Hellion  –  religious  leader;  he  and  his  followers  worship  the  gun.•Kowz    •Stone  Strong  Grassgreen  –  Hemlock  Fruit  Market•Mr  Alas  wants  Hemlock  Fruit  Market 
| !Character | !Class | !Durance | !Sex | !PC Bonds |
| Abu ~Al-Nisr | Carrion Priest | Enlisted | Male | ??? |
| Fortunate Tamar ~Al-Nisr | Bound | Hunter | Male | Caught Lyddia when she fell off the Spire. |
| Lyddia Jath | Vermissian Sage | Agent | Female | Knows that Abu joined the gnolls during the war |
| Slav Icktus | Blood Witch | Acolyte | Female | Tasted Lyddia's blood; she will kill Tariq |
| Tariq ~Al-Nisr | Firebrand | Duelist | Male | Radicalized Slav, former lovers |
| Therratrix | Midwife | //joined a cult or two// | Female | Saved Abu's life during the war |

! Infiltrating the Hive
[[April 22 2018]] Session zero: character creation and sketching out the campaign
[[May 6 2018]] A payroll heist, a murder board, and looking for the big picture
[[May 20 2018]] New secretary day

! The ~Gywwn-Enfor Situation
[[June 3 2018]] Forget the demons and the undying gangsters, someone just tried to set Perch on fire!
[[June 17 2018]]
[[July 15 2018]]
[[July 29 2018]]

! Lord Veq ~Light-Through-Shattered-Glass
[[August 8 2018]]
[[September 9 2018]]
[[September 23 2018]]
[[October 7 2018]]
A Spire campaign
Rut & Wallow & Revolution
A human mercenary working for Gywnn-Enforr campus security.  A deadly marksman.
.downloadLink {
.downloadLink a {
	border:2px solid #ddd;
Bohemians, artists, and occultists. They mainly party on the roofs of [[Ivory Row]], are are a breeding ground for strange cults. 

They have been partially infiltrated by [[Cult of the Intelligence]]
A crime network run by [[Lord Veq Light-Through-Splintered-Glass]]
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Author:|Simon Baird <simon.baird@gmail.com>|
See http://mptw.tiddlyspot.com/#TagglyTagging


  parseTagExpr: function(debug) {

    if (this.trim() == "")
      return "(true)";

    var anyLogicOp = /(!|&&|\|\||\(|\))/g;
    var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

    var spaced = this.
      // because square brackets in templates are no good
      // this means you can use [(With Spaces)] instead of [[With Spaces]]
      replace(/\[\(/g," [[").
      replace(/\)\]/g,"]] ").
      // space things out so we can use readBracketedList. tricky eh?
      replace(anyLogicOp," $1 ");

    var expr = "";

    var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

    for (var i=0;i<tokens.length;i++)
      if (tokens[i].match(singleLogicOp))
        expr += tokens[i];
        expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

    if (debug)

    return '('+expr+')';


  getTiddlersByTagExpr: function(tagExpr,sortField) {

    var result = [];

    var expr = tagExpr.parseTagExpr();

    store.forEachTiddler(function(title,tiddler) {
      if (eval(expr))

      sortField = "title";

    result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});

    return result;

config.taggly = {

  // for translations
  lingo: {
    labels: {
      asc:        "\u2191", // down arrow
      desc:       "\u2193", // up arrow
      title:      "title",
      modified:   "modified",
      created:    "created",
      show:       "+",
      hide:       "-",
      normal:     "normal",
      group:      "group",
      commas:     "commas",
      sitemap:    "sitemap",
      numCols:    "cols\u00b1", // plus minus sign
      label:      "Tagged as '%0':",
      exprLabel:  "Matching tag expression '%0':",
      excerpts:   "excerpts",
      descr:      "descr",
      slices:     "slices",
      contents:   "contents",
      sliders:    "sliders",
      noexcerpts: "title only",
      noneFound:  "(none)"

    tooltips: {
      title:      "Click to sort by title",
      modified:   "Click to sort by modified date",
      created:    "Click to sort by created date",
      show:       "Click to show tagging list",
      hide:       "Click to hide tagging list",
      normal:     "Click to show a normal ungrouped list",
      group:      "Click to show list grouped by tag",
      sitemap:    "Click to show a sitemap style list",
      commas:     "Click to show a comma separated list",
      numCols:    "Click to change number of columns",
      excerpts:   "Click to show excerpts",
      descr:      "Click to show the description slice",
      slices:     "Click to show all slices",
      contents:   "Click to show entire tiddler contents",
      sliders:    "Click to show tiddler contents in sliders",
      noexcerpts: "Click to show entire title only"

    tooDeepMessage: "* //sitemap too deep...//"

  config: {
    showTaggingCounts: true,
    listOpts: {
      // the first one will be the default
      sortBy:     ["title","modified","created"],
      sortOrder:  ["asc","desc"],
      hideState:  ["show","hide"],
      listMode:   ["normal","group","sitemap","commas"],
      numCols:    ["1","2","3","4","5","6"],
      excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
    valuePrefix: "taggly.",
    excludeTags: ["excludeLists","excludeTagging"],
    excerptSize: 50,
    excerptMarker: "/%"+"%/",
    siteMapDepthLimit: 25

  getTagglyOpt: function(title,opt) {
    var val = store.getValue(title,this.config.valuePrefix+opt);
    return val ? val : this.config.listOpts[opt][0];

  setTagglyOpt: function(title,opt,value) {
    // create it silently if it doesn't exist
    if (!store.tiddlerExists(title)) {
      store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");

      // <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
      // Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
      // Because we don't want to hide real tags, check that they aren't actually tags before doing so
      // Also tag them as tagglyExpression for manageability
      // (contributed by RA)
      if (!store.getTaggedTiddlers(title).length) {

    // if value is default then remove it to save space
    return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);

  getNextValue: function(title,opt) {
    var current = this.getTagglyOpt(title,opt);
    var pos = this.config.listOpts[opt].indexOf(current);
    // supposed to automagically don't let cols cycle up past the number of items
    // currently broken in some situations, eg when using an expression
    // lets fix it later when we rewrite for jquery
    // the columns thing should be jquery table manipulation probably
    var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
    var newPos = (pos + 1) % limit;
    return this.config.listOpts[opt][newPos];

  toggleTagglyOpt: function(title,opt) {
    var newVal = this.getNextValue(title,opt);

  createListControl: function(place,title,type) {
    var lingo = config.taggly.lingo;
    var label;
    var tooltip;
    var onclick;

    if ((type == "title" || type == "modified" || type == "created")) {
      // "special" controls. a little tricky. derived from sortOrder and sortBy
      label = lingo.labels[type];
      tooltip = lingo.tooltips[type];

      if (this.getTagglyOpt(title,"sortBy") == type) {
        label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
        onclick = function() {
          return false;
      else {
        onclick = function() {
          return false;
    else {
      // "regular" controls, nice and simple
      label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
      tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
      onclick = function() {
        return false;

    // hide button because commas don't have columns
    if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
      createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");

  makeColumns: function(orig,numCols) {
    var listSize = orig.length;
    var colSize = listSize/numCols;
    var remainder = listSize % numCols;

    var upperColsize = colSize;
    var lowerColsize = colSize;

    if (colSize != Math.floor(colSize)) {
      // it's not an exact fit so..
      upperColsize = Math.floor(colSize) + 1;
      lowerColsize = Math.floor(colSize);

    var output = [];
    var c = 0;
    for (var j=0;j<numCols;j++) {
      var singleCol = [];
      var thisSize = j < remainder ? upperColsize : lowerColsize;
      for (var i=0;i<thisSize;i++)

    return output;

  drawTable: function(place,columns,theClass) {
    var newTable = createTiddlyElement(place,"table",null,theClass);
    var newTbody = createTiddlyElement(newTable,"tbody");
    var newTr = createTiddlyElement(newTbody,"tr");
    for (var j=0;j<columns.length;j++) {
      var colOutput = "";
      for (var i=0;i<columns[j].length;i++)
        colOutput += columns[j][i];
      var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
    return newTable;

  createTagglyList: function(place,title,isTagExpr) {
    switch(this.getTagglyOpt(title,"listMode")) {
      case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
      case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
      case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
      case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;

  getTaggingCount: function(title,isTagExpr) {
    // thanks to Doug Edmunds
    if (this.config.showTaggingCounts) {
      var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
      if (tagCount > 0)
        return " ("+tagCount+")";
    return "";

  getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
    return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);

  getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
      indent = 1;

    var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
    var t = store.getTiddler(title);

    if (t && displayMode == "excerpts") {
      var text = t.text.replace(/\n/," ");
      var marker = text.indexOf(this.config.excerptMarker);
      if (marker != -1) {
        return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
      else if (text.length < this.config.excerptSize) {
        return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
      else {
        return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
    else if (t && displayMode == "contents") {
      return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
    else if (t && displayMode == "sliders") {
      return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
    else if (t && displayMode == "descr") {
      var descr = store.getTiddlerSlice(title,'Description');
      return descr ? " {{excerpt{" + descr  + "}}}" : "";
    else if (t && displayMode == "slices") {
      var result = "";
      var slices = store.calcAllSlices(title);
      for (var s in slices)
        result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
      return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
    return "";

  notHidden: function(t,inTiddler) {
    if (typeof t == "string")
      t = store.getTiddler(t);
    return (!t || !t.tags.containsAny(this.config.excludeTags) ||
        (inTiddler && this.config.excludeTags.contains(inTiddler)));

  // this is for normal and commas mode
  createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

    var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

    if (this.getTagglyOpt(title,"sortOrder") == "desc")
      list = list.reverse();

    var output = [];
    var first = true;
    for (var i=0;i<list.length;i++) {
      if (this.notHidden(list[i],title)) {
        var countString = this.getTaggingCount(list[i].title);
        var excerpt = this.getExcerpt(title,list[i].title);
        if (useCommas)
          output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
          output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

        first = false;

    return this.drawTable(place,
      this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
      useCommas ? "commas" : "normal");

  // this is for the "grouped" mode
  createTagglyListGrouped: function(place,title,isTagExpr) {
    var sortBy = this.getTagglyOpt(title,"sortBy");
    var sortOrder = this.getTagglyOpt(title,"sortOrder");

    var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    if (sortOrder == "desc")
      list = list.reverse();

    var leftOvers = []
    for (var i=0;i<list.length;i++)

    var allTagsHolder = {};
    for (var i=0;i<list.length;i++) {
      for (var j=0;j<list[i].tags.length;j++) {

        if (list[i].tags[j] != title) { // not this tiddler

          if (this.notHidden(list[i].tags[j],title)) {

            if (!allTagsHolder[list[i].tags[j]])
              allTagsHolder[list[i].tags[j]] = "";

            if (this.notHidden(list[i],title)) {
              allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
                    + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

              leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers


    var allTags = [];
    for (var t in allTagsHolder)

    var sortHelper = function(a,b) {
      if (a == b) return 0;
      if (a < b) return -1;
      return 1;

    allTags.sort(function(a,b) {
      var tidA = store.getTiddler(a);
      var tidB = store.getTiddler(b);
      if (sortBy == "title") return sortHelper(a,b);
      else if (!tidA && !tidB) return 0;
      else if (!tidA) return -1;
      else if (!tidB) return +1;
      else return sortHelper(tidA[sortBy],tidB[sortBy]);

    var leftOverOutput = "";
    for (var i=0;i<leftOvers.length;i++)
      if (this.notHidden(leftOvers[i],title))
        leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

    var output = [];

    if (sortOrder == "desc")
    else if (leftOverOutput != "")
      // leftovers first...

    for (var i=0;i<allTags.length;i++)
      if (allTagsHolder[allTags[i]] != "")
        output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

    if (sortOrder == "desc" && leftOverOutput != "")
      // leftovers last...

    return this.drawTable(place,


  // used to build site map
  treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

    var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    if (sortOrder == "desc")

    var indent = "";
    for (var j=0;j<depth;j++)
      indent += "*"

    var childOutput = "";

    if (depth > this.config.siteMapDepthLimit)
      childOutput += indent + this.lingo.tooDeepMessage + "\n";
      for (var i=0;i<list.length;i++)
        if (list[i].title != title)
          if (this.notHidden(list[i].title,this.config.inTiddler))
            childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

    if (depth == 0)
      return childOutput;
      return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;

  // this if for the site map mode
  createTagglyListSiteMap: function(place,title,isTagExpr) {
    this.config.inTiddler = title; // nasty. should pass it in to traverse probably
    var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
    return this.drawTable(place,
        this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic

  macros: {
    tagglyTagging: {
      handler: function (place,macroName,params,wikifier,paramString,tiddler) {
        var parsedParams = paramString.parseParams("tag",null,true);
        var refreshContainer = createTiddlyElement(place,"div");

        // do some refresh magic to make it keep the list fresh - thanks Saq

        var tag = getParam(parsedParams,"tag");
        var expr = getParam(parsedParams,"expr");

        if (expr) {
        else {
          if (tag) {
          else {

      refresh: function(place) {
        var title = place.getAttribute("title");
        var isTagExpr = place.getAttribute("isTagExpr") == "true";
        var showEmpty = place.getAttribute("showEmpty") == "true";
        var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
        if (countFound > 0 || showEmpty) {
          var lingo = config.taggly.lingo;
          if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
                isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
            if (countFound == 0 && showEmpty)

  // todo fix these up a bit
  styles: [
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",

  init: function() {
    config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;



By Saq Imtiaz

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

config.formatters.unshift( {
  name: "inlinesliders",
  // match: "\\+\\+\\+\\+|\\<slider",
  match: "\\<slider",
  // lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
  lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
  handler: function(w) {
    this.lookaheadRegExp.lastIndex = w.matchStart;
    var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
    if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
      var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
      var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
      panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
      w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
   onClickSlider : function(e) {
    if(!e) var e = window.event;
    var n = this.nextSibling;
    n.style.display = (n.style.display=="none") ? "block" : "none";
    return false;

A bordello in [[Middle City]].  The scene of [[Pinioned-Limbs-in-Shadow]]'s assassination.
Drow squatters who live in [[Ivory Row]] mansions in secret, hiding from the landlords.

They're like //The Borrowers//, except not tiny, and a bit stabbier.
The headquarters of the city guard.
!!! The Prison
Filled with cells, screams, and torture chambers. Lots of interrogations are held, along with prisoners patiently waiting for someone to pay bail ransom. Many of the cells are rigged to drop down a "bottomless" pit and crash into Saint Perdita's Circle far below.
Run by [[Warden Wind-Before-Dawn]], who has a recent obsession with Desang theater. 
!!! The Guard Headquarters
A boggling maze of offices, hallways, archives, waiting rooms, and piles and piles of paperwork. File clerks outnumber the patrol guards two to one.
Run by [[Commissioner Armon LeVop]], a frantic and put upon drow who just wants the keep things running.  Also the domain of [[Lt. Ziminar Langley]] and [[Quartermaster Baub]]
!!! The Middle City Guard Post
The Hive also acts as the central guard post for Middle City, which the building looks way overbuilt for.  The middle city guards report to [[Captain Blessed]]
Owned by [[Quint]], a gruff old drow who doesn't ask many questions.

The bar in lower Perch where the ministry cell hangs out and conducts their plans. Tariq is the bartender, and Slav is a bar wench. The rest of the ministry cell are just regulars and layabouts.

The local guard like to come here to drink, even though (or because) it's outside of their jurisdiction. Also, Tariq keeps giving out free drink coupons to the guards as an excuse to walk around the Hive.

The floor is slanted, but there are working bathrooms: diverted water provides some running non-potable water, and a hole in the privy floor drops waste into a long gutter when empties out into the void beneath Perch.  The bar also has prominent rafters and an old chandelier. 

Over time, the decor has improved, as the players keep stealing furnishings and bringing them back to the bar. The pub's owner has long since stopped questioning this.
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Author:|Simon Baird <simon.baird@gmail.com>|
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;


  toggleTag: {

    createIfRequired: true,
    shortLabel: "[[%0]]",
    longLabel: "[[%0]] [[%1]]",

    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      var tiddlerTitle = tiddler ? tiddler.title : '';
      var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
      var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
      var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
      var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
      var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
      label = (label == '-' ? '' : label); // dash means no label
      var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
      var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
        if (!store.tiddlerExists(title)) {
          if (config.macros.toggleTag.createIfRequired) {
            var content = store.getTiddlerText(title); // just in case it's a shadow
            store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
            return false;
        if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
            theTiddler.modified = new Date();
        return true;


A member of the [[Cult of the Intelligence]] who is infiltrating the [[Sunlight Collective]]
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'rutwallowrevolution';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");

// create some shadow tiddler content

 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"

 "tiddlyspot password:",
 "<<option pasUploadPassword>>",

 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"

 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."

| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 15/11/2018 13:20:52 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 13:31:45 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 13:40:58 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 15:13:44 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 15:30:10 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 15:42:20 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 15/11/2018 15:44:08 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 16/11/2018 15:02:37 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . | ok |
| 16/11/2018 16:21:30 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . |
| 17/11/2018 22:26:23 | Trudge | [[/|http://rutwallowrevolution.tiddlyspot.com/]] | [[store.cgi|http://rutwallowrevolution.tiddlyspot.com/store.cgi]] | . | [[index.html | http://rutwallowrevolution.tiddlyspot.com/index.html]] | . |
|''Description:''|Save to web a TiddlyWiki|
|''Date:''|Feb 24, 2008|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'

// Environment

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
// Upload Macro

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);

config.macros.upload.action = function(params)
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			return false;
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			return false;
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;

// uploadOptions Macro

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
			uploadCaption = config.macros.upload.label.uploadLabel;
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
	options: [
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
	onCancel: function(e)
		return false;
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 

// upload functions

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
		if (bidix.debugMode) 
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
	if(onlyIfDirty && !store.isDirty())
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
	return r;

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
		} else {
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
	} else {

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
		} else {
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
		if (responseText.charAt(0) != '0')
			status = null;
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
	return r;

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;

// UploadLog
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
	return this;

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			this.tiddler.text = textArray.join('\n');		
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	// refresh and notifiy for immediate update
	store.notify(this.tiddler.title, true);

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
	this.addText(" "+status+" |");

// Utilities

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"

bidix.dirname = function(filePath) {
	if (!filePath) 
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));

bidix.basename = function(filePath) {
	if (!filePath) 
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;

// Initializations

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"

// Options Initializations

// Backstage
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}


A poet-confessor and prison warden. He's fascinated with Desang, and is trying to organize a theater troope out of prisoners.

His secretary, [[Pinioned-Limbs-in-Shadow]] was more or less running the prison for him while he focused on his art, until she was tragically assassinated.
One of the landlords of [[Ivory Row]], and one of the two main crime lords in the city.

Resents the gods for failing him. Likes to hire occultists for muscle.


Abu learned the Mr Alas was, in the past, hiring demonologists to curse rival land owners so he could buy land on the cheap. Abu even got some names of these rivals.
[[RenameTagsPlugin]] Allows you to easily rename or delete tags across multiple tiddlers
[[MptwConfigPlugin]] Miscellaneous tweaks used by MPTW
[[PrettyDatesPlugin]] Provides a new date format ('pppp') that displays times such as '2 days ago'
[[QuickOpenTagPlugin]] Changes tag links to make it easier to open tags as tiddlers
[[SaveCloseTiddlerPlugin]] Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler
[[InstantTimestampPlugin]] A handy way to insert timestamps in your tiddler content
[[HideWhenPlugin]] Allows conditional inclusion/exclusion in templates
[[SelectThemePlugin]] Lets you easily switch theme and palette
[[TagglyTaggingPlugin]] tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate
[[ToggleTagPlugin]] Makes a checkbox which toggles a tag in a tiddler
[[ExtendTagButtonPlugin]] Adds a New tiddler button in the tag drop down
[[NewMeansNewPlugin]] If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on
[[NewHerePlugin]] Creates the new here and new journal macros
[[LessBackupsPlugin]] Intelligently limit the number of backup files you create
[[CloseOnCancelPlugin]] Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open
[[MptwUserConfigPlugin]] A place to put your config tweaks so they aren't overwritten when you upgrade MPTW
[[UploadPlugin]] Save to web a TiddlyWiki
[[TspotSetupPlugin]] Contains the stuff you need to use Tiddlyspot
[[More Plugins]]