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]];}

	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]];}

#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]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.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]];}

#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 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.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:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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:0px 3px 0px 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.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 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 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 use a logographic writing system and 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;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox where print preview displays the noscript content */
noscript {display:none;}
<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 closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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 +saveTiddler -cancelTiddler deleteTiddler'></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'></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
*In attendance: [[Airhead]], [[Arda]], [[Judgment]], [[Sugama]]
*Experience gained: 2

*Met [[Gwendylyn D'Corci]] along road, helped her get to [[Quainsbrook]].
*Attacked by cultists of some sort demanding Gwendylyn.
*Made it to Quainsbrook during Festival of the ~Half-Hundred Hounds.
*Learned that many pregnant women have been attacked lately.
*Acquired a Quainsbrook hound.

![[Judgment]]'s Jounral
It was yet another uneventful day: some cowardly brigands attempting to kill us and take our goods. We made quick work of them.
Then finally a change in the week full of nothing of interest. We found a woman, a somewhat large woman on the road, we decided to escort her to the nearby village.
Then more interesting things happened. We were attacked by a necromancer and some slave drivers. The monster killed his own slaves who were running for their lives. I was lucky enough to get the last hit on him… right in the heart…. The black, evil heart.
The rest of the night was yet again uneventful. The dwarf, yet again surprised us by retrieving a living thing out of the woman we were escorting. I had known he had some medical training but I was nontheless impressed.
We made it to the village all the while the dwarf explained the ins and outs of “baby making” as he termed it. It was intriguing.
The village had a strange ritual where they pull against a pack of domesticated animals that they called “hounds.” We were invited to try and as expected we failed.
The rest of the night was spent patrolling the village fro trouble but the hounds seem to be quite good at that as well.

![[Sugama]]'s Journal
Walking though the forest on a main path to finding a village or town with Judgment hiding in the outskirts of the forest to the right of me, Airhead a bit closer on the left side of the forest, and Arda right behind me, we all get ambushed by a bunch of random rogues who all  pile up on  me not seeing Judgment or Airhead, and not finding Arda a huge threat. As i start to smack them down with my sword, there appeared to be two archers hiding in the trees that i could not make out where their coming from. I end up exploding one of the rogues as Judgment comes up from behind another one and stabs him in the heart. I then turn around to smack the other guy that put me into a small shock and he just kind of fainted. We then spotted the archer rogues and Airhead managed to catch up to one of them who then surrendered, but the other one ran  away.  I have intimidated on of the rogues to tell us where their camp's at and we rushed there to raid it. once we got to the camp, we found out it was empty, and got back on the main road to continue on. As we continue on through the forest we hear crying and then notice a human lady crying. We end up finding out that her name was Gwendylyn D'Corci and she was pregnant so we had decided to help her get to the nearest town, Quainsbrook, which was not far away. Going towards the town, we get attacked buy some cultists who seemed to have slave warrior. Their magic user, which we didn't know if it was a Wizard or Necromancer, was the leader and who did not want to challenge me on a one on one fight. These cultists were after Gwendylyn D'Corci and we did not give her to them, they sent their slave warriors towards us and I intimidated them to not attack us. Airhead ended up shooting one of the cultists that had a whip right in the eye and killing him. I closed in on the other two while Judgment got right from behind the magic user, who killed the slave warriors, and stabbed him in the kidney which sent the magic user into shock. The magic user jumped right out of shock and sent skulls right into Judgment's face which sent Judgment into shock that he snapped right out of. During that time, i ripped to shreds one of the cultists and the other one couldn't hit me at all. The wizard pulled out a green potion that he though at Judgment and it summoned up a bunch of useless bracelets. while we were all fighting the cultists Gwendylyn D'Corci ran behind Airhead and tripped on the overgrowth, and moments later she was screaming for help about something and Arda came up to her and used her survival skills to help Gwendylyn give birth to the baby. While helping  Gwendylyn Arda decides to help fight a bit more and shoots the magic user in the back shoulder and sends him into shock and gave Judgment a chance to kill him. We killed off the last Cultist and then with my great Healing skills, I help Gwendylyn give birth to her little boy baby. We then travel down to Quainsbrook and Gwendylyn tells us everything about her. She said she was a daughter of a noble in Shentreau, ran away because she was pregnant and feared that her father would have her lover killed. she then tells us about the down and that their having their Festival of the ~Half-Hundred Hounds. We bring Gwendylyn to the place she was going and then did a tug-o-war with the Quainsbrook hounds which we could pull only 26. The next morning we go to look at the Quainsbrook hounds to see if we could get one as a companion, but they seemed to be too expansive so we decide to go visit Gwendylyn and she offered to buy us one of the hounds that Arda wanted. 
*In attendance: [[Airhead]], [[Arda]], [[Judgment]], [[Sugama]]
*Experience gained: 2

*Prequel; PCs' first adventure together
*Arrive in the fishing village of [[Jub]] on [[Jub Jub Lake]] near the [[Dread Mountains]]
*Locals having problems catching fish; legendary black leviathan returned; formerly peaceful goblins attacking
*Stopped goblin raid on village
*Captured [[Geebo]] who lead them to goblin village, explains goblins having problems with food, dwarves took over goblin lair in mountains
*Cleared dwarves out of goblin tunnels, discovered leviathan was actually a submarine

![[Judgment]]'s Journal
For some strange reason my companions decided to visit a nearby villiage to rest and get supplies. Strange rituals them.... eating.... and resting.

Seeing the potential trouble that lot would cause i decided to tag along... if for nothing else but the entertainment.

Strangely enough the villagers seemed to be sacrificing their own to some being they call the "Leviathan." again my interest in piqued by strange rituals. Upon questioning the villagers the truth is revealed: they are starving and they are feebly attempting to fish in a pond guarded by the strange beast.

Before i have time to commit myself to the salvation of the townsfolk...the town of Jub... would that make them Jubians?....

a few cowardly hardly trained... truly annoying.... goblins decided to raid the village.

More trouble for the poor villiage. we saved one bucket and that fool or a dwarf throws some of it at the goblins....then we manage to stop one.... so.... unfortunate.

The diminutive twit has the voice of a thousand suns dying. i had to ..... cringe.... in pain.

then we followed him into a villiage of more annoyances. the information  they divulged  simply pawned off the blame on evil dwarves.

Has the village no luck?

we found the cave entrance...the goblin home... and the gaurd... was asleep
more mortal rituals... but an advantagous one to us.

I managed to kill him without alerting the rest. or so it seemed.... until we found ourselves in an ambush. we made quick work of them.... all but one

that one kept mocking me.... a strange thing to do when confronted by warforged.

then the world turned inside out and before i realized what happened the gnomish bastard was covered in green goo and talking in runes.

once we took care of the last one we moved on.

Then we discovered the secret of the "Leviathan"....some kind of submersible

we freed the slaves the dwarves took and made quick work of the dwarves.

With the villagers safe and the food supplies in stock once again we were thanked by the villagers.

Then... once my companion's appetites were... sated.....we moved on to our prior destination.

now would be a good time to mention that the one with wind in his bones did no eating or drinking r any other such unnecessary... ritual... he must be constructed of similar magic to me.

![[Sugama]]'s Journal
SCENE ONE!!!!!(Hermmf) A giant FREAKING HOLE! pops out of nowhere and swallows the whole group,INCLUDING ME! STUPID HOLE!, then it sends us ALL back in time, I thought OH GREAT! and then we pop up at the FIRST FREAKING ADVENTURE we had, what was that place called?...... O, right it was Jub something or somewhat place, I don't know , I just remembered there was some kind of food involved so i was happy. Anyways....... GOD DAMN IT!..... where was I?..... ah right, So the second we get to the Jub town place, i smelled lots of food and stuff right, but then we notice a bunch of people looking out at the water and this giant monster thingy poops out and its some guy on a boat, and then I was like GREAT! I'm not getting any food for a while till this is solved and I was bummed. Then we find out that all their food is almost ALL FREAKING GONE! so I was mad that I can't eat and then a bunch of goblins started attacking the village, right? and so I was like, DARN DOG DAMN IT! I JUST WANT FOOD! right? so I get up to them goblins tell them to go away or send me the leader to fight, but as FREAKING ALWAYS! they did not listen and ran right for the small amount of food that was left, RAN RIGHT PAST ME THE DAMN BUGGERS! oh, hold on......(Munch munch munch!)..............( Slirp Gulp Slirp Gulp)..(Drip on journal)                                              Anyways, ......(reading back the journal).....Right, so one of them comes right by me with the damn fish and i smack the fish out of him and grab it                                                  right, but i could not catch the other one but i thought that i could, you know, grab on of the fish and knock the other guy out with it, but i failed at it                                                 and the goblin just garbed the fish and ran away with it,DAMN BASTARD!, i got angry and scared the living bajesues out of one of the dog thingys the goblins                                where riding. Hold on one more time.........(Munch munch munch Munch munch munch) ................(Slirp Slirp Slirp BIG Gulp)..........(Reading back).......Ok........            ...Right, STUPID WATER DRIP ON THE FREAKING PAPER! sorry, Right, ok, so then we go talk to the goblin king guy and then we find out dwarves took over the goblin cave.... and I was like FEED ME!!!! IM SO HUNGRY! at that moment but that did not happen...... anyways (Munch munch) as i was saying the tunnel was mostly boring, a bunch of dwarves hanging out, oh yeah there was this spider hole in the cave, we closed it back  in after we found out what it was, but that was not a big deal, right we get down to the bottom of the cave and a bunch of STUPID DWARVES pile up on me and I don't remember much of everything else.......(Munch Munch Munch Munch Munch Munch Munch Munch)    
*In attendance: [[Airhead]], [[Arda]], [[Judgment]], [[Sugama]]
*Experience gained: 2

*Went to [[Shentreau]].
*On way there, stopped by [[Anastarius]]; given 10,000 gold to buy a [[Minaerva]] painting at auction, and told to be on the lookout for [[Hector & Umberto]].
*Met [[Carol Mathers]] in line to enter Shentreau, a young woman hoping to sell her paintings.
*Judgment and Sagama repeatedly harassed a guard named [[Bogart]].
*Learned that Minaerva paintings go for 15,000 gold or more.
*Judgment meets a warforged named [[Shentreau]].
*Currently organizing a ball to falsely introduce Arda to the city as a noblewoman.
*Arda got dress from [[Ladisa]].

![[Sugama]]'s Journal
I have on that day that we went to Shentreau, decided that i need to eat more jerky. before we went there though, right after we left Quainsbrook, this bird, who i wanted to eat cause i was hungry at that time but then changed into a dragon person apparently. anyways he gave us a bunch of money and told us to buy a painting, i did not care, i just wanted food and not to be involved with paintings..... anyways we kept on walking and got to Shentreau where there was a kind of big line to get into and the lady in front of us, this is why i said that i need to eat more jerky, gave me some of her fathers jerky, which was the most delicious food i ever ate. then i went to the inn with the dog so someone stays there with the dog to guard the money. after a long time Arda shows up, and good thing too, cause i was going to eat her little puppy. anyways i went downstairs to get some food at the inn. after eating i got hooked up with the servant lady, she told me to show up at the back room  at midnight. after i ate, i went out back upstairs and waited till midnight for an expected to be exciting night, but i did not enjoy it as much as she did. next morning i went out to get some information about that famous artist lady but i bumped into this annoying guard that was drinking and stuff, anyways he left before i got the info i wanted. then i wandered around till i sew Judgment talking to a guard and as i came up judgment went to the next guard but i got that guard that judgment was talking to mad and he called the other guards and that other guard was there, it was hectic but i got out of it safely. after that i just went back to  the inn and got some food on the way.
*In attendance: [[Airhead]], [[Arda]], [[Brad]], [[Judgment]], [[Sugama]]
*Experience gained: 2

*Held party, met [[Brad]], [[Lord Martok]], [[Krayton Dax]], [[Jinx Malone]].
*Krayton attempted to blackmail Arda, saying he knows she's not a noble.
*[[Magdalena]]'s father told [[Sugama]] he impregnated her, forced him to marry her.
*Party attacked by [[The Chosen]], also attacked Artists' Alley, severely burning [[Ladisa]] before being stopped.
*Captured Chosen vandal claims to be working for [[Lord Martok]].
*Brad invites Arda and her companions to stay with him.
*Next day, Sugama is married to Magdalena. Runs away after, challenges her father to a duel.
*Jinx Malone's article in the Shentreau Herald pans the party.
*Next day, while going through the park in a carriage, get a note from Krayton demanding his money.
*Upon return to Brad's mansion, guard has a package for [[Judgment]]. From Indigo, contains Krayton's head.
*Next morning, Jinx Malone writes that she's received evidence that Arda is not a noble.
*Go to the auction. Recognize case containing the [[Minaerva]] painting as that carried by [[Carol Mathers]] when they entered Shentreau.
*[[Hector & Umberto]] show up at last minute to outbid Brad on the [[Minaerva]] painting.
*[[Judgment]] follows Hector & Umberto after they leave.
*The rest of the party tells Brad the whole truth.
*In attendance: [[Airhead]], [[Arda]], [[Brad]], [[Judgment]], [[Sugama]]
*Experience gained: 2

*[[Judgment]] sneaks into [[Hector & Umberto]]'s house. Finds Umberto in a room filled with artwork.
*Men from the auction house bring in the new [[Minaerva]] painting, put it up.
*Judgment steals it and runs away.
*[[Sugama]] makes an ass out of himself in front of Lord Martok's estate, is told to leave the city. Currently orders are to arrest him on sight.
*[[Magdalena]] is kidnapped while chasing after Sugama.
*Magda's family stop guards from arresting Sugama, tell him to go save Magda.
*Everyone meets outside town. [[Anastarius]] appears and gives [[Airhead]] a hawk, which he names Birdbrain.
*Everyone hides inside [[Brad]]'s cart. He sneaks them into town at night to infiltrate Hector & Umberto's estate.
*They find caves underneath the basement, go down, are attacked by wolf-men.

![[Brad]]'s Journal
Confused as ever by this band of oddities I can't but help think that I am getting myself into something that won't be easily solved.  Having to follow other nobles secretly, being caught up in a theft of a painting.  This does not seem like something I want to get involved with… although with Adra I cannot seem to have any sense.  I cannot help but be attracted to her for she looks li… never mind.  Although I've suspected Martok of his wrong doing, I never suspected Hector to be in on anything as hideous as a cult killing those bearing child.  Sugama is an odd one and now his wife has gone missing too?  Things are starting to intertwine too much an I have already half exhausted myself in protecting the group with three people need to kill one of these creatures and myself able to take care of three although I cannot do so constantly.  If only I learned to shoot my crossbow properly, if god could help me become more proficient maybe we can escape this mess we're in.
Air kiln-born characters have the following traits:

*''Living Construct'': Kiln-born are not biological beings, but rather elementals bound to clay skeletons. They are immune to poison, disease, and other afflictions predicated upon a living system. They also do not heal naturally and cannot be healed by healing spells. They can, however, be repaired with repair checks. Each repair check takes 1d6 hours, and on a result of a 1 or lower another wound is inflicted on the kiln-born.
*''Toughness'': -1. An air kiln-born's clay skeleton is brittle and completely unprotected.
*''Pace'': 10. Air kiln-born are exceptionally speedy.
*''Attributes'': d6 agility
Air Kiln-born

*Player: Lee
*Experience: 10 (10 story)
Good dragon known by [[Airhead]]
Young female elf exiled from the [[Shan Tor'athos]].

*Player: Danielle
*Experience: 10 (10 story)
Former guard in [[Shentreau]], fired for drinking on the job, currently working on [[Brad]]'s security staff.
*Player: Dave
*Experience: 6 (4 story + 1 journal + 1 bio)

            Born in Shentreau, Brad is a descendent of one of the founders of the city.  His Father, Stevan was an avid sports man and a traveler of sorts.  He was the younger of two brothers, the older names Stevan Jr.  He also had a younger sister, Marie.  His mother, Susannah died in childbirth from his sister.  Bard was always trying to out prove his older brother even before he knew of things about inheritance.  While his Brother followed more closely in his father's foot steps of being more physical, Brad decided to try to impress his father with learning magic.

            When Brad was 12 he was traveling to another city for diplomatic purposes with his father, brother and sister planning to have a vacation afterwards in the country.  Although coming back from the vacation his caravan of travelers was attacked by the Shan Tor'athos for traveling on a pathway near the forests.  His father and brother killed by the elves his was saved by a female elf who implored that his was too young to be a threat.  After the attack he looked for his sister and she couldn't be found.  Walking back to Shentreau he almost died from dehydration and was saved by a peasant caravan which dropped him off at Shentreau.  Being the only heir to his father's position Brad had his father's associates take care of Brad's assets until he was of age, which took him from one of the higher nobles in the city to a lesser noble, sowing mistrust in Brad towards other nobles in the city. 

            Of age and in his mid-twenties his self proclaimed mission of trying to help those in need has allowed him to have investment in the lower parts of the city helping finance the creation of inns and shops that otherwise wouldn't have been able to open.  Although doing so has not proven too profitable he is well known in the poorest parts of town, he is slightly looked down upon by other nobles. 

            Although Competitive in nature Brad is a gentleman at heart always tries to do what is right, as long as it is legal although has been known to look the other way if others break the law if it is for the greater good.  His need to travel is something that has been hindered from the attack on his caravan, but feels that the city has been becoming too corrupt as of late and wouldn't turn down the chance for an adventure if given the chance.  Although not much of a fighter Brad is an avid magic user and at times will exhaust himself to protect those in need of assistance.  

| Name|CloseOnCancelPlugin|
| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source||
| Author|Simon Baird <>|
| License||

	handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,

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


config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
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 


Small mountain range near [[Jub Jub Lake]]
Dryad characters have the following traits:

*''Outsider'': Even more so than the warforged or the kiln-born, dryads are an alien race which is difficult for many to empathize with.
*''Photosynthesis'': Dryads do not need to eat or drink, but they do require regular sunlight or they begin to suffer effects similar to starvation.
*''Tree camouflage'': A dryad can take the form of any tree indigenous to the local area.
*''Skills'': d6 in Survival

Dwarf characters have the following traits:

*''Low-light Vision'': Dwarves suffer no penalties on attacks in dark and dim lighting.
*''Pace'': 5.
*''Attributes'': d6 vigor

Earth kiln-born characters have the following stats:

*''Living Construct'': Kiln-born are not biological beings, but rather elementals bound to clay skeletons. They are immune to poison, disease, and other afflictions predicated upon a living system. They also do not heal naturally and cannot be healed by healing spells. They can, however, be repaired with repair checks. Each repair check takes 1d6 hours, and on a result of a 1 or lower another wound is inflicted on the kiln-born.
*''Armor'': +2. An earth kiln-borns tough, rocky body makes it difficult to damage.
*''Pace'': 4
*''Attributes'': d6 strength
*''Parry'': -1. Earth kiln-born are slow and awkward.
*''Rocky Fists'': The kiln-borns fists are practically clubs unto themselves and deal str+d4 damage.
Elf characters have the following traits:

*''Low-light Vision'': Elves suffer no penalties on attacks in dark and dim lighting.
*''All Thumbs'': Elves eschew technology and start with the All Thumbs hindrance.
*''Attributes'': d6 vigor

| Name:|ExtentTagButtonPlugin|
| Description:|Adds a New tiddler button in the tag drop down|
| Version:|3.2 ($Rev: 2406 $)|
| Date:|$Date: 2007-08-08 22:50:23 +1000 (Wed, 08 Aug 2007) $|
| Source:||
| Author:|Simon Baird <>|
| License||

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// 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;

Fire kiln-born characters have the following stats:

*''Living Construct'': Kiln-born are not biological beings, but rather elementals bound to clay skeletons. They are immune to poison, disease, and other afflictions predicated upon a living system. They also do not heal naturally and cannot be healed by healing spells. They can, however, be repaired with repair checks. Each repair check takes 1d6 hours, and on a result of a 1 or lower another wound is inflicted on the kiln-born.
*''Toughness'': -1. A fire kiln-born's clay skeleton is brittle and the flames do nothing to shield it.
*''Skills'': d6 intimidation
*''Pace'': 8
*''Immolate'': As a free action, the kiln-born may wreath its fists, melee weapon, or thrown weapon in flames, adding 2 fire damage to it.
*''Immunity to Fire'': Does not take any damage from any kind of fire, magical or mundane.
*''Vulnerable to Water'': Whenever the kiln-born comes in contact with water, it must make a vigor roll or be shaken. If partially submersed, the vigor roll is at -2, and if fully submersed at -4. This roll must be repeated each round, and can lead to lethal damage if the kiln-born is already shaken.

Here are some of the gods of this world:

!Good deities
*''Anubis'': Jackal-headed dwarf, god of the dead, worshipped by the [[Kamit]].
*''Bahamut'': The ~Ur-Dragon, the Platinum Dragon.
*''Canis'': God of hounds.
*''[[Fujikaya|Mount Fujikaya]]'': Both the mountain in which the [[Kayama]] live, and their primary god.
*The [[matiks|Matikoi]] have a large pantheon. Their primary god is Apeiron. See their entry for more.
*''Primus'': One of the first warforged, became a god.
*''Sobek'': A crocodile-headed dwarf, primary god of the [[Kamit]].

!Evil deities
*''Tiamat'': The Chromatic Dragon, queen of all evil dragons.
*''Unicron'': Being of pure chaos from beyond the edge of the universe; seeks to devour the world.
Daughter of a noble in [[Shentreau]], ran away because she was pregnant and feared that her father would have her lover killed. Currently residing in [[Quaintsbrook]].

| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source||
| Author|Simon Baird <>|
| License||
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>}}}

window.removeElementWhen = function(test,place) {
	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);



Female-personality warforged who claims to work for someone who's trying to build a warforged nation. Trying to recruit [[Judgment]] to their cause.
Reporter for The Shentreau Herald
Small fishing village renowned for its succulent golden fish; located on [[Jub Jub Lake]] next to the [[Dread Mountains]]
Lake next to the [[Dread Mountains]]. Legends say long ago a great golden bird with a hoard like a dragon's was swallowed by a black leviathan. The leviathan ate the bird's hoard as well and has been passing it into the lake, which is why the fish of the lake are golden.
Tuslar was a powerful and intelligent wizard he specialized in golem craft. One day he came across a wonderful treasure: a perfectly preserved warforged void of all life and magic. He took it to his lab and studied it for many decades finally being able to produce one of the first of the second generation of warforged. He was the first artificer of the land and he kept his secret jealously to himself. However his apprentice, the greedy git, was looking for fortune and fame. So he took his master’s secret and spread it across the land for a price. This new technology brought him much power and made him rich as a king. The master, in a livid rage sent his most recent experiment: an assassin warforged, to kill his former apprentice. The experiment, at the time known only as Two, carried out his mission but for some reason he felt guilt and pain for doing the deed. Knowing full well that his master would continue to create more of his kind and torture them by commanding them to commit such terrible acts, he decided to kill his master. The attempt was a failure, the master’s first warforged, named One, was far too powerful and Two was forced to retreat. Two decided that he needed a new name, one that followed his cause: Judgement.
Seeking more power to defeat his master he traveled to a nearby city where he heard of a terrible necromancer who was an excellent artificer. Knowing that the evil of the necromancer needed to be stopped he traveled to his castle and snuck in, but it was a trap. Judgement was trapped by the necromancer. The necromancer used powerful magic seals to subdue Judgment. The necromancer knew the abilities of the warforged but was wary to let him out of his sight. He used him as a personal bodyguard. This lasted many years until word of a strange and powerful warforged reached the receivers of one of the drones, the latest creation from Tuslar, who reported directly to its master. The master sent several warforged to destroy the warforged, and if possible the necromancer as well.
The fight was intense, after disabling two of the 7 warforged Judgment was restrained, the necromancer retreated and sent his zombies after the warforged to retrieve his “pet.” The warforged were all destroyed under the mass of zombies but Judgement was gone by then.
He traveled as far from his “masters” as he could. He ended up in a small village on the outskirts of a much larger city helping police the rural area against bandits and other scum. The city however a certain faction in the city didn’t enjoy his meddling and repeatedly hounded him to leave. Refusing to leave a village in need of protection Judgment kept up the patrolling. Then one day he was ambushed and captured. The faction, known as the Hand of Man, kept all non-human races out of the city or in their private prisons. They are a xenophobic group well known for their extreme methods.
In the prison I was celled with a somewhat somber Kilt-born. His actions always cautious much like me however his name was always a source of humor and ridicule. In an adjoining cell we found a rowdy dwarf far too strong for his size and about thrice as loud as any one twice his size. He was kept in a cell with a young elf with a strange smile and a past shrouded in secret. The lock was easy enough to pick, not that it was needed the doors looked like they would fall off the hinges. The gaurds were asleep thinking little of our abilities to escape. The other cells were unoccupied except for a rather large and angry looking ogre, well sedated with ale. The escape was easy enough, until the bloody dwarf decided to steal his swords back from a sleeping guard. There were about 20 of them all too scared to be real soldiers. The dwarf nearly cut one of them in half and the rest scattered. Once that was clear we made a quick retreat. If only I had known then that the elf would take something they wanted bad badly enough to send real mercenaries after us.

*Player: Alex
*Experience: 13 (10 story + 2 journal + 1 bio)

Seedy figure, tried to blackmail Arda, killed by [[Indigo]] when she caught him following Judgment & co.
An elven woman, about 30 years old, who fancies herself a fashion designer. She currently sells dresses in Artist's Alley in [[Shentreau]].

| Name|LessBackupsPlugin|
| Description|Intelligently limit the number of backup files you create|
| Version|3.0 ($Rev: 2320 $)|
| Date|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
| Source||
| Author|Simon Baird|
| Email||
| License||
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 code by by Saq Imtiaz.
window.getSpecialBackupPath = function(backupPath) {

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

	// comment out the ones you don't want
	var 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).

	var now = new Date();

	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 {"UniversalXPConnect");
				var file = Components.classes[";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 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_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_orig(localPath));

|''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| ]]|
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: ""};

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);
One of the most influential art critics of [[Shentreau]].
Very important figure in the politics of [[Shentreau]], has alleged links to [[The Chosen]].
Magdalena Blank (formerly Baiten) is the daughter of the proprietor of the Bait & Tackle inn, and a wench there. She was impregnated by [[Sugama]] and is now married to him.

Matikoi is a numerically-obsessed religion. Its adherents are known as great logicians and advisers, as they spend much of their time in introspection and working out proofs of various mathematical theories and constructing persuasive arguments based on the proofs.

The Matiks, as they are known, worship irrational numbers as gods, believing that the fact that such a number can not be written down explicitly is proof that they are divine entities unable to fit in the mortal realm. Their primary god, Apeiron, is the number pi, the ratio between a circle’s circumfrence and its diameter. They also worship the square roots of prime numbers and other irrationals.

Some of their most popular gods include:

''Apeiron'' (pi), the Overgod, the Champion of Logic. All Matiks worship Apeiron, though some more so than others. In particular, Matik priests and scholars are most likely to be devoted primarily to Apeiron. Apeiron is ever present and represents the many cycles of life, such as the seasons and of life and death.
Portfolio: death, knowledge, life, logic, mathematics, weather

''Shivani'' (√2), the Nurturer, the Lover. Shivani is largely worshipped by those Matiks wishing to have children, by farmers, but most Matiks pay her at least some respect on a regular basis.
Portfolio: earth, fertility, love

''Theoris'' (√3), the Innocent, the Jubilant, the Trickster. Theoris is usually represented as a child, a care-free god capricious as the zephyrs which are his domain. Matiks devoted to Theoris are usually entertainers of some variety, and Matiks beseech Theoris for his favor at celebrations and holidays. Theoris is also known to play tricks which, while being innocent in intention, often turn out to have bad results for those involved.
Portfolio: alcohol, celebration, humor, pranks

''Abdalla'' (√5), the Quester, the Seeker, the Traveler. Few worship Abdalla in general, and those that do include adventurers, missionaries and sailors. More often, those about to take a long journey, particularly at sea, or undertake some difficult or dangerous task seek Abdalla’s guidance.
Portfolio: luck, travel, water

''Serapsis'' (√7), the Ender, the Destroyer, the Judge.
Serapsis is as close to a “devil” figure as the Matiks get; he is not truly feared in the traditional sense, but is seen as a stern, harsh and impartial judge.
Portfolio: harvest, fire, law, punishment

This is but a small sampling of their gods. There are quite literally an infinite number of them, and the Matiks are always seeking out new ones. Discovery of a new irrational number is a cause of joy and celebration among the religion.

[[MonkeyPirateTiddlyWiki|]] is a distribution of [[TiddlyWiki|]] created by Simon Baird. See [[the web site|]] for more information.
!!Upgrading ~MonkeyPirateTiddlyWiki
This "empty" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:
* Click ImportTiddlers
* Click "Choose..." and select "~MptwUpgradeURL"
* Click "open"
* Click the checkbox in the first column heading to select all tiddlers
* Click "More actions..." and select "Import these tiddlers"
* Click "OK" to confirm you want to overwrite the tiddlers
* Save and reload
Mountain where the [[Kayama]] live.

| Name|MptwLayoutPlugin|
| Description|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|
| Version|3.0 ($Rev: 2721 $)|
| Source||
| Author|Simon Baird <>|
| License||
Presumes you have TagglyTaggingPlugin installed. To enable this you should have a PageTemplate containing {{{[[MptwPageTemplate]]}}} and similar for ViewTemplate and EditTemplate.
// used in MptwViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

config.shadowTiddlers.GettingStarted += "\n\nSee also MonkeyPirateTiddlyWiki.";

	MptwEditTemplate: "Contains the default MPTW EditTemplate. If you want to customise this rename it to EditTemplate",
	MptwViewTemplate: "Contains the default MPTW ViewTemplate. If you want to customise this rename it to ViewTemplate",
	MptwPageTemplate: "Contains the default MPTW PageTemplate. If you want to customise this rename it to PageTemplate",
	MptwStyleSheet:   "Contains the default MPTW ~StyleSheet. Designed to be included in StyleSheet tiddler using the double square bracketted notation like this: {{{[[MptwStyleSheet]]}}}"



 "<!--- ($Rev: 2720 $) --->",
 "<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 macro=\"showWhenExists EditPanelTemplate\">[[EditPanelTemplate]]</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>",

 "<!-- ($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>",
 "	<div class='headerForeground'>",
 "		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",
 "		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",
 "	</div>",
 "<!-- 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>",

 "/* ($Rev: 2720 $) */",
 "/* 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;",
 "	font-weight:bold;",
 ".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;",
 "	background-color:[[ColorPalette::TertiaryPale]];",
 "/* sexy tiddler titles */",
 ".title {",
 "	font-size: 250%;",
 "	color: [[ColorPalette::PrimaryLight]];",
 "	font-family: 'Trebuchet MS' sans-serif;",
 "/* more subtle tiddler subtitle */",
 ".subtitle {",
 "	padding:0px;",
 "	margin:0px;",
 "	padding-left:0.5em;",
 "	font-size: 90%;",
 "	color: [[ColorPalette::TertiaryMid]];",
 ".subtitle .tiddlyLink {",
 "	color: [[ColorPalette::TertiaryMid]];",
 "/* a little bit of extra whitespace */",
 ".viewer {",
 "	padding-bottom:3px;",
 "/* don't want any background color for headings */",
 "h1,h2,h3,h4,h5,h6 {",
 "	background: [[ColorPalette::Background]];",
 "	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 {",
 "	display:none;",
 "/* undo the above in OptionsPanel */",
 "#sidebarOptions .sliderPanel br {",
 "	display:inline;",
 "/* horizontal main menu stuff */",
 "#displayArea {",
 "	margin: 1em 15.7em 0em 1em; /* use the freed up space */",
 "#topMenu br {",
 "	display: none;",
 "#topMenu {",
 "	background: [[ColorPalette::PrimaryMid]];",
 "	color:[[ColorPalette::PrimaryPale]];",
 "#topMenu {",
 "	padding:2px;",
 "#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 {",
 "	visibility:hidden;",
 ".selected .toolbar {",
 "	visibility:visible;",
 "/* 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; }",
 "/* thanks sb56637. and FND */",
 ".popup li .tagger a {",
 "   display:inline;",
 "/* 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;",
 "	}",

 "<!--- ($Rev: 2247 $) --->",
 "<div class='toolbar'>",
 "	<span macro=\"showWhenTagged systemConfig\">",
 "		<span macro=\"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\"></span>",
 "	</span>",
 "	<span macro=\"showWhenTagged palette\">",
 "		<span macro=\"setPalette\"></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>",
 "<div class=\"tagglyTagged\" macro=\"tags\"></div>",
 "<div class='titleContainer'>",
 "	<span class='title' macro='view title'></span>",
 "	<span macro=\"miniTag\"></span>",
 "<div class='subtitle'>",
 "	<span macro='view modifier link'></span>,",
 "	<span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:\"MM/0DD/YY\"}}'></span>",
 "	(<span macro='message views.wikified.createdPrompt'></span>",
 "	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:\"MM/0DD/YY\"}}'></span>)",
 "<div macro=\"showWhenExists ViewPanelTemplate\">[[ViewPanelTemplate]]</div>",
 "<div macro=\"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\">",
 "	<div class='viewer' macro='view text wikified'></div>",
 "<div macro=\"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\">",
 "	<div class='viewer'><pre macro='view text'></pre></div>",
 "<div macro=\"showWhenExists ViewDashboardTemplate\">[[ViewDashboardTemplate]]</div>",
 "<div class=\"tagglyTagging\" macro=\"tagglyTagging\"></div>",

For upgrading directly from tiddlyspot. See [[ImportTiddlers]].
URL: /proxy/
For upgrading. See [[ImportTiddlers]].

| Name:|NewHerePlugin|
| Description:|Creates the new here and new journal macros|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source:||
| Author:|Simon Baird <>|
| License||
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);

| Name:|NewMeansNewPlugin|
| Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
| Version:|1.0 ($Rev: 2263 $)|
| Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
| Source:||
| Author:|Simon Baird <>|
| License||

String.prototype.getNextFreeName = function() {
       var 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.getName = function(newName) {
       while (store.getTiddler(newName))
               newName = newName.getNextFreeName();
       return newName;

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

	title = config.macros.newTiddler.getName(title); // <--- only changed bit

	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");
	var tiddlerElem = document.getElementById(story.idPrefix + 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;

In the far realms beyond the stars, there exists an entity of entropy and decay. Ever-hungering, the thing known as Unicron devours entire planes of reality. Luckily for most, even its awesome power is unable to cross the expanses that seperate the worlds of logic and causality from its realm of madness and impossibility. Unable without help, that is…

When its terrible hunger wells up, Unicron reaches out to the worlds of the mortals. It cannot go there directly, but it can play in the dreaming minds of the insane. There it delivers unto them terrible inspirations to create a type of artificial life, a being known as a starforged. The starforged, in turn, act as agents of Unicron and work in secret to summon him, to feed upon the world.

It so happens that on this world, there was a man the legends call Shaynis. Shaynis was an artificer of the greatest caliber, and none since have ever matched his ability. None could have suspected, though, that Shaynis got his inspiration from his dreams, from Unicron.

Shaynis was no fool, however, and saw Unicron’s plan. He used the knowledge that had been gifted upon him to create another line of beings, like the starforged, but in these he imbued the eternal light of goodness. He dubbed them the lifeforged, and set them to their task of preventing Unicron’s summoning.

The first and greatest of the lifeforged was known as Primus, and he lead the rest in battle against their kin. Collectively, the lifeforged and chaosforged were known as warforged, for they were forever fated to be locked in bitter war with one another. The lifeforged fought a losing battle, though, and were forced to the edge of extinction.

As the starforged prepared to summon Unicron, Primus rallied the few remaining lifeforged to stage a final, desperate attack. All seemed lost, but things are not always as they seem.

The great dragon god Bahamut had been following the plight of the lifeforged, and saw that they were a noble people fighting a selfless fight. In the darkest hour, when only Primus remained, Bahamut intervened. He transferred a bit of his divine essence into Primus, elevating Primus to the status of a god.

Even so, the battle was hard-fought, for Unicron had already begun to enter our world. Primus only barely managed to banish Unicron back to its foul home, and used the remaining bit of his power to destroy the spark of life animating the starforged. Spent, Primus faded away from the realm of mortals, to the realm of the gods.

In time, new artificers would find the inert warforged, star- and lifeforged alike, and learned to create new ones. Most of these new warforged worship Primus, but a few have rediscovered and reclaimed the banner of Unicron, which they believe to be their true father.

The mantles of starforged and lifeforged are a thing of the past, though, for modern warforged are all physically the same. Some choose to go by the old names, but most don’t even know of the names, never mind their significance.

Legend has it that hundreds of years ago, the town of Quainsbrook was besieged by kobolds. They were only saved when Canis, the lord of hounds, sent a pack of fifty wild hounds to help defend them. The villagers of Quainsbrook, to this day, have an amazing rapport with canines of all types, and Quainsbrook hounds are world-renowned as the finest hounds money can buy.

Every spring, Quainsbrook throws a celebration known as The Festival of the ~Half-Hundred Hounds. It is a three day-long festival filled with song, merriment and feasting, where dogs are the guests of honor. Each night is capped off with a simple competition called The Feat of Strength.

In the Feat of Strength, teams of up to five people take turns playing tug of war with the strongest fifty hounds Quainsbrook has to offer. At first they are pulling against 25 hounds, but every 10 seconds another hound is added until all fifty are pulling, or until the the challengers are defeated.

The only way to actually win the tug of war is to pull a flag, located halfway between the dogs and the challengers, across a line on the ground while all 50 dogs are pulling, and hold it there for one full minute. Nobody’s ever actually won the Feat of Strength, though, for no one has ever lasted long enough to be playing against all fifty dogs.

In the end, the dogs are always crowned the victors of the night, but as a consolation prize the team which pulled against the most dogs before being defeated is given a Quainsbrook hound.
| Name|QuickOpenTagPlugin|
| Description|Changes tag links to make it easier to open tags as tiddlers|
| Version|3.0.1 ($Rev: 2342 $)|
| Date|$Date: 2007-07-05 10:57:49 +1000 (Thu, 05 Jul 2007) $|
| Source||
| Author|Simon Baird <>|
| License||
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 to <<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;



| Name:|RenameTagsPlugin|
| Description:|Allows you to easily rename or delete tags across multiple tiddlers|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source:||
| Author:|Simon Baird <>|
| License||
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++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {
			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);

		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() {



| Name|SaveCloseTiddlerPlugin|
| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
| Version|3.0 ($Rev: 2134 $)|
| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|
| Source||
| Author|Simon Baird <>|
| License||
To use these you must add them to the tool bar in your EditTemplate

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(e,src,title) {
			return false;

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(e,src,title) {
			return false;



*"The Center of All Culture"
*Art auction held each month
**The Bait & Tackle
*Notable areas:
**Artist's Alley: District where unknown artists set up shop, hoping to be noticed and picked up by the auction
You're all just my lab rats
Asmor's Savage 4th Edition Dry Run
Being an arrogant loud-mouthed dwarf that he is, he did not have many friends when he was younger. During his younger years Sagama picked fights ,for no reason, with anyone he found annoying, tough, and smart-mouthed. As he grew up he acquired a few friends and even though they liked him, they found him kind of embarrassing and not trust worthy due to his inability to keep secrets with his loud mouth. Later on after his studies as a Ronin warrior, he went towards his acceptance towards the Defensive militia during which he almost chopped the head off the elite commander, Kamegawua, after an arrogant act of picking a fight with Kamegawua. Sagama's foolish and arrogant act left his family's honer in shame and so, he decides to leave and exile himself from his home to keep his family's name in honor. After weeks wandering the unknown forests of the outside world Sagama realizes that he is lost and starts searching for a town or village where he could get directions. After days of searching, He stumbles upon, Arda, a young female elf that was just exiled from the [[Shan Tor'athos]] which then helps him get out of the situation of being lost due to her great survival skills. Moments after finding a main path road they get ambushed and taken hostage by the human people who hate everything but humans who also call them selfs, The Chosen. While being enslaved there, Sagama gets released by two none-organic creatures; an Air [[Kiln-born]] called Airhead, and a Modified [[warforged]] called Judgment. After escaping Sagama, Airhead, Judgment, and Arda all decide to stay together and help each other from being captured. And thats when their big story begins.

*Player: Mike
*Experience: 14 (10 story + 3 journal + 1 bio)
<<allTags excludeLists>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
| Name|TagglyTaggingPlugin|
| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
| Version|3.1 ($Rev: 2351 $)|
| Date|$Date: 2007-07-12 10:18:02 +1000 (Thu, 12 Jul 2007) $|
| Source||
| Author|Simon Baird <>|
| License||
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':",
			excerpts:   "excerpts",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only"

		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",
			contents: "Click to show entire tiddler contents",
			sliders:  "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"

	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","contents","sliders"]
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/"

	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) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);
		// if value is default then remove it to save space
		return store.setValue(title,
			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);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		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) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title); break;
			case "normal": return this.createTagglyListNormal(place,title,false); break;
			case "commas": return this.createTagglyListNormal(place,title,true); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title); break;

	getTaggingCount: function(title) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = store.getTaggedTiddlers(title).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		return "";

	getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
			indent = 1;
		if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {
			var t = store.getTiddler(title);
			if (t) {
				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 (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {
			var t = store.getTiddler(title);
			if (t) {
				return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {
			var t = store.getTiddler(title);
			if (t) {
				return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		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) {

		var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));

		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) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = store.getTaggedTiddlers(title,sortBy);

		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) {

		var list = store.getTaggedTiddlers(title,sortBy);
		if (sortOrder == "desc")

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

		var childOutput = "";
		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);

		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) {
		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"));
		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 refreshContainer = createTiddlyElement(place,"div");
				// do some refresh magic to make it keep the list fresh - thanks Saq

			refresh: function(place) {
				var title = place.getAttribute("title");
				if (store.getTaggedTiddlers(title).length > 0) {
					var lingo = config.taggly.lingo;
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {

	// 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]]; }",
"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; }",

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



By Saq Imtiaz

// syntax adjusted to not clash with NestedSlidersPlugin

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[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel"); = "none";
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling; = ("none") ? "block" : "none";
		return false;

The Chosen are an organization dedicated to the supremacy of humans over all other races. They seek the eradication or enslavement of elves, dwarves, and all others.
In the beginning, there was harmony, and then chaos broke that harmony and the world was born. So teach the disciples of the Dissonant Chorus, a religion devoted to The Voice of Creation.

Those devoted to the Dissonant Chorus come from all walks of life, but it is especially popular amongst the poor, the wretched and the hopeless. They believe that life is naught but misery, and the end of life is something to look forward to.

To them the afterlife is a glorious song your soul joins after shucking its mortal shell. However, one must be ready to join the song when they die; otherwise, they will be cast out and given a new, chaotic, miserable life. As such, adherents spend their lives learning to be in tune with The Voice.

The churches of the Dissonant Chorus are defined by a large, spacious hall designed with acoustics in mind. The overall shape is not entirely dissimilar from a massive flute, and when an entire congregation sings together it can often be heard for miles around.

They frown on instruments, believing such implements to be crutches for a weak soul. The only instrument a chorus-member needs is their voice.

They sing hymns without lyrics, characterized by long, drawn-out notes and a slow melody. The songs of the Dissonant Chorus are often hauntingly beautiful, and wealthy members of society often leave large donations to the church in return for having a congregation sing at their funerals.

There is a small sect within the Dissonant Chorus known as the Entropic Enclave which takes the teachings of the church a step farther; they seek to reunite the entire world with the Voice of Creation once more. To this end, they seek out an artifact known as the Apocalypse Chime; it is said that the tone of the chime is capable of unmaking reality and purging the chaos from the Voice once and for all.

The Enclave is fairly obscure and completely unknown to the general congregation, and even to most of the clergy. It is a shameful secret the heads of the church wish to keep under wraps, while trying to root out and destroy its members.

They do not believe the Apocalypse Chime exists, but if it were ever found it would provide them with a serious dilemma. On the one hand, they truly believe that life is misery and death a blessing; on the other hand, they fear the ramifications of the chime.

Destroying so many who are not yet in tune with the Voice could prove catastrophic, creating even more chaos, dissonance and misery than already exists. Or it’s possible the Chime might drown out the Voice, replacing it with something else, something worse.
| Name|ToggleTagPlugin|
| Description|Makes a checkbox which toggles a tag in a tiddler|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source||
| Author|Simon Baird <>|
| License||
{{{<<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)


|{{{<<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

!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing



	toggleTag: {

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

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
			var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			label = (label == '-' ? '' : label);
			var theTiddler =  title == tiddler.title ? 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;
				return true;

Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed

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

// 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)

// 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+'';
	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

 "This document is a ~TiddlyWiki from  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 + "]] (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",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[|]].  Also visit [[TiddlyWiki Guides|]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|]].",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your site.  Please email [[|]] with any comments or suggestions."

 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + " index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + "]], [[download (go offline)|http://" + config.tiddlyspotSiteId + "]]|",
 "| links:|[[|]], [[FAQs|]], [[announcements|]], [[blog|]], email [[support|]] & [[feedback|]], [[donate|]]|"

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

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

| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 04/04/2008 00:29:22 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 04/04/2008 07:23:24 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . | ok |
| 04/04/2008 07:24:04 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 04/04/2008 09:39:30 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 11/04/2008 11:51:55 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 11/04/2008 11:52:49 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 19/04/2008 16:49:25 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . | failed |
| 19/04/2008 16:49:41 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
| 22/04/2008 09:25:40 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . | ok |
| 22/04/2008 09:25:59 | Asmor | [[/|]] | [[store.cgi|]] | . | [[index.html |]] | . |
|''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| ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: '',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|]]',
	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"

|''Description:''|Save to web a TiddlyWiki|
|''Date:''|May 5, 2007|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license| ]]|
|''~CoreVersion:''|2.2.0 (#3125)|
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 0,
	date: new Date("May 5, 2007"),
	source: '',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0 (#3125)'

// 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
		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}
	refreshOptions: function(listWrapper) {
		var uploadOpts = [
		var opts = [];
		for(i=0; i<uploadOpts.length; i++) {
			var opt = {};
			opt.option = "";
			n = uploadOpts[i]; = 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 = 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,null,null,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 = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
	} 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 == httpStatus.NotFound)
		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; 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

/* don't want this for tiddlyspot sites

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



Warforged characters have the following traits:

*''Living Construct'': Warforged are not biological beings, but rather magical constructs. They are immune to poison, disease, and other afflictions predicated upon a living system. They also do not heal naturally and cannot be healed by healing spells. They can, however, be repaired with repair checks. Each repair check takes 1d6 hours, and on a result of a 1 or lower another wound is inflicted on the warforged.
*''Composite Plating'': A warforged is covered in tough plating made of magically-treated woods and metals. Warforged get are always treated as wearing armor with a +1 bonus which covers their entire body. Warforged may never wear armor.
*''Socially Awkward'': Bred as little more than intelligent weaponry, warforged find it difficult to relate with others. They receive the outsider hindrance (-2 charisma).
*''Steel Fists'': Warforged may attack with their fists and deal Strength + 1d4 damage.
*''Tough'': Warforged are extremely resilient and resistant to damage. They start off with a d6 in vigor.
*''Nihilistic Fate'': Warforged are tied to chaos in a manner unlike any other being. Warforged start each session with one fewer bennie. 
Water kiln-born characters have the following traits:

*''Living Construct'': Kiln-born are not biological beings, but rather elementals bound to clay skeletons. They are immune to poison, disease, and other afflictions predicated upon a living system. They also do not heal naturally and cannot be healed by healing spells. They can, however, be repaired with repair checks. Each repair check takes 1d6 hours, and on a result of a 1 or lower another wound is inflicted on the kiln-born.
*''Toughness'': -1. A water kiln-born's clay skeleton is brittle and the water does little to shield it.
*''Parry'': +1. The water forming the kiln-born's body is good, however, for deflecting attacks.
*''Pace'': 8
*''Skills'': d12 swimming
*''Aquatic'': While in the water, a water kiln-born's pace is equal to its swimming skill.