!!Introduction:\nYou are Jacob Drake, a former military neurogenticist, you pioneered neurogenesis using nanobots, but your intent was never to benefit humanity. A disgust for your human compatriots, you used your research to bring on the apocalypse, unleashing your neuro-bot virus on the world. \n\nYou are a gun obsessed war machine, you are tickled by the sight of explosions, and have now unleashed yourself onto the world of zombies you created...\n\nYou enter the world outside the lab where you unleashed the virus, ground zero, an entire military complex with the most advanced weaponry in the world at your finger tips, and thousands of uniform clad zombies ready for field testing.\n\nAs you explore the base, festering with the putrid dead you created, you find a number of upgrades for your base M16, a grenade launcher, flame thrower, shot gun, pistols, and a number of highly experimental weapons beyond your wildest dreams. Their previous purpose now rendered meaningless, zombie destruction is the only goal.\n\nYou walk through the base blasting anything that moves, leaving blood splatters on the walls, body parts strewn all over the ground, and piles of lifeless flesh.\n\nZombies Must Die!
<div macro='gradient horiz #0044bb #1188ff #ffffff' class='windowBar'>\n<span class='windowToolbar' macro='toolbar jump collapseTiddler closeTiddler'></span>\n<span class='title' macro='view title'></span></div>\n\n<div class='collapsible'>\n<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></span></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div>\n<div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<div macro='sizer' class='sizer'></div>\n</div>
Jonny LeRoy works for [[ThoughtWorks|http://www.thoughtworks.com/]] in London and created the TiddlyDesktop enhancements to TiddlyWiki\n\nSee http://www.digitaldimsum.co.uk/ for more TiddlyWiki adaptations.\n\nemail jonny [at] leroy [dot] com
!!!World\nThe game opens with the main character in the center of an abandoned military base, location unknown. The base itself looks like it has been abandoned for years, when in reality it has been out of commission for a matter of weeks. Covered in blood stains, detritus, and other elements that would suggest the base has been under serious lack of care or regulation.\n\n*Broken glass\n*Shattered wood\n*Blood marks\n*Fires\n*Smoke\n*Broken Lights\n*etc etc\n\nThe military base should be broken down into zones, with the main character Jacob Drake starting at the epic center of one of the bases main research wings. As the game progresses, he should advance through various "weapons testing" zones, barracks, etc, until he eventually comes to the outside wall of the base. This is where we can expand the world further, "the world is our oyster".\n\n!!!Controls\nControls are something we will need to discuss once we have the game world sorted out. I have never actually played with an iPhone. I have seen a few demos, but I am not sure how we should achieve this.\n\n*We should take advantage of on screen controls for video capture, zoom, aiming???\n\n!!!Game Modes\n*Video Capture\n**Allow short sections of game play to be captured and stored to the built in HDD, or a memory card.\n**Should save out to a file type that can easily be uploaded to youtube/vimeo.\n**Maybe provide a separate ap (pay for of course) to allow players to directly upload from their iPhone without leaving the game menu, to either youtube or vimeo.\n**This mode would allow for built in promotion of the game, we get it into the hands of a bunch of kids who love youtube and the game should in theory gain popularity exponentially.\n\n*Slow Mo\n**Allow players to slow game play down to watch the zombie/world destruction in slower/greater detail\n\n*Zoom\n**Should be activated by either touching a button, or touching the screen with two fingers and expanding them outwards to select the zone to be zoomed in on.\n**Zoom should only be available on special item uses, i.e. if a grenade is thrown it would be cool to have the option to zoom to that area of the scene to see the action in a bit more detail.\n**Should be able to activate video capture and slow mo while in zoom mode, maybe the game pauses for a second to allow the play time to active these.\n\n!!!Game Play Path\n\n*Opening Vid: Opening video should show a scene of Jacob Drake releasing the virus onto the world, constantly reminded of Resident Evil, or the new Dawn of the Dead. We could have a lot of fun with this, I just need to know the specs art wise and I can delegate the task to someone asap. The main character needs to be knocked out, or put under somehow, maybe he puts himself into a containment chamber to avoid the virus? Due to it being a neuro virus/nano med virus there is no way to avoid it other then complete isolation.\n\n*Zone I: Neurogentics Research Facility -- This is where game play will start, as your character was/is a military neurogeneticist. Game opens an hour or so after the virus was released, with Jacob coming out of isolation. The facility should be a somewhat open roomed area, reasonably well lit, but with signs that something has definitely gone wrong. It should also have plenty of windows which can be destructed, and lightly colored concrete/white walls allowing for blood splatters to be visible.\n\n*Zone II: Soldiers/Scientist Barracks -- The research facility actually exists under the soldier barracks (wonder why it was set up this way...), so when Drake emerges from his indoor slaughter fest he should be outdoors in the barracks area. No real reasoning for this other then the barracks will provide a large number of zombies, and enough exploration to keep players intrigued. \n**[[Inside Ref|http://news.minnesota.publicradio.org/features/2005/09/06_postt_ripley/images/barracks_large.jpg]]\n**[[Building Ref|http://www.airfields-freeman.com/CO/SkyRanch_CO_06_hgrs_w.jpg]]\n\n*Zone III: Weapons Research Facility -- No reason this would be right next to the barracks, but it's a video game so we can do w/e. Plus it will provide players with easy access to some new weapons and a place to test them out. We should also allow players to travel back through the barracks/labs if they so desire to test out the new weps. The weapons facility will be very lightly populated, and maybe host a new character type and a boss mob of sorts? Bio genetic uber-soldier?\n\n*Zone's beyond this... We need to cut the gameplay short for this version so we can just get something out and playable. We can always add more zones, once the code is in place we can train anyone to add new zones so we can put our focus back into other games and their assets.\n\n\n!!!Game Play\nDestroy all that moves. Not sure how in depth this section needs to be. If you see a zombie, you shoot it, either it just keels over, breaks into a few pieces, or blows up. \n\n*Linear? (Should the game play be linear, i.e. you go from the neuo research facility, to the weapons testing, to the barracks, etc? Or should it be free to explore?)\n*Start out with a few zombies per screen, very slow moving, unintelligent --> progress to zombies coming out of hidden areas/shadows/windows/from behind/etc.\n\n!!!Characters\n*Jacob Drake\n**Main Character\n**Former Military Neurogenticist\n**Burly guy, falls under the "all that is man" category\n**Would take a gun to bed over a woman\n**Hell bent on destruction\n**Life is target practice\n\n*Scientist Zombie\n**The first zombies encountered, Jacob was heading up the research facility full of scientists when he unleashed his virus.\n**Visually should appear malformed and blood stained\n**Maybe Burnt\n**Torn Hair\n**Torn Clothing\n**Male and Female\n\n*Barracks Zombie\n**The second mob type character that will be encountered\n**Camo pants, blue shirts...\n**Blood stains\n**Malformed bodies\n**[[Zombie Leg Drag Animation Test|http://www.bpgame.info/Zombie%20leg%20drag.rar]]\n\n*Chef\n**Big fat old zombie\n**Rarer mob only found in barracks zone\n**Built to be blown up\n**Should make a real mess when blown up\n**Can be higher detail as we can have it be on the screen alone with the main chracter\n\n*Uber-Soldier\n**Bio Genetic experiment gone wrong, brought to life by the neuro virus\n**Fusion of flesh and metal\n**Should be able to take a significant amount of damage\n**Should guard new weapons/special weapons/upgrades. Thus making it a bit of a challenge for players to get to the upgrades\n\n!!!Weapons\n\n\n!!!Power Ups
HelloThere\nTiddlyWiki\nMainFeatures\n[[TiddlyWiki/Dev]]\nGettingStarted\nUsingThisSite\n[[Community]]\nDownloadSoftware\n[[Plugins]]\n[[Donations]]\n[[RSS|RssFeed]]\n\n© [[osmosoft|http://www.osmosoft.com]] 2006
<div id='header'>\n<div id='titleLine' macro='gradient vert #1188ff #0044bb'>\n<span id='desktopButtons' refresh='content' tiddler='DesktopButtons'></span>\n<span id='siteTitle' refresh='content' tiddler='SiteTitle'></span>\n<span id='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='sidebar'>\n<div id='messageArea'></div>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n<div id='sidebarCopyright' refresh='content' tiddler='Copyright'></div>\n</div>\n<div id='displayArea'>\n<div id='tiddlerDisplay'></div>\n</div>
<<list shadowed>>
<<list shadowed>>
v.01
[[Zombies Must Die Game Concept]]
http://www.digitaldimsum.co.uk/tiddly/tiddlydesktop/
/*{{{*/\n\nBODY {\n background-color: #ddd;\n}\n\n.collapsible {\n margin: 4px;\n}\n\n.scrollable {\n margin: 4px;\n overflow: auto;\n}\n\n.windowBar {\n color: #fff;\n background-color: #04b;\n cursor:pointer;\n padding: 2px 2px 2px 4px;\n}\n\n.windowBar .title {\n color: #ccc;\n font-size: 1em;\n cursor:move;\n}\n\n.selected .windowBar .title {\n color: #fff;\n}\n\n.tiddler { \n position: relative; \n width: 500px; \n border: solid 1px;\n border-color: #999;\n background-color: #fff;\n padding: 0px;\n}\n\n.viewer {\n background:white;\n}\n\n\n.windowToolbar {\n text-align: right;\n float: right;\n}\n\n.collapsible .toolbar {\n text-align: right;\n margin-top: 4px;\n}\n\n.sizer {\n text-align: right;\n cursor: move;\n background-color: #ccc;\n}\n\n.sizer .resizer {\n color: #fff;\n background-color: #aaa;\n padding: 0px 2px 0px 2px;\n}\n\n.tiddler .windowBar .button {\n color: #04b;\n background-color: #fff;\n margin-right: 2px;\n padding: 0em 0.4em;\n border: solid 1px #ccc;\n}\n\n.tiddler .windowBar .button:Hover {\n background-color: #8cf;\n border-color: #04b;\n}\n\nh1,h2,h3,h4,h5 {\n color: #04b;\n background: transparent;\n padding-left: 2px;\n}\n\nh1,h2 {\n color: #04b;\n background: transparent;\n border-bottom: solid 1px #04b;\n}\n\n.tagging A, .tagged A {\n border: none !important;\n background-color: transparent !important;\n}\n\n.selected .tagging A, .selected .tagged A {\n}\n\n.tagging A:Hover, .tagged A:Hover {\n border: none !important;\n background-color: transparent !important;\n color: #f00 !important;\n}\n\n#sidebarCopyright {\n background-color: #ddd;\n color: #666;\n padding: 10px 4px 20px 4px;\n}\n\n#sidebarCopyright A {\n color: #555;\n}\n\n#sidebarCopyright A:Hover {\n color: #f00;\n background-color: transparent;\n}\n\n\n#titleLine {\n padding: 1em 0em 1em 0em;\n background-color: #04b;\n}\n\n#siteTitle {\n font-size: 1em;\n margin-left: 5px;\n color: #ccc;\n} \n\n#siteTitle A {\n color: #8cf;\n}\n\n#siteTitle A:hover {\n color: #fff;\n background-color: transparent;\n}\n\n#siteSubtitle {\n font-size: .9em;\n color: #fff;\n}\n\n#displayArea {\n margin: 1em 17em 0em 2em;\n}\n\n.subtitle {\n font-size: 1em;\n text-align: right;\n float: right;\n padding-top: 1em;\n}\n\n#desktopButtons {\n float: right;\n}\n\n#desktopButtons A {\n font-weight: normal !important;\n margin-right: .25em;\n color: #ccc;\n font-size: .9em;\n padding: .1em .5em;\n border: solid 1px #18f;\n}\n\n#desktopButtons A:Hover {\n color: #fff;\n border: solid 1px #04b;\n background-color: #18f;\n}\n\n#sidebar {\n background-color: #fff;\n border-left: solid 1px #ccc;\n border-bottom: solid 1px #ccc;\n}\n\n.tabContents {\n border-left: 1px solid #fff;\n}\n\n.tabContents .tabContents {\n border-left: 1px solid #ccc;\n}\n\n/*}}}*/\n\n
/***\nThanks to [[Roman Porotnikov|http://www.jroller.com/page/deep/20030701]]\n\nNB this systemConfig needs to be evaluated before other ones \nthat use the Aspects so the name starts with "."\nsince they're loaded alphabetically\nshould really put it into the main source code, but\nwanted to keep everything upgrade-proof\n***/\n\n/*{{{*/\n\nAspects = new Object();\n\nAspects.addBefore = function(obj, fname, before) {\n var oldFunc = obj[fname];\n obj[fname] = function() {\n return oldFunc.apply(this, before(arguments, oldFunc, this));\n };\n};\n\nAspects.addAfter = function(obj, fname, after) {\n var oldFunc = obj[fname];\n obj[fname] = function() {\n return after(oldFunc.apply(this, arguments), arguments, oldFunc, this);\n };\n};\n\nAspects.addAround = function(obj, fname, around) {\n var oldFunc = obj[fname];\n obj[fname] = function() {\n return around(arguments, oldFunc, this);\n };\n};\n\n/*}}}*/\n
///////////////////////////////////////////////////////////////\n// Requires http://www.digitaldimsum.co.uk/#_.FunctionDecorator\n///////////////////////////////////////////////////////////////\n\nAspects.addBefore(this, "onClickTagOpenAll", function(args) {\n story.closeAllTiddlers();\n return args;\n});
/***\n|Name|''List Tags By Popularity''|\n|Version|''1.0''|\n|TW Version|''2.0.0 (beta 6)''|\n|Author|''Jonny LeRoy''|\n\n!Overview\nThis macro changes the default ordering for the "Tags" menu list; ordering by the amount of Tiddlers with that tag, rather than a simple alphabetic ordering.\n\n!The Macro\n***/\n\n/*{{{*/\nTiddlyWiki.prototype.getTagsOld = TiddlyWiki.prototype.getTags;\n\nTiddlyWiki.prototype.getTags = function() {\n return this.getTagsOld().sort(function (a,b) {return b[1] - a[1]})\n}\n/*}}}*/\n
\n/***\n!Collapse / Expand all tiddlers\n***/\n\n/*{{{*/\n\nconfig.macros.collapseAll = {label: "collapse all", prompt: "Collapse all visible Tiddlers"};\nconfig.macros.collapseAll.handler = function(place) {\n createTiddlyButton(place,this.label,this.prompt,function () {story.collapseAll(); return false;});\n}\n\nStory.prototype.collapseAll = function() {\n this.forEachTiddler(function(tiddler,e) {\n config.commands.collapseTiddler.toggle(tiddler,true,false);\n });\n}\n\nconfig.macros.expandAll = {label: "expand all", prompt: "expand all visible Tiddlers"};\nconfig.macros.expandAll.handler = function(place) {\n createTiddlyButton(place,this.label,this.prompt,function () {story.expandAll(); return false;});\n}\n\nStory.prototype.expandAll = function() {\n this.forEachTiddler(function(tiddler,e) {\n config.commands.collapseTiddler.toggle(tiddler,false,true);\n });\n}\n\nconfig.macros.autoLayout = {label: "cascade", prompt: "Layout all open Tiddlers nicely"};\nconfig.macros.autoLayout.handler = function(place) {\n createTiddlyButton(place,this.label,this.prompt,function () {layout.autoLayout(); return false;});\n}\n\n/*}}}*/\n\n
\n/***\n!Collapse Tiddler\n***/\n\n/*{{{*/\n\nconfig.views.wikified.collapseTiddler = {\n text: "-",\n tooltip: "Collapse this tiddler",\n toggleText: "+",\n toggleTooltip: "Expand this tiddler"\n};\n\nconfig.commands.collapseTiddler = {\n text: config.views.wikified.collapseTiddler.text,\n tooltip: config.views.wikified.collapseTiddler.tooltip,\n toggleText: config.views.wikified.collapseTiddler.toggleText,\n toggleTooltip: config.views.wikified.collapseTiddler.toggleTooltip,\n\n handler: function(event,src,title) {\n this.toggle(title, true, true);\n },\n \n toggle: function(title, collapse, expand) {\n var theDiv = document.getElementById(story.idPrefix + title);\n var theLink = this.getCollapseLink(theDiv);\n\n var div = this.findCollapseDiv(theDiv);\n if (expand && div.style.display == 'none') {\n this.toggleDisplay(theDiv, div, theLink, 'block', theDiv.style._oldHeight, this.text, this.tooltip)\n } else if (collapse) {\n if (theDiv.style.height) {\n theDiv.style._oldHeight = theDiv.style.height;\n }\n\n this.toggleDisplay(theDiv, div, theLink, 'none', div.style.height, this.toggleText, this.toggleTooltip)\n }\n },\n \n getCollapseLink: function(theDiv) {\n var links = theDiv.getElementsByTagName('a');\n for (i in links) {\n var link = links[i];\n if (link.innerHTML == this.text || link.innerHTML == this.toggleText) {\n return link;\n }\n }\n },\n \n findCollapseDiv: function(theDiv) {\n var children = theDiv.childNodes;\n \n for (i in children) {\n var div = children[i];\n if (div && div.className == 'collapsible') {\n return div;\n }\n }\n },\n \n toggleDisplay: function(theDiv, div, theLink, display, height, text, tooltip) {\n div.style.display = display;\n theLink.innerHTML = text;\n theLink.setAttribute('title', tooltip);\n if (typeof height != 'undefined') {\n theDiv.style.height = height;\n }\n theDiv.collapsed = display == 'none';\n }\n \n};\n\n/*}}}*/\n\n
\n/***\n!Config Changes\nSet some text icons for the edit buttons\n***/\n\n/*{{{*/\nconfig.commands.closeTiddler.text = "x";\nconfig.commands.jump.text = "#";\n\n/*}}}*/\n\n/***\nAnimations get in the way of proper display - disable them for now\n***/\n/*{{{*/\nconfig.options.chkAnimate = false;\nconfig.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/\sn<<option chkAnimate>> EnableAnimations/, '');\n\n/*}}}*/\n\n/***\n!Shadow Tiddlers\nShadow the StyleSheet and various templates so they're retrievable and can all be imported with a single macro\n\n***/\n\n/*{{{*/\n\nconfig.shadowTiddlers.StyleSheet = "/*{{{*/\sn\snBODY {\sn background-color: #ddd;\sn}\sn\sn.collapsible {\sn margin: 4px;\sn}\sn\sn.scrollable {\sn margin: 4px;\sn overflow: auto;\sn}\sn\sn.windowBar {\sn color: #fff;\sn background-color: #04b;\sn cursor:pointer;\sn padding: 2px 2px 2px 4px;\sn}\sn\sn.windowBar .title {\sn color: #ccc;\sn font-size: 1em;\sn cursor:move;\sn}\sn\sn.selected .windowBar .title {\sn color: #fff;\sn}\sn\sn.tiddler { \sn position: relative; \sn width: 500px; \sn border: solid 1px;\sn border-color: #999;\sn background-color: #fff;\sn padding: 0px;\sn}\sn\sn.viewer {\sn background:white;\sn}\sn\sn\sn.windowToolbar {\sn text-align: right;\sn float: right;\sn}\sn\sn.collapsible .toolbar {\sn text-align: right;\sn margin-top: 4px;\sn}\sn\sn.sizer {\sn text-align: right;\sn cursor: move;\sn background-color: #ccc;\sn}\sn\sn.sizer .resizer {\sn color: #fff;\sn background-color: #aaa;\sn padding: 0px 2px 0px 2px;\sn}\sn\sn.tiddler .windowBar .button {\sn color: #04b;\sn background-color: #fff;\sn margin-right: 2px;\sn padding: 0em 0.4em;\sn border: solid 1px #ccc;\sn}\sn\sn.tiddler .windowBar .button:Hover {\sn background-color: #8cf;\sn border-color: #04b;\sn}\sn\snh1,h2,h3,h4,h5 {\sn color: #04b;\sn background: transparent;\sn padding-left: 2px;\sn}\sn\snh1,h2 {\sn color: #04b;\sn background: transparent;\sn border-bottom: solid 1px #04b;\sn}\sn\sn.tagging A, .tagged A {\sn border: none !important;\sn background-color: transparent !important;\sn}\sn\sn.selected .tagging A, .selected .tagged A {\sn}\sn\sn.tagging A:Hover, .tagged A:Hover {\sn border: none !important;\sn background-color: transparent !important;\sn color: #f00 !important;\sn}\sn\sn#sidebarCopyright {\sn background-color: #ddd;\sn color: #666;\sn padding: 10px 4px 20px 4px;\sn}\sn\sn#sidebarCopyright A {\sn color: #555;\sn}\sn\sn#sidebarCopyright A:Hover {\sn color: #f00;\sn background-color: transparent;\sn}\sn\sn\sn#titleLine {\sn padding: 1em 0em 1em 0em;\sn}\sn\sn#siteTitle {\sn font-size: 1em;\sn margin-left: 5px;\sn} \sn\sn#siteTitle A {\sn color: #8cf;\sn}\sn\sn#siteTitle A:hover {\sn color: #fff;\sn background-color: transparent;\sn}\sn\sn#siteSubtitle {\sn font-size: .9em;\sn color: #fff;\sn}\sn\sn#displayArea {\sn margin: 1em 17em 0em 2em;\sn}\sn\sn.subtitle {\sn font-size: 1em;\sn text-align: right;\sn float: right;\sn padding-top: 1em;\sn}\sn\sn#desktopButtons {\sn float: right;\sn}\sn\sn#desktopButtons A {\sn font-weight: normal !important;\sn margin-right: .25em;\sn color: #ccc;\sn font-size: .9em;\sn padding: .1em .5em;\sn border: solid 1px #18f;\sn}\sn\sn#desktopButtons A:Hover {\sn color: #fff;\sn border: solid 1px #04b;\sn background-color: #18f;\sn}\sn\sn#sidebar {\sn background-color: #fff;\sn border-left: solid 1px #ccc;\sn border-bottom: solid 1px #ccc;\sn}\sn\sn.tabContents {\sn border-left: 1px solid #fff;\sn}\sn\sn.tabContents .tabContents {\sn border-left: 1px solid #ccc;\sn}\sn\sn/*}}}*/\sn\sn";\nconfig.shadowTiddlers.EditTemplate = "<div macro='gradient horiz #0044bb #1188ff #ffffff' class='windowBar'>\sn<span class='windowToolbar' macro='toolbar jump collapseTiddler closeTiddler'></span>\sn<span class='title' macro='view title'></span></div>\sn\sn<div class='collapsible'>\sn<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>\sn<div class='editor' macro='edit title'></div>\sn<div class='editor' macro='edit text'></div>\sn<div class='editor' macro='edit tags'></div>\sn<div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn<div macro='sizer' class='sizer'></div>\sn</div>";\nconfig.shadowTiddlers.PageTemplate = "<div id='header'>\sn<div id='titleLine' macro='gradient vert #1188ff #0044bb'>\sn<span id='desktopButtons' refresh='content' tiddler='DesktopButtons'></span>\sn<span id='siteTitle' refresh='content' tiddler='SiteTitle'></span>\sn<span id='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='sidebar'>\sn<div id='messageArea'></div>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn<div id='sidebarCopyright' refresh='content' tiddler='Copyright'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='tiddlerDisplay'></div>\sn</div>";\nconfig.shadowTiddlers.ViewTemplate = "<div macro='gradient horiz #0044bb #1188ff #ffffff' class='windowBar'>\sn<span class='windowToolbar' macro='toolbar jump collapseTiddler -closeTiddler'></span>\sn<span class='title' macro='view title'></span></div>\sn<div class='collapsible'>\sn<div class='toolbar' macro='toolbar +editTiddler permalink references closeOthers'></div>\sn<div class='scrollable'>\sn<div class='tagging' macro='tagging'></div>\sn\sn<div class='tagged' macro='tags'></div>\sn<div class='viewer' macro='view text wikified'></div>\sn<div class='subtitle'>\sn<span macro='view modified date [[DD/MM/YYYY]]'></span>\sn (created: <span macro='view created date [[DD/MM/YYYY]]'></span>)\sn</div>\sn<div class='tagClear'></div>\sn</div>\sn<div macro='sizer' class='sizer'></div>\sn</div>";\nconfig.shadowTiddlers.SideBarOptions = "<<search>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options \su00BB' 'Change TiddlyWiki advanced options'>>",\nconfig.shadowTiddlers.Copyright = "\snTiddlyWiki was created by [[Jeremy Ruston|http://tiddlywiki.com/#JeremyRuston]] and is published under an [[Open Source License|http://tiddlywiki.com/#OpenSourceLicense]]\sn\snTiddlyDesktop was created by JonnyLeRoy and is released under the same terms.\sn\snFeel free to sue me if it breaks your air-traffic-control system. It worked on my machine.";\nconfig.shadowTiddlers.DesktopButtons = "<<closeAll>><<jump>><<collapseAll>><<autoLayout>><<expandAll>><<saveLayout>><<restoreLayout>>";\n\n\n\n/*}}}*/\n\n
\n\n/***\n\n!Core Drag Functionality\nBorrowed from [[DOM Drag|http://www.youngpup.net]] with some changes\n\n***/\n\n/*{{{*/\n\nvar Drag = {\n\n obj : null,\n\n init : function(o, oRoot) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n\n if (isNaN(parseInt(o.root.style.left ))) o.root.style.left = "0px";\n if (isNaN(parseInt(o.root.style.top ))) o.root.style.top = "0px";\n\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start : function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n o.root.onDragStart(x, y);\n\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n\n return false;\n },\n\n drag : function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n var nx, ny;\n\n nx = x + ((ex - o.lastMouseX) * 1);\n ny = y + ((ey - o.lastMouseY) * 1);\n\n if (ny < TiddlyDesktop.canvas.top) ny = TiddlyDesktop.canvas.top;\n if (nx + o.clientWidth < TiddlyDesktop.canvas.left) nx = TiddlyDesktop.canvas.left - o.clientWidth;\n\n Drag.obj.root.style.left = nx + "px";\n Drag.obj.root.style.top = ny + "px";\n Drag.obj.root.clientX = nx + "px";\n Drag.obj.root.clientY = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n\n Drag.obj.root.onDrag(nx, ny);\n return false;\n },\n\n end : function() {\n document.onmousemove = null;\n document.onmouseup = null;\n Drag.obj.root.onDragEnd( parseInt(Drag.obj.root.style.left),\n parseInt(Drag.obj.root.style.top));\n Drag.obj = null;\n },\n\n fixE : function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n\n/*}}}*/\n
\n/***\n!Drag Tiddler\n***/\n/*{{{*/\n\nvar lastClicked;\n\nfunction bringToFront() {\n if (lastClicked == this) return;\n lastClicked = this;\n var parent = this.parentNode;\n parent.removeChild(this);\n parent.appendChild(this);\n layout.bringToFront(this);\n}\n\nStory.prototype.old_displayTiddler = Story.prototype.displayTiddler;\n\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly) {\n this.old_displayTiddler(srcElement,title,template,animate,slowly);\n var tiddlyDiv = document.getElementById(this.idPrefix +title);\n var theHandle = tiddlyDiv.getElementsByTagName("div")[0];\n\n layout.limitHeight(tiddlyDiv);\n \n tiddlyDiv.bringToFront = bringToFront;\n tiddlyDiv.onmousedown = bringToFront;\n tiddlyDiv.bringToFront();\n config.commands.collapseTiddler.toggle(title, false, true);\n\n layout.add(tiddlyDiv, true);\n \n if (theHandle) {\n theHandle.fixHeight = function() {\n this.style.height = '1.25em';\n };\n \n theHandle.fixHeight();\n \n theHandle.ondblclick = function(e) {\n this.fixHeight();\n e = fixE(e);\n config.commands.collapseTiddler.handler(e, null, title);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n };\n \n Drag.init(theHandle, tiddlyDiv);\n tiddlyDiv.onDragStart = function(x, y) {\n this.style.borderColor_old = this.style.borderColor;\n this.style.borderColor = 'red';\n }\n tiddlyDiv.onDragEnd = function(x, y) {\n this.style.borderColor = this.style.borderColor_old ? this.style.borderColor_old : '#999';\n layout.add(this, false);\n var sideBar = document.getElementById("sidebar");\n var parent = sideBar.parentNode;\n var top = sideBar.offsetTop;\n parent.removeChild(sideBar);\n parent.appendChild(sideBar);\n sideBar.style.top = top +'px';\n }\n }\n}\n\nStory.prototype.old_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,force) {\n var theTiddler = this.old_refreshTiddler(title,template,force);\n layout.limitHeight(theTiddler);\n return theTiddler;\n}\n\n/*}}}*/\n\n
\n/***\n!Bug Fixes / Core Changes\n***/\n\n/*{{{*/\n\n//Alert errors in systemConfigs if messageArea not yet rendered\nfunction checkDisplay(obj) {\n var oldFunc = obj['displayMessage'];\n obj['displayMessage'] = function(text, linkText) {\n oldFunc.apply(this, arguments);\n \n //remove the message after 4 secs\n setTimeout(clearMessage,4000);\n }\n \n};\n\ncheckDisplay(this);\n\n/*}}}*/\n\n
\n/***\n!Jump Macro\n***/\n\n/*{{{*/\n\nconfig.macros.jump = {\n label: "jump",\n prompt: "Jump to any open Tiddler",\n\n handler: function(place) {\n createTiddlyButton(place,this.label,this.prompt,function(event) {\n config.commands.jump.handler(event,this);\n });\n }\n}\n\n\n\n/*}}}*/\n\n
\n/***\n!Tiddler Layout\n***/\n/*{{{*/\n\nfunction Layout() {};\n\nLayout.prototype = {\n tiddlers: [],\n \n add: function(tiddler, nicely) {\n var newPos = {\n id: tiddler.id, \n x: findPosX(tiddler), \n y: findPosY(tiddler),\n z: this.tiddlers.length,\n \n toString: function() {\n var theTiddler = document.getElementById(this.id);\n \n return "\sn{id: '%0', x: %1, y: %2, z: %3, width: %4, height: %5, collapsed: %6}".format([\n this.id, \n this.x, \n this.y, \n this.z, \n theTiddler.clientWidth, \n theTiddler.clientHeight, \n (!!theTiddler.collapsed)\n ]);\n }\n };\n \n this.remove(tiddler);\n \n if (nicely) {\n this.position(newPos, tiddler, true);\n }\n\n this.tiddlers.push(newPos);\n this.tiddlers.sort(function(a, b) {return a.x - b.x});\n },\n \n position: function(newPos, tiddler, nicely) {\n if (nicely) {\n this.cascade(newPos);\n }\n\n tiddler.style.position = 'absolute';\n tiddler.style.left = newPos.x +'px';\n tiddler.style.top = newPos.y +'px';\n \n tiddler.bringToFront()\n },\n \n cascade: function(newPos) {\n for (t in this.tiddlers) {\n var pos = this.tiddlers[t];\n if (Math.abs(pos.x - newPos.x) < TiddlyDesktop.cascade.left) {\n newPos.x += TiddlyDesktop.cascade.left;\n if (Math.abs(pos.y - newPos.y) < TiddlyDesktop.cascade.top) {\n newPos.y += TiddlyDesktop.cascade.top;\n }\n }\n }\n },\n \n remove: function(tiddler) {\n for (t in this.tiddlers) {\n var pos = this.tiddlers[t];\n if (pos.id == tiddler.id) {\n this.tiddlers.splice(t, 1);\n break;\n }\n }\n },\n \n autoLayout: function() {\n var titles = [];\n for (t in this.tiddlers) {\n if (this.tiddlers[t].id) {\n titles.push(this.tiddlers[t].id.substring(story.idPrefix.length));\n }\n }\n story.closeAllTiddlers();\n story.displayTiddlers(null, titles.reverse());\n }, \n \n bringToFront: function(tiddler) {\n var stacked = this.tiddlers.sort(function(a,b) {return a.z - b.z});\n var tz = stacked.length;\n for (t in stacked) {\n var pos = stacked[t];\n if (pos.id == tiddler.id) {\n tz = pos.z;\n pos.z = stacked.length;\n } else if (pos.z > tz) {\n pos.z--;\n }\n }\n },\n \n marshall: function() {\n return "[%0\sn]".format([this.tiddlers.toString()]);\n },\n \n unmarshall: function(serializedLayout) {\n var savedTiddlers = eval(serializedLayout).sort(function(a,b) {return a.z - b.z});\n for (t in savedTiddlers) {\n if (savedTiddlers[t].id) {\n var pos = savedTiddlers[t];\n var title = pos.id.substring(story.idPrefix.length);\n story.displayTiddler(null, title);\n var tiddler = document.getElementById(pos.id);\n this.position(pos, tiddler, false);\n \n if (pos.width) {\n tiddler.style.width = pos.width +'px';\n tiddler.style.height = pos.height +'px';\n if (pos.collapsed) {\n config.commands.collapseTiddler.toggle(title, true, false);\n } else {\n tiddler.scrollable.style.width = (pos.width - 15) +'px';\n tiddler.scrollable.style.height = (pos.height - 60) +'px';\n }\n }\n }\n }\n },\n \n limitHeight: function(tiddlyDiv) {\n tiddlyDiv.findMovingParts = function() {\n var divs = this.getElementsByTagName("div");\n for (d in divs) {\n var div = divs[d];\n if (div && div.className == 'scrollable') {\n this.scrollable = div;\n }else if (div && div.className == 'windowBar') {\n this.windowBar = div;\n }\n }\n };\n \n tiddlyDiv.limitHeight = function() {\n this.findMovingParts();\n \n if (this.clientHeight > 400) {\n this.scrollable.style.height = '380px';\n }\n\n //for IE ... \n if(this.scrollable && this.scrollable.clientWidth >= this.windowBar.clientWidth) {\n this.scrollable.style.width = (this.windowBar.clientWidth - 15) +'px';\n }\n };\n \n tiddlyDiv.limitHeight();\n }\n}\n\nvar layout = new Layout();\n\nStory.prototype.old_closeTiddler = Story.prototype.closeTiddler;\n\nStory.prototype.closeTiddler = function(title,animate,slowly) {\n var tiddler = document.getElementById(this.idPrefix + title);\n if(tiddler != null) {\n layout.remove(tiddler);\n }\n this.old_closeTiddler(title,animate,slowly);\n}\n\n/*}}}*/\n\n
\n/***\n!List Macros Tab\n***/\n\n/*{{{*/\n\nconfig.shadowTiddlers.SideBarTabs = "<<tabs txtMainTab Content 'Stuff to read' TabContent System 'The engine room' TabSystem>>";\nconfig.shadowTiddlers.TabContent = "<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>";\nconfig.shadowTiddlers.TabMore = "<<tabs txtMoreTab Macros 'Macros / Plugins' TabMoreMacros Missing 'Missing tiddlers' TabMoreMissing Orphans 'Orphaned tiddlers' TabMoreOrphans>>";\nconfig.shadowTiddlers.TabSystem = "<<tabs txtSystemTab Macros 'Macros / plugins' TabSystemMacros Shadowed 'Shadowed tiddlers' TabSystemShadowed Desktop 'Desktop system tiddlers' TabSystemDesktop>>";\nconfig.shadowTiddlers.TabSystemMacros = "<<list macros>>";\nconfig.shadowTiddlers.TabSystemShadowed = "<<list shadowed>>";\nconfig.shadowTiddlers.TabSystemDesktop = "<<tagList TiddlyDesktop:logic>>";\n\nconfig.macros.list.macros = {\n prompt: "All macros / plugins",\n \n handler: function(params) {\n return store.getTaggedTiddlers("systemConfig", "title");\n }\n}\n\n\n/*}}}*/\n\n
/***\n!Tiddly Desktop Core Logic\n|''name''|_TiddlyDestopKernel|\n|''version''|1.1|\n|''date''|7 Jan 2006|\n|''author''|JonnyLeRoy|\n|''TW version''|2.0.0 (beta 6)|\n\nThis macro contains all the logic and styles to turn a standard TiddlyWiki into a TiddlyDesktop\n\n***/\n/*{{{*/\n\nvar TD_Loader = {\n logic: store.getTaggedTiddlers("TiddlyDesktop:logic"),\n \n load: function(list) {\n for(t in list) {\n var ex = processConfig(list[t].text);\n if(ex)\n alert(config.messages.customConfigError.format([ex,list[t].title]));\n }\n },\n \n init: function() {\n this.load(this.logic);\n }\n}\n\n\nTD_Loader.init();\n\n/*}}}*/\n\n/***\n!Components\n<<tagList TiddlyDesktop:logic>>\n***/\n\n
\n/***\n!Resize Tiddler\n***/\n\n/*{{{*/\n\n\nconfig.macros.sizer = {};\n\nconfig.macros.sizer.handler = function(place, macroName, params, wikifier, paramString, tiddler) {\n var theSizer = createTiddlyElement(place,"span",null,"resizer","resize me");\n var theTiddler = document.getElementById(story.idPrefix + tiddler.title);\n Sizer.init(theSizer, theTiddler);\n \n theTiddler.onSizeStartPre = function() {\n this.findMovingParts();\n\n this.scrollable.startHeight = parseInt(this.scrollable.offsetHeight);\n this.scrollable.startWidth = parseInt(this.scrollable.offsetWidth);\n\n this.windowBar.startHeight = parseInt(this.windowBar.clientHeight);\n };\n\n theTiddler.onSizeStartPost = function() {\n this.windowBar.fixHeight();\n };\n\n theTiddler.onSize = function(x, y) {\n\n var nx = x + this.scrollable.startWidth;\n var ny = y + this.scrollable.startHeight;\n\n if (nx < 80) nx = 80;\n if (ny < 50) ny = 50;\n\n this.scrollable.style.width = nx + "px";\n this.scrollable.style.height = ny + "px";\n\n this.windowBar.fixHeight();\n };\n \n};\n\n/*}}}*/\n\n
\n/***\n\n!Save Layout\nSave the layout to a tiddler for redisplaying later\n\n***/\n/*{{{*/\n\nconfig.macros.saveLayout = {\n label: "save layout", \n prompt: "Save the current layout as the default",\n \n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,this.label,this.prompt,this.saveLayout);\n },\n \n saveLayout: function() {\n var tiddlerName = "__tiddlyDesktopLayout";\n var serializedLayout = layout.marshall();\n serializedLayout = "/***\sn@@''This tiddler is auto-generated - don't edit it!''@@\sn***/\sn/*{{{*/\sn"+ serializedLayout +"\sn/*}}}*/\sn";\n var tiddler = store.saveTiddler(tiddlerName,tiddlerName,serializedLayout,config.options.txtUserName,new Date(),"excludeLists");\n\n if (config.options.chkAutoSave) {\n saveChanges();\n }\n }\n};\n\nconfig.macros.restoreLayout = {\n label: "restore layout", \n prompt: "Restores the last saved layout",\n \n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,this.label,this.prompt,restart);\n }\n};\n\nthis['restart'] = function() {\n var serializedLayout = store.getTiddlerText("__tiddlyDesktopLayout");\n var start = store.getTiddlerText("DefaultTiddlers");\n if(window.location.hash) {\n story.displayTiddlers(null,convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1))).readBracketedList());\n } else if(serializedLayout) {\n layout.unmarshall(serializedLayout);\n } else if(start) {\n story.displayTiddlers(null,start.readBracketedList());\n }\n}\n\n\n/*}}}*/\n
\n/***\n\n!Core Sizer Functionality\nStructure taken from [[DOM Drag|http://www.youngpup.net]]\n\n***/\n\n/*{{{*/\n\n\nvar Sizer = {\n\n obj : null,\n startX: 0,\n startY: 0,\n startWidth: 0,\n startHeight: 0,\n\n init : function(o, oRoot) {\n o.onmousedown = Sizer.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n\n o.root.onSizeStart = new Function();\n o.root.onSize = new Function();\n },\n\n start : function(e) {\n var o = Sizer.obj = this;\n e = fixE(e);\n\n o.root.onSizeStartPre(e);\n\n Sizer.startHeight = parseInt(o.root.offsetHeight);\n Sizer.startWidth = parseInt(o.root.offsetWidth);\n\n o.root.style.height = Sizer.startHeight +'px';\n o.root.style.width = Sizer.startWidth +'px';\n\n Sizer.startX = e.clientX;\n Sizer.startY = e.clientY;\n \n o.root.onSizeStartPost(e);\n \n document._oldonmousemove = document.onmousemove;\n document._oldonmouseup = document.onmouseup;\n document.onmousemove = Sizer.drag;\n document.onmouseup = Sizer.end;\n\n return false;\n },\n\n drag : function(e) {\n e = fixE(e);\n\n var x = (e.clientX - Sizer.startX);\n var y = (e.clientY - Sizer.startY);\n var nx = x + Sizer.startWidth;\n var ny = y + Sizer.startHeight;\n\n if (nx < 100) nx = 100;\n if (ny < 100) ny = 100;\n\n Sizer.obj.root.style.width = nx + "px";\n Sizer.obj.root.style.height = ny + "px";\n\n Sizer.obj.root.onSize(x, y);\n\n return false;\n },\n\n end : function() {\n document.onmousemove = document._oldonmousemove;\n document.onmouseup = document._oldonmouseup;\n Sizer.obj = null;\n }\n\n};\n\n\nfunction fixE(e) {\n if (typeof e == 'undefined') e = window.event;\n return e;\n}\n\n\n\n/*}}}*/\n\n\n
\n/***\n\n!Tag List macro\nSo that you don't need to have a tiddler for the tag\n\n***/\n/*{{{*/\n\n\nconfig.macros.tagList = {listTitle: "List of tiddlers tagged with '%0'", emptyListTitle: "Nothing tagged with '%0'"};\n\nconfig.macros.tagList.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var title = params[0];\n var tagged = store.getTaggedTiddlers(title);\n var theList = createTiddlyElement(place,"ul");\n\n if (tagged.length == 0) {\n createTiddlyElement(theList,"li",null,null,this.emptyListTitle.format([title]));\n }\n\n for(t in tagged) {\n if (tagged[t].title) {\n createTiddlyLink(createTiddlyElement(theList,"li"),tagged[t].title,true);\n }\n }\n}\n\n\n/*}}}*/\n\n
\n/***\n!Tiddly Desktop\nCore stuff - should move more functionality (like decorating Tiddlers) into here\n\n***/\n\n/*{{{*/\nvar TiddlyDesktop = {\n canvas: {\n top: 39,\n left: 60\n },\n \n cascade: {\n top: 20,\n left: 20\n }\n};\n\n/*}}}*/\n
The original - http://www.tiddlywiki.com\n
!''Introduction''\n//"Zombies Must Die! is a third-person shooter for the iPhone which will throw players into a post apocalyptic splatter fest of mindless zombie slaying fun."//\n\n!!''[[Description]]''\nDescription of the gameplay from the "you" perspective.\n\n!!''[[Key Features]]''\n
!Introducing v.01 (alpha) - 1 July 2009\nA new way to create and manage game design documents, originally coded by JonnyLeRoy, and based off TiddlyWiki. Code re-edited and geared for [[Design Documents]] by BenPerry. The basic functionality of [[TiddlyDesktop|http://www.digitaldimsum.co.uk/tiddlywiki/]] allows the user to move tiddlers/windows around and resize them. Currently in alpha testing/development... The original source for [[TiddlyDesktop|http://www.digitaldimsum.co.uk/tiddlywiki/]] is available here [[http://www.digitaldimsum.co.uk/tiddlywiki/|http://www.digitaldimsum.co.uk/tiddlywiki/]]\n\n!The idea\nAs TiddlyWiki has been progressing it seems to have been getting closer and closer to an operating system rather than just a content management system. Borrowing a few ideas from [[Joe Rai|http://www.cs.utexas.edu/~joeraii/dragn/]], [[YATWA|http://www.rumsby.org/yatwa/]] and some code from [[young pup|http://www.youngpup.net]] I started trying to see if I could make TiddlyWiki more like a desktop ...\n\nOnly part of the way there so far, but it looks promising. Thanks as ever to [[Jeremy Ruston|http://tiddlywiki.com/#JeremyRuston]] and the rest of the [[Tiddly Developers|http://groups.google.com/group/TiddlyWikiDev]]\n\n!What you can do\nYou can:\n* @@''move tiddlers''@@ by dragging the title bar\n* @@''resize tiddlers''@@ by grabbing the "resize me" link that floats vaguely near the bottom right corner of the tiddler\n* @@''collapse / expand tiddlers''@@ by double clicking the toolbar or using the -/+ signs in the toolbar\n* @@''auto cascade tiddlers''@@ to position them nicely when you open lots of them\n* @@''collapse / expand all''@@ from the sidebar\n* @@''bring tiddler to front''@@ by clicking on it\n* @@''save and restore layout''@@ - stored in a hidden tiddler\n* @@''err that's it''@@ for now, but more coming soon\n* @@''oh yes''@@ the message box has moved to the sidebar and now disappears after 4 seconds ... which makes me very happy\n\nSee RecentChanges for more details.\n\n!Technical\nThis version is based on TW 2.0.2. All the code, templates and styles are held in the [[_TiddlyDesktopKernel]] macro. If you want to import it just grab that and dump it into your version. Probably best to get the DIV from the source so no lines are wrapped.\n\n!Todo List\n<<tagList todo>>\n