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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Also see [[AdvancedOptions]]
[[So you want your own Soldat Server...]]

[[what we're doing]]

[[download this stuff]]

[[install like this]]

[[run solserver]]

[[testing with Windows]]

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

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

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 return bidix.core.loadRemoteFile(url,callback,params);
[[So you want your own Soldat Server...]]

[[what you're doing|what we're doing]]

1 [[download this stuff]]
& [[install like so|install like this]]

2 [[testing with Windows]]

3 [[opening ports]]

- [[server commands|server commands (Remote Admin.exe)]]
- [[README.txt]]

- [[install linux mint]]
- [[admin remotely|access linux remotely]]

@[B]lamer ..
[[tiddler editting tips|help]]

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

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

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

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

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

// need to reload options to load passwordOptions

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

		pasPassword: "Test password"
 /** Soldat Dedicated Server README **\
          - Updated 2012-03-22 -
 Before starting your server, you need to configure your settings!
 Please manually edit your soldat.ini and mapslist.txt files
 before starting your server. There are many 3rd party tools
 available to make this an easy task for you.

 The Soldat Dedicated Server is maintained and developed for free 
 by the Soldat Dev Team.

 > Linux: Folder permissions... make the following folders writable with:
  a) chmod -R u+w ./logs/
  b) chmod -R u+w ./anti-cheat/
 ''IMPORTANT: You must have an Admin password in order to control your
  server! To set an Admin password, open soldat.ini [NETWORK] and 
  edit the line that says "Admin_Password=" to "Admin_Password=MYPASS"
  (Replace MYPASS with what you want your Admin password to be!)''

 Linux Note:
  If you run a Soldat Server under linux, you must run soldatserver 
  under a user account that has read access to /etc/resolv.conf
  otherwise the SoldatServer lobby will not function correctly.

 Script Core Notes:
  The Scripting Engine coded into the SoldatServer uses the "Pascal"
  language syntax. You may find full documentation regarding the
  functions and variables/events at the following URL:

  NOTE: Some basic functions will not be documented, such as:
  inttostr, trim, strtoint, etc.

 To control the server while running:
  Use the Soldat Admin program from http://soldat.pl. You can connect
  to your Dedicated Server from the local machine or from a Remote
  location. Soldat Admin is the only way to perform server commands
  while running the server.

  The Soldat Dedicated Server is designed to run on 32-Bit Linux and Windows.
  There is no FreeBSD or 64-Bit versions of the Soldat Dedicated Server.
 How to run the server in the background (Daemonize):
  Linux -
   ./soldatserver -d
   screen -dmS SoldatServer /usr/local/soldat/soldatserver
   nohup ./soldatserver >/dev/null &
  Windows -
   Use a program like TrayIT! or Srvany (get them from http://google.com)
 Startup parameters: (Advanced users!)
 NOTE: Startup parameters will over-rule any values set in soldat.ini or server.ini!
   Usage: ./soldatserver -d
    (LINUX ONLY) Starts your server as a Daemon (Runs in the background, even when you log off)
    Usage: ./soldatserver -pid soldatserver.pid
           Sets the Process ID file name. Located in the /logs/ folder. (soldatserver.pid by default)
    Usage: ./soldatserver -m xx.txt
           Sets the default mapslist file to xx.txt (mapslist.txt by default)
    Usage: ./soldatserver -c xx.ini
           Sets the default configuration file to xx.ini (soldat.ini by default)
    Usage: ./soldatserver -p 23073
           Start the Soldat Server on a specific port.
    Usage: ./soldatserver -l 12
           Limit the number of players that can join the server.
    Usage: ./soldatserver -k "my clan only"
           Sets a password that will be required by anyone who tries to join.
    Usage: ./soldatserver -b ""
           Bind the server to a specific IP Address. USE WITH CAUTION!
           NOTE: You cannot bind to an IP that isnt assigned to your network card!
    Usage: ./soldatserver -a #
           Enable/Disable All-Seeing Eye registration. # -> 1 = enabled, 0 = disabled.
    Usage: ./soldatserver -s #
           Enable/Disable the SoldatServer Scripting Engine. # -> 1 = enabled, 0 = disabled.
    Usage: ./soldatserver -safe #
           Enable/Disable Safe Mode for Scripts (On by default). # -> 1 = enabled, 0 = disabled.
    Usage: ./soldatserver -lock #
           Enable/Disable Locked Mode (Off by default). When Locked Mode is enabled, admins will
           not be able to type /loadcon, /password or /maxplayers.  # -> 1 = enabled, 0 = disabled.
    Usage: ./soldatserver -disallow "GetURL,ReadFile"
           Disable certain script functions from being used by scripts. Note that this will cause
           any scripts that use these functions to crash with an "unknown identifier GetURL" error.
    Usage: ./soldatserver -debug #
           Enable/Disable Debug Mode (See Debug_Mode in soldat.ini).
           # -> 0 = No Debug, 1 = Lobby Debug, 2 = Advanced Debug, 3 = Script Core Debug
           If you find a bug and report it, please use Debug Mode 2. It helps us alot.
    Usage: ./soldatserver -ns
           Set the Nameserver your Soldat Server will use to resolve the Lobby DNS.
           Only use this if you know what you are doing! The server should automatically
           detect what Nameserver your computer uses!
    Usage: ./soldatserver -ls #
           Set the maximum number of scripts which can be loaded by this server.

 ''Still having issues with your Soldat Server?
 You may contact us via IRC on the Quakenet IRC Network.
 #soldat.devs @ irc.quakenet.org''

 Dedicated Server Hosts:
  [eC] USA (Texas)        http://server1.enesce.com/index.php?page=about
  [eC] Europe (Germany)   http://eu1.enesce.com/index.php?page=about
  GameServerNetwork USA   http://www.gameservernetwork.com/
  SelfKill (Germany)      http://server.selfkill.com/
  U13 USA                 http://rentals.u13.net/
a complete Major's guide to starting your own Soldat server
Set up a Soldat server
__Overall steps are__:
0. choose your favourite ''Operating System'' and freshly install ( optional step, recommended )
1. download ''solserver'' software from soldat.pl and install it ( on linux, we hope )
2. //''test''// your new solserver with your Windows soldat.exe
3. open up soldat's ''ports'' from the internet into your new solserver
4. //rejoice & play... !//

//These instructions are showing you how to achieve this setup...//

''Soldat Dedicated Server 1.6.3 (v2.7.3) [[3.73MB|http://soldat.thd.vg/en/download/soldatserver2.7.3_1.6.3.zip]]'' <== //solserver//

''Soldat 1.6.3 Release [[17.1MB|http://soldat.thd.vg/en/download/soldat163.zip]]'' <== //soldat.exe//

   Windows soldat.exe v1.6.3 >>> INTERNET >>> your Linux solserver v2.7.3 ( //or could be Windows but from this point these instructions will assume you want Linux// )


These steps will take care of automatically registering your solserver in the public Lobby ( if you've ticked that flag ON ) so that Windows users can connect and play.

See [[testing with Windows]] later.

''//Minimum requirements//'' ( from soldat [[manual|http://static.soldat.pl/man/manual-en.html#DEDYK]] & forums member [[n00bface|http://forums.soldat.pl/index.php?topic=95.0]] ) :
    - 333mhz processor, 32 MB RAM, Network card or modem
    - free disk space, sound card, etc
    - Microsoft Windows 98/Me/2000/XP or Linux

Other UNIX variants with Linux compatibility (Free BSD) only slightly work

''//Soldat's default Network ports//'' that you'll need to setup forwarding for ( from the internet into your linux solserver ) :
- solserver: 23073 (udp) - by default, later you could choose otherwise
- All Seeing Eye: 27243 (udp / tcp) - optional
- Map downloading: 23083 (tcp) - your solserver's port +10
- soldat.exe: 23083 (udp)

See [[opening ports]] later.

If the above basically makes sense then please continue to read on, I'll walk you through a full install of a linux solserver step-by-step...

NEXT: [[what you're doing|what we're doing]]
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.

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

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

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

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

// create some shadow tiddler content

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

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

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

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

| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 29/04/2013 03:46:49 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | ok |
| 29/04/2013 03:53:01 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | ok |
| 29/04/2013 03:53:59 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | ok |
| 29/04/2013 03:59:45 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | ok |
| 29/04/2013 04:11:33 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | ok |
| 29/04/2013 04:12:55 | Major | [[/|http://soldat.tiddlyspot.com/]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . |
| 04/05/2013 06:56:24 | Major | [[/|http://soldat.tiddlyspot.com/#%5B%5Binstall%20like%20this%5D%5D]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . |
| 04/01/2015 20:22:20 | Major | [[/|http://soldat.tiddlyspot.com/#README.txt]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | failed |
| 04/01/2015 20:23:02 | Major | [[/|http://soldat.tiddlyspot.com/#README.txt]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . | failed |
| 04/01/2015 20:24:18 | Major | [[/|http://soldat.tiddlyspot.com/#README.txt]] | [[store.cgi|http://soldat.tiddlyspot.com/store.cgi]] | . | [[index.html | http://soldat.tiddlyspot.com/index.html]] | . |
|''Description:''|Save to web a TiddlyWiki|
|''Date:''|Feb 24, 2008|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'

// Environment

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

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

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

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

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

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

// uploadOptions Macro

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

// upload functions

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

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

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

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

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

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

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

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

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

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

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

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

// Utilities

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

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

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

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

// Initializations

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

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

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

// Options Initializations

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


[[eiger3970|http://forums.linuxmint.com/memberlist.php?mode=viewprofile&u=91531]] on [[linux mint forums|http://forums.linuxmint.com/viewtopic.php?f=90&t=108169#p609009]] explains how we do this...

Steps for remote desktop access to Linux Mint 13 Maya Mate from Windows:

1. In Maya on install of system, select option: Log in automatically.
2. In Maya, go to Menu/Software Manager/search for vino and install if not installed.
2.1. In Maya to install vino go to Menu/Software Manager/search for vino and double click vino to install.
''3. In Maya'', go to Menu/Search: Desktop Sharing. If Desktop Sharing not there, go to Menu/Terminal: ''vino-preferences''
4. In Maya, in the new Desktop Sharing Preferences window:
4.1. Select Allow other users to view your desktop.
4.2. Deselect You must confirm each access to this machine.
4.3. Select Require the user to enter this password.
4.4. Select Automatically configure UPNP router to open and forward ports.
4.5. Close.
''5. In Maya'', go to Menu/Terminal: ''/usr/lib/vino/vino-server - -sm-disable'' to start the vino server.
(Terminal is finished when you see: Trying to remove a child that doesn't believe we're its parent. Trying to remove a child that doesn't believe we're its parent.).
6. In Maya, go to Menu/Applications/Preferences/Startup Applications/Add.
Name: vino server startup;
Command: /usr/lib/vino/vino-server - -sm-disable.
7. In Maya, close the Terminal.
8. In Maya, go to Menu/Terminal: ifconfig. View the eth0 inet addr which will be xxx.xxx.x.xxx (Maya's IP address).
9. In Maya, go to Menu/Quit/Restart.
''10. In Windows'', download Tight VNC from //''http://www.tightvnc.com/download.php/ ''// to your Windows PC and install.
11. In Windows, go to Start\All Programs\Tight VNC\Tight VNC Viewer. Enter Remote Host: xxx.xxx.x.xxx (Maya's IP address) and Connect.
12. In Windows, in the new Authentication window, enter the Password and select OK.

Alternatively, you'll mostly only ever need to play directly with these 2 super thin remotes:
* an SSH terminal client like [[PuTTY|http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe]] (0.5Mb) <== to run your /solserver/sldatserver, for example
* an X Windows client like [[Xming|http://sourceforge.net/projects/xming/files/latest/download]] (2Mb) <== to start a remote Soldat Admin.exe (linux can execute it if you install [[wine|http://forums.linuxmint.com/viewtopic.php?f=47&t=103612]]) sudo apt-get install wine

In full, your Soldat Admin.exe utility can be installed over on remote your Linux box like...

cd /
mkdir /soladmin/
cd soladmin
sudo wget http://static.soldat.pl/downloads/soldatadmin12.zip
sudo unzip soldatadmin12.zip
sudo chmod a+x Soldat Admin.exe
sudo chmod 666 admin.ini

sudo apt-get install wine

/soladmin/Soldat Admin.exe

NEXT: [[install like this]]
Send us feedback anonymously at [[formspring.me|http://www.formspring.me/dissmini]] or include your email address if you'd like a reply.
STEP 1 of 3 - Downloading the software

1. the latest ''Soldat server'' from [[soldat.pl|http://soldat.thd.vg/en/downloads/]] (17Mb) <== //solserver// package contains both versions ( linux and Windows )

If you're running a lite ubuntu like below [[we recommend |install linux mint]] (Linux Mint 13) then later you'll just punch in this //get// command,

wget http://soldat.thd.vg/en/download/soldatserver2.7.3_1.6.3.zip

2. ''Soldat [[Remote Admin|http://static.soldat.pl/downloads/soldatadmin12.zip]] '' (0.3Mb) <== //Soldat Admin.exe// is for changing game parameters without restarting

wget http://static.soldat.pl/downloads/soldatadmin12.zip

NEXT:  [[install like this]]

__OPTIONAL ''1st'' STEP__ - freshly install a linux OS
3. a bit torrent client for Windows like [[µTorrent|http://www.utorrent.com/]] (1Mb)
4. a linux ISO like [[Mint Linux 14 with Xfce (32-bit)|http://torrents.linuxmint.com/torrents/linuxmint-14-xfce-dvd-32bit.iso.torrent]] (800Mb) <== //for a fresh OS install, download could take ~45mins//
5. an ISO disk imager like [[Win32 Disk Imager v0.7|http://sourceforge.net/projects/win32diskimager/files/latest/download]] (5Mb)

Note... //32-bit ISO's of Linux Mint 14 use a PAE kernel. If your processor (cpu) is not compatible with PAE - -or if you're unsure- - please use [[Linux Mint 13 Maya LTS|http://torrents.linuxmint.com/torrents/linuxmint-13-xfce-dvd-32bit.iso.torrent]] instead. Linux Mint 13 is supported until 2017.//

See [[install linux mint]]

__OPTIONAL ''FINAL'' STEP__ - fully remote control your linux Soldat server from your Windows pc
6. an SSH terminal client like [[PuTTY|http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe]] (0.5Mb)
7. an X Windows client like [[Xming|http://sourceforge.net/projects/xming/files/latest/download]] (2Mb)
8. a full Linux remote desktop client like [[TightVNC|http://www.tightvnc.com/download/2.7.1/tightvnc-2.7.1-setup-32bit.msi]] (2Mb)

See [[access linux remotely]] later.

NEXT: [[install like this]]
1. Login by clicking '''options''' from the menu on the far right.

2. Enter your alias [[here|GettingStarted]] so we can work out who has changed what

3. Save your changes by clicking '''save to web'''. Top right under 'search'. Not 'save changes'.

GettingStarted : 
* MainMenu, DefaultTiddlers, SiteTitle, SiteSubtitle
| !To Produce | !Markup<script label="(memorize)">return Mem.start(place)</script> |
|bgcolor:#ccc; ''Bold'' |bgcolor:#ccc; {{{''Bold''  (double single quotes)}}} |
|bgcolor:#eaeaea; ==Strikethrough== |bgcolor:#eaeaea; {{{==Depreciated==}}} |
|bgcolor:#ccc; --Strikethrough-- |bgcolor:#ccc; {{{--Strikethrough-- (double hyphen) }}} |
|bgcolor:#eaeaea; __Underline__ |bgcolor:#eaeaea; {{{__Underline__ (double shift-hyphen)}}}  |
|bgcolor:#ccc; //Italic// |bgcolor:#ccc; {{{//Italic// (double forward stroke)}}} |
|bgcolor:#eaeaea; Superscript: 12^^3^^=1728 |bgcolor:#eaeaea; {{{12^^3^^=1728 (double caret)}}} |
|bgcolor:#ccc; Subscript: <html><span title="Formula for Nitroglycerin" style="cursor:pointer>C~~3~~H~~5~~N~~3~~O~~9~~</span></html> |bgcolor:#ccc; {{{C~~3~~H~~5~~N~~3~~O~~9~~ (double tilde)}}} |
}}} [ source :  http://twhelp.tiddlyspot.com/#FormattingText ]

Images:             [img[Gmail Logo|http://sites.google.com/site/timesealsalltombs/config/pagetemplates/home_v1/gmail-mini-logo.png]]
STEP 1b of 3 - Software Installs

1. [[mar77a|http://forums.soldat.pl/index.php?action=profile;u=146]] is explaining on the [[soldat forums|http://forums.soldat.pl/index.php?topic=11414.0]] how to do this with an old solserver version (v2.6.5, //which you could roll up to v2.7.0 if you understand this [[symbolic link libz.so.1 bug|http://forums.soldat.pl/index.php?topic=34467.0]]//) otherwise follow me...

* make a folder for it
cd /
sudo mkdir solserver
cd solserver

* ''download'' it
sudo wget http://static.soldat.pl/downloads/soldatserver2.7.3_1.6.3.zip

* check it arrived
ls -l

* ''unzip'' it
sudo unzip soldatserver2.7.3_1.6.3.zip

* check it unzipped
ls -l

* populate your ''mapslist.txt'' ( let's shuffle the map order too )
sudo touch /solserver/mapslist.txt
sudo chmod a+w /solserver/mapslist.txt
sudo ls -1 /solserver/maps/ | grep PMS$ | sed s/\.PMS// | //shuf > /solserver/mapslist.txt

* check that file lists map names now
cat /solserver/mapslist.txt

* ''change permissions'' for the solserver executable (needs 'x') & its logs directory (needs 'w')
sudo chmod +x soldatserver
sudo chmod -R 0777 logs
sudo chmod -R u+w ./logs/
sudo chmod -R u+w ./anti-cheat/
sudo chmod 666 banned*.txt

2. Okay, you're nearly ready to start gaming. Take a break. Have some fresh air. Then come back and read this...

* follow all instructions in the ''read-me file'', [[README.txt]]
more README.txt

It tells you at least 2 ''__critically important__'' things:

// IMPORTANT: You must have an Admin password in order to control your
  server! To set an Admin password, open ''soldat.ini'' [NETWORK] and 
  edit the line that says "''Admin_Password=''" to "Admin_Password=MYPASS"
  (Replace MYPASS with what you want your Admin password to be!)//


//Still having ''issues with your Soldat Server?''
 You may contact us via IRC on the Quakenet IRC Network.
 #soldat.devs @ irc.quakenet.org//

3. ''//Linux Mint 13+//'' won't give you an /etc/resolv.conf file, so you'll need to do [[this|http://forum.linuxmint.com/viewtopic.php?f=150&t=106698]] tiny fix, like this:

* check that file is missing
ls -l /etc/resolv.conf

* un this reconfig command and choose Yes, Yes, OK
sudo dpkg-reconfigure resolvconf

* check that file now exists
cat /etc/resolv.conf

4. Now, just as with [[testing with Windows]] you'll want to set edit //soldat.ini// to give your solserver a unique name...
* give all users Write permissions to your soldat.ini
sudo chmod a+w soldat.ini

* modify contents of the file
Menu > Accessories > gedit > File > Open > File System > solserver > soldat.ini

''Server_Name''=Setup your own solserver ..
''Greeting_Message''=a modern guide to starting your own Soldat server, http://soldat.tiddlyspot.com

NEXT: [[run solserver]]
STEP 0 - re-purpose an old pc as a brand new Linux host

1. using your [[imager app|http://sourceforge.net/projects/win32diskimager/files/latest/download]], write that [[downloaded|download this stuff]] Linux ISO to a removable drive you have lying around (this could be a usb stick, if your laptop's BIOS let's you boot from usb) in my case my drive mounted as L:\

As linux mint itself would tell you at 100%...


2. Plug that disk into your laptop (eg, usb) and boot up your lappie from cold. If needed, play with your lappie's BIOS (F10 key) to tell it to boot from that Linux disk first. My 2nd lappie is so old I'm sticking in an IDE drive (6Gb) rather than a usb stick.

If all goes well you're going to see your laptop booting from that fresh Linux drive and (after you hit the Down Arrow twice)  showing you these Linux Mint 13 boot options...

I've chosen to ''Start in Compatibility Mode'', it'll scroll some white text on black background then show simply //Linux Mint 13// with four dots below it ( blinking slowly ).

. . . . 

Finally with luck it will boot all the way into this pretty "Maya" (Xfce) desktop screen...

Now go physically connect up this new Linux lappie to your home network ( hopefully not via wifi like I'm doing in the screenshot above, this is just me experimenting ok )

Aside: Adding lappie to a DMZ is nicer when you get to the [[opening ports]] step. But if you don't understand DMZ's (Demilitarized Zones) then just press on. Your solserver linux box & soldat.exe Windows box can happily live directly side-by-side (ie, inside the same subnet).

See [[access linux remotely]] ( optional )

NEXT: [[install like this]]
STEP 3 of 3 - Giving the public access to your solserver

230__73__' (udp) - Soldat server

27243 (udp / tcp ) - Soldat ASE

230__83__ (tcp) - Soldat maps download

230__83__ (udp) - Soldat client

Point your browser to your router - -it will look something like below screenshot- - and add these 4 port-forwarding rules manually...

[[n00bface|http://forums.soldat.pl/index.php?topic=95.0]] explains how to do that, plus how to find the LAN IP address of //your// router (not necessarily & //your// solserver (almost certainly not :

|bgcolor:#ccc; Known Router Addresses:| , , , ,|
|bgcolor:#ccc; Default Router Passwords:| Admin or [blank; nothing; lack of existence]|
|bgcolor:#ccc; Determining Internal IP:|Win NT, Win XP, Win 2003: Goto Start -> Run... -> enter 'cmd' [press enter] -> type 'ipconfig'. This will display your internal and external IP's. Internal IP's usually take the form of 192.168.x.x|
|bgcolor:#ccc; |Win 95, Win 98, Win ME: Goto Start -> Run... -> enter 'winipcfg'. It's in there somewhere. Internal IP's usually take the form of 192.168.x.x|
|bgcolor:#ccc; Generic Router Setup:|[note: Every router is different. If you are able to setup and run a Soldat Server, you should be able to apply this to your specific router. If you cannot because your router is especially complicated, post your problem and I'll add it to the 'Specific Router or Networking Solutions' section]|
1: Go one of the 'Known Router Addresses'
2: Enter your router password. If you do not know it try one of the 'Default Router Passwords'
3: Find and enter the Port Forwarding page. [note: usually found within the Advanced page or Security page]
4: Enter 'Soldat Client Port' [from above] and select UDP then enter 'Determining Internal IP' [from above]
5: Repeat step 4 for Soldat Server Port
6: Enter 'ASE Ports' [from above] and select one of the following: UDP/TCP or BOTH or ALL then enter 'Determining Internal IP' [from above]
7: Press the Save or Apply button
8: Some routers require you to reboot the router to apply the changes so either press the Reboot button or go back to one of the main pages and find the Reboot button
9: Log out, and you're done!
|bgcolor:#ccc; Other Router Tricks:|Setting Your Host in a DMZ [Demilitarized Zone]:|
1: Go one of the 'Known Router Addresses'
2: Enter your router password. If you do not know it try one of the 'Default Router Passwords'
3: Find and enter the DMZ or Demilitarized Zone page. [note: usually found within the Advanced page or Security page]
4: Enter 'Determining Internal IP' [from above] into the textbox.
5: Press the Save or Apply button
6: Some routers require you to reboot the router to apply the changes so either press the Reboot button or go back to one of the main pages and find the Reboot button
7: Log out, and you're done!

Once you're sure the internet traffic is allowed all the way in to your solserver on those 4 ports ( you may need to keep [[testing with Windows]] several times ) then __''all that's left is for you to do''__ is have a play around with [[Soldat Admin.exe|http://static.soldat.pl/downloads/soldatadmin12.zip]]. Either (a) launch it directly on your Windows pc where your soldat.exe lives, or (b) [[access linux remotely]].

You're done.

//Rejoice and play... !//
STEP 1c of 3 - Running your new solserver

* to run your linux solserver use this command

* to shut it down you will simply do a Ctrl+C

__Admining the server__

From in-game, meaning after you launch soldat.exe and join your solserver :

i. type /adminlog //youradminpassword//
 - or -
ii. type /adm Soldier

That /adminlog command will make you an admin until you exit the game...

More info [[here|http://forums.soldat.pl/index.php?topic=11414.0]]

See [[server commands (Remote Admin.exe)]] later.

NEXT: [[testing with Windows]]
/SAY [text] - sends a text message to all players on the server

/KICKLAST - kicks the player that last joined the server
/KICK [player's name] - removes a player/bot from the game
/KILL [player's name or number] - kills/punishes the player

/MUTE [player's name or number] - mutes the player so you don't see his chat
/UNMUTE [player's name or number] - unmutes the player

/BANLAST - like /kicklast, bans for 1 hour the last player that joined
/BAN [player's name] - bans the player on the server so he can't join in again
/BANIP [IP Number] - bans the IP number
/UNBAN [IP Number] - unbans the IP number
/UNBANLAST - unbans the last player that was banned

/PASSWORD [word] - changes temporarily the server password

/ADMINPASS [word] - changes the remote admin password
/ADM [Player's Name] - adds the player to the Remote Admins list
/ADMIP [IP Number] adds the IP number to the Remote Admins list
/ADMINLOG [password] - for client, logs in as a remote admin on the server using password
/UNADM [IP Number] - removes the IP number from the Remote Admins list

/SETTEAM1 [number], setteam2, setteam3, setteam4 - forces the player to join team
/SETTEAMx [player number] - forces the player to join team x (options 1 for alpha, 2 for bravo, 3 for charlie, 4 for delta and 5 for spectator)

/LOADCON - reloads soldat.ini server settings
/LOADWEP [xxx] - reloads weapons.ini weapon settings or from file xxx.ini

/GAMEMODE [0-6] - changes the gamemode (0 DM, 1 PM, 2 TM, 3 CTF, 4 RM, 5 INF, 6 HTF)

/FRIENDLYFIRE [0/1] - friendly fire on or off
/REALISTIC [0/1] - switches realistic mode
/ADVANCE [0/1] - switches advance mode
/SURVIVAL [0/1] - switches survival mode
/BONUS [0-5] - frequency of bonuses 0-none, 5- lots

/MAP [map name] - changes the map
/NEXTMAP - changes the map to the next one in the list
/RESTART - resets the current match

/MAXPLAYERS [1-32] - maximum players allowed on server
/VOTE% [0-100] - changes the percentage of players needed to vote on a map or kick

/TIMELIMIT [minutes] - changes the current time limit
/LIMIT [number] - changes the current game limit (kills/points/captures)
/RESPAWNTIME [seconds] - changes the respawn time
/MAXRESPAWNTIME [seconds] - changes the maximum respawn time in team games

/ADDBOT [bot name] - adds a new bot to the game
/ADDBOT1 [name], /addbot2, /addbot3, /addbot4 - for adding team bots
/ADDBOTx [bot's name] - adds a bot to team x
STEP 2 of 3 - Ensuring your new solserver is online

By now you might already have Soldat Dedicate Server software installed, check your START menu...

Choose your own unique Game Name and select Network Connection type as "Internet" mode ( with Register In Lobby Server ticked ) :

Then START GAME tab, Start Game button.

To test your local running solserver, open your regular soldat.exe on your Windows pc as if you're going to connect to a public soldat server, and look for your own unique Game Name :

Few notes,
- you won't be able to connect to your local Windows solserver from the same pc as you're using to play soldat ( you're on the same LAN, so don't expect your internet IP address to be routable inside here )
- ping will be 9999 if the internet cannot ping through to your Windows pc ( pretty likely your router doesn't allow it... doesn't matter there won't be any lag between yourself and yourself )
- Windows pretty much sucks. Well not really but it's fun to say. Try it. You'll be a convert to Linux in no time.

Extra bonus points, if you determine your internal IP address ala [[n00bface|opening ports]]'s table, you can ( //from memory// ) control your local Windows solserver whilst it's running using the Soldat [[Remote Admin|http://static.soldat.pl/downloads/soldatadmin12.zip]] tool. Give it a quick go. You'll need to later.

Connecting to solserver locally, with Game Type=LAN and manually typing in what you determined the LAN IP address to be for your solserver (ala n00bface).

''__Final test__'' is if remote users can join your solserver, they'll have spotted your unique name in the Lobby (Game Type=Internet) and will be connecting to your //external// IP address (the one you're telco gives you, not what your pc's call their local LAN IP address)

NEXT: [[opening ports]]
1. run a Soldat Server so you can play online games against strangers ...with your own ping at essentially 0ms
2. don't spend a cent

''Soldat Dedicated Server 1.6.3 (v2.7.3) [[3.73MB|http://soldat.thd.vg/en/download/soldatserver2.7.3_1.6.3.zip]]'' <== //sol__server__//

Server will chew up very small amounts of your monthly internet data quota. If you see too much incoming traffic, turn it off sometimes dude ;)

What you'll need:
1. any old pc or laptop - we're going to put Linux on it (a lite ubuntu distribution) and boot it from a freshly re-formatted (usb) drive ...but if yours is running Windows and you want to stick with it then that's fine too
2. a few hours to kill


1. you've got soldat.exe installed and working on a Windows pc
2. you're not a total asshat (if you're reading all this thoroughly, things are really looking good for you)

''Soldat 1.6.3 Release [[17.1MB|http://soldat.thd.vg/en/download/soldat163.zip]]'' <== //soldat.__exe__//

NEXT: [[download this stuff]]