These are the author's notes that are unlocked after finding the hidden ending of my game [[the uncle who works for nintendo|http://correlatedcontents.com/misc/UWWFN/UWWFN.html]]. At the request of Andrew Vestal, I've made them available separately from the game itself to review and share with others who may not have time to play the game itself.\n\n[[On Author's Notes]]\n\n[[On Making Games]]\n\n[[On Creepypasta]]\n\n[[On Lying to Your Friends]]\n\n[[On Sleepovers]]\n\n[[On Topicality]]\n\n[[On Gamers Being Over]]
When I began drafting this game at the beginning of August 2014 it was not topical beyond a general sense.\n\nBut as I write <<cyclinglink "this note" "what proves to be a first draft of this note, since I return to it again and again as the weeks drag on">>, it is the final week of August, and in the <<cyclinglink "month" "months" "years (?)">> I've been at work, the seemingly nebulous concerns I set out to treat -- the way the modern games industry encouraged and continues to encourage entire generations of children to internalize hierarchies predicated on structures of access maintained by abusive practices of exclusion, deception, and emotional manipulation -- <<cyclinglink "have erupted" "are erupting">> to the forefront of the "culture" in a way more horrific and absurd than anything I could <<cyclinglink "ever have made up" "ever have made up (and in my original draft I had a sentence here suggesting that by the time you read this, it would have ended, which of course turns out to be, unfortunately, not the case)">>.\n\nWe may not believe in the uncle who works for Nintendo anymore, but he is certainly still at work.\n\nWomen and minority voices are under attack. The finer details of <<cyclinglink "the situation" "what calls itself GamerGate" "this organized harassment campaign">> are, by this point, both fatiguing and immensely abhorrent. I will not bother to recount them here. Suffice it to say: the contingent of players taking up the flag of "gamers" are, in many ways, the realization of the thoughts, feelings, and behaviors that constitute the "enemy" of this game.\n\nThe fantasy underpinning the "happy" ending is that the people trapped in the unhealthy structures cultivated by a combination of late capitalism and videogames can become aware of the way in which they, their friends, in fact the very world around them, are all being devoured alive -- and that we can escape it if we work together.\n\nTo those women who have been terrorized <<cyclinglink "these past weeks" "for as long as they've been prominent in the industry" "for as long as they've been alive in a culture that implicitly hates them">>, to those still here and those who had to step away, to those who are doing and who did their best to make sure we get out of this beast before its jaws close on us, if any of you read this, I am sorry, and I thank you.\n\n[[Back|the author's notes]].
There are several endings to this game and yet, if you are reading this, it's because you've attained the ending after which I do not think there can be any more "play."\n\nIf you haven't unlocked all the endings and were planning to do so, I'm sorry for what probably seems to be a blunder in design.\n\nAlternatively, you can read the short essays that follow, since their appearance here was definitely an intended effect of the design. They are various reflections I composed for my own clarification and guidance while making and testing this game.\n\nThey are likely tedious and, to greater or lesser degrees, beside the point of whatever experience you had while playing the game, but that is why they are "hidden content."\n\nNevertheless, if you would like more traditional hidden content, please click [[here|alt-outfits]]. \n\nAnd at any rate, thanks for playing.\n\n[[Back|the author's notes]].
Congratulations! You have unlocked alternate outfits for all characters.\n\nDuring your next playthrough, do your best to imagine the characters wearing different outfits than the ones you imagined them wearing before.\n\nSome suggestions: you and your friend are now dressed like Auron and Tidus from Final Fantasy X. \n\nYour friend's parents are wearing Horse Armor (please PayPal me five dollars for this privilege, j dot michael dot lutz at gmail dot com).\n\nThe uncle who works for Nintendo has been replaced with Dreamsworks' beloved character, Shrek.\n\nBut really, your imagination is the only limit! That's the magic of games.\n\n\n[[Back|the author's notes]].
Fairytales, as one paraphrase of GK Chesterton goes, are important not because they tell us monsters exist -- we know that from our everyday experience -- but rather, because they allow us to imagine that monsters may be beaten.\n\n//Developers and writers alike want games about more things, and games by more people. We want -- and we are getting, and will keep getting -- tragicomedy, vignette, musicals, dream worlds, family tales, ethnographies, abstract art. We will get this, because we’re creating culture now. We are refusing to let anyone feel prohibited from participating. \n\n“Gamer” isn’t just a dated demographic label that most people increasingly prefer not to use. Gamers are over. That’s why they’re so mad.//\n-Leigh Alexander, [["Gamers Are Over"|http://www.gamasutra.com/view/news/224400/Gamers_dont_have_to_be_your_audience_Gamers_are_over.php]]\n\n//let's be honest - the industry has failed "gamers" because our culture has failed them. for me, being in a place like rural Ohio was so tremendously unempowering, and made me feel so much like i was so far from being able to ever influence the larger culture that i felt like i at least deserved the videogames everyone else i grew up around seemed to get to cope with all of it. that feeling, like you're "owed" media, is the default response of our culture to not being able to exercise any kind of other real autonomy or control over any other aspects of your life.//\n\n[...]\n\n//the problem is these violent impulses are self-destructive at their core. they're not actions of autonomous actors, they're culturally programmed. they're the impulses of a suicide bomber throwing himself into a crowd of people. they're deeply emotional, deeply disconnected, and deeply afraid of what's happening in the world - and that's what makes them scary, and very real. and that's why we need to see them for what they are - fear, and understand how and why they're deeply intertwined with our culture.//\n-Liz Ryerson, [["On 'Gamers' and Identity"|http://ellaguro.blogspot.com/2014/09/on-gamers-and-identity.html]]\n\n//If this Gameboy were a vampire and someone had driven a stake through its heart, that's sort of what I'm picturing here.//\n- me, to artist Kimberly Parker, September 2, 2014\n\n[[Back|the author's notes]].
Every game I make has the same starting point, which is a question I ask myself: how is this project different from the last one?\n\nThe game you just played was the one where I decided to finally attempt something approaching a traditional gamelike structure -- hence the many variables, paths, and multiple endings. It has not necessarily been calibrated for each path to be accessible in turn for each player; the idea was that two people could play the game and have very similar experiences that, when compared, had certain fundamental differences.\n\nI feel the demand for variety is made more often of interactive fiction, despite most graphical games having very little in the way of non-linear plots or, at least, plot changes beyond the cosmetic. The sense seems to be that if I am playing a graphical game, I should be happy to simply ride from set-piece to set-piece, shooting enemies or collecting geegaws; relying on text necessitates branching paths, and the more of them, the better.\n\nThe fact that most Twine games eschew these conventions was a real eye-opener for me, and part of what made me feel comfortable enough to begin writing interactive fiction.\n\nNevertheless, my general uneasiness with this sort of writing has confused a lot of players regarding my work, since they expect paths where there are none, or criticize me for not including them. And because, due to arbitrary conventions of the medium, I know their expectations are not entirely unfounded, and in order to challenge myself and grow as an artist, here I wanted to produce something a little less oppressively gloomy and single-minded than my other pieces.\n\nAssuming I've done my job correctly, what I've made is a horror game that, if it is in the least bit scary when you first play it, manages to get less frightening each subsequent time.\n\n[[Back|the author's notes]].
In the course of writing this game I realized that three of the four projects I've now released contain a sequence in which a child visits the house of a friend and something terrible happens. Despite that, nothing particularly bad has ever happened to me while visiting a friend, or during a sleepover.\n\nHowever: when I was very young, before my parents divorced, I never had any friends over. The environment of my home felt too tense, far too hostile for me to have anyone spend the night. I was afraid of what would happen if someone came into my life and saw how we lived (which, in retrospect, was not even particularly bad, so far as unhappy families go, but the emotional tenor of my home was often overwhelming to a child with my disposition). So, I usually visited friends, but never had them over to my place.\n\nWhat I enjoyed the most about visiting friends' homes -- and this was true even well after the divorce -- was seeing how those I took to be "normal" lived: clean houses with open windows, parents who talked to one another, and more videogames than I would know what to do with. Games were a precious resource, and I carefully considered which one I asked for on my birthday (in June) or for Christmas to ensure it would keep me occupied for the six months until I got the next. Visting friends gave me a chance to vicariously experience what it would be like to, say, own a PlayStation //and// a GameCube, and still get a new game every month.\n\nI fear this makes my friendships sound purely instrumental, which of course they were not. I've had many great and supportive friends. I don't know if they ever felt that my relationships with them were a cover for my keen interest in their games, but I felt the guilt anyway. In the end, I can only thank them for their generosity.\n\nMaking games roughly coincided with me beginning therapy for my anxiety, which was a problem that life and the world, up until a certain point, had trained me not to see I had.\n\nTo be perfectly accurate: making games actually preceded therapy. In attempting to tell stories that immersed a player in the thick atmosphere of mild-to-severe mental distress I've spent most of my life, I began to recognize how many of my reference points for these feelings could be traced to habits I'd learned or constructed in childhood.\n\nBoth making games and going to therapy present opportunities to return to these behaviors and the events that seemed to instantiate them. If the visit to a friend's house is something of a primal scene to me -- and the way I unconsciously returned to it again and again suggests that it is -- then this game became my attempt to acknowledge it and interrogate it more fully than I have before. That's why I chose to set it, vaguely, in 1998 or 1999.\n\nIf you want to think about it this way -- and I admit it is trite -- my games are attempts to make up for lost time: I'm inviting you into part of the idiosyncratic haunted house that functions as my mind, where the lived experience of sleepovers collides with the imagined horrors and potential catastrophes that always flourished there, unbidden.\n\nI am a single person, and not a very interesting one in most respects, but if I can leverage this bit of technology to facilitate some sort of human feeling between you and me, then I'll consider it a success.\n\n[[Back|the author's notes]].
I don't believe I ever had a friend who claimed they had an "uncle who worked for Nintendo" and yet, nevertheless, the trope has always made sense to me in its deployment as a punchline for unsubstantiated gaming gossip. Certainly I had conversations with friends that turned on similar structural logics: one of us claiming dubious knowledge about the secret workings of a game, or the future moves of a particular developer, or the games industry in general.\n\n"The uncle who works for Nintendo" on a very basic level is interesting because of how well it encapsulates the frank bullshittery of such conversations. "I have an uncle who works for Nintendo, and he says..." Let's break this down.\n\nThis is obviously something a child says. It is marked as such by its appeal to a specifically adult authority. Yet, interestingly, it is not a parental authority, but rather a sort of subjunctive adult presense -- the uncle, rather than a parent. Uncles have more interesting lives than our parents. They're proverbially eccentric, and they can work for Nintendo. There is something ghostly or fantasmatic at work here, the avuncular remainder of patriarchal authority.\n\nIn this way the knowledge becomes both authoritative and somehow illicit: it is a //secret//, something told //in confidence//, away from the purview of the central authority figure, and it is only in greatest trust that your friend now passes the word along to you.\n\nThis establishes, for the friend, a special relationship not only with the adult world but with the "gaming industry" as such. Why would children lie like this, in ways that are transparently obvious to the point that they can become self-sufficient punchlines?\n\nOn one level, it works (or worked) because it reproduces to some extent the language of gaming's enthusiast press and the fantasy of "exclusive access." Our Nintendo Powers and GameInformers wanted us to think this way about game development: it was Willy Wonka's chocolate factory, filled with incredible secrets, only to be glimpsed by a lucky few. The enthusiast magazines were our many uncles at developer X, covertly sneaking out screenshots and tid-bits and rumors for our breathless delectation.\n\nFor the friend who told blatant lies -- likely flippantly, perhaps not even fully sure why they did it -- the potential payoff was to be like one of these magazines, to become the representative of the uncle at Nintendo: an insider, authoritative, knowledgeable. It was, in short, a power play.\n\nCuriously, in reading people's reflections on weird gaming rumors they circulated when they were younger, I find a common theme: people very often repeated things they knew or at least strongly suspected to be untrue not because they fabricated the lies themselves, but because //they had been lied to about them before//.\n\nThis makes sense: it's how certain rumors managed to become so widespread despite being obviously false. And on the other hand, it suggests a symmetry between the mechanism of the "secret knowledge" of games and the mechanism by which creepypasta spread: the urban legend, the modern myth.\n\nTo lie and be believed, even regarding something small and harmless, is to hold a type of power over someone else. Thus, in a nebulous third arena, we might locate here a certain mild maliciousness: a desire to deceive others as we have been deceived, to steal for ourselves the aura of exclusive access that the friend who claimed their uncle worked at Nintendo seemed, at least for a time, to possess.\n\n[[Back|the author's notes]].
<center><font size="12">[[the uncle who works for nintendo: author's notes|the author's notes]]</center></font>
When I was younger the phrase "creepypasta" had a particular meaning. It was the name for a sort of post that appeared on 4chan, most usually, that began as the narration of some event from the poster's life and which soon veered into supernatural or at least generally surreal horror. Beyond this there wasn't much to define the content, other than the implicit idea in the nickname that the story would be saved and posted again by various other people, always hoping to introduce the story to someone who hadn't seen it yet and, perhaps, dupe the unsuspecting into taking it for "real" due to the genre's maintenance of what MR James once called, regarding the proper construction of a ghost story, "the pretense of truth."\n\nSome years later, after not keeping tabs on the community, I was surprised to find that creepypasta now meant just about anything inflected with horror that a person of a certain age encountered on the internet. My game "My Father's Long, Long Legs," released in the autumn of 2013, had no pretense of truth about it and nevertheless was often circulated as "creepypasta" or among people who considered themselves enthusiasts of the genre.\n\nAt this point I also discovered two things. First, a rather unusual fandom had grown up around creepypasta, whose consistent object of adoration was a shared pseudo-continuity in which the various monsters and villains from the stories coexisted, were friends or enemies, and had adventures (surprisingly, this included one creature I made myself, back in the dark and backward abysm of my own 4chan days). Second, by and large these were in some sense "classic" or "vintage" creepypasta, as the stories being currently produced had developed an oddly specific preoccupation with videogames and gaming culture that had not been the case my epoch of 2008.\n\nOften these stories involved cursed or somehow "evil" versions of popular games, the most famous examples here probably being Pokémon Black, the Blood Whistle, or Ben Drowned. Given the range of material earlier instances of the genre had covered, it struck me as peculiar that games would have been singled out in this way.\n\nTo paraphrase Zizek, the key to understanding a horror story is to imagine the same story but without the horror element. When we do this we can locate, on some level, the true horror: the thing that must be fantasized and fictionalized in order that it becomes a digestible, "entertaining" horror story, rather than something truly unpleasant.\n\nIf we perform this deconstruction on the many permutations of the videogame creepypasta subgenre, what happens? The story we end up with, time and again:\n\n//I bought a game, and I played it. I received a game as a gift, and I played it. I found a used game for sale, and I played it. I picked up an old game from our childhood, and I played it...//\n\nWhat these stories reveal, I think, is an underlying anxiety we have about games in general: that beneath their smiling faces and heroic poses Mario and Link are somehow //hostile// to us. That if these emblems of childhood and adolescent pleasure had their way, we would keep playing with them until it killed us.\n\nPerhaps here we can find the "pretense of truth" that seemed to otherwise go missing: there is something about games culture, its particular awareness of itself in its own moment of history, that facilitates the experience of horror at the industry's own promises of endless and repetitive play.\n\nGames, in this perspective, both loathe us, and need us.\n\n[[Back|the author's notes]].
//audio//\n(function () {\n "use strict";\n version.extensions['soundMacros'] = {\n major: 1,\n minor: 1,\n revision: 2\n };\n var p = macros['playsound'] = {\n soundtracks: {},\n handler: function (a, b, c, d) {\n var loop = function (m) {\n if (m.loop == undefined) {\n m.loopfn = function () {\n this.play();\n };\n m.addEventListener('ended', m.loopfn, 0);\n } else m.loop = true;\n m.play();\n };\n var s = eval(d.fullArgs());\n if (s) {\n s = s.toString();\n var m = this.soundtracks[s.slice(0, s.lastIndexOf("."))];\n if (m) {\n if (b == "playsound") {\n m.play();\n } else if (b == "loopsound") {\n loop(m);\n } else if (b == "pausesound") {\n m.pause();\n } else if (b == "unloopsound") {\n if (m.loop != undefined) {\n m.loop = false;\n } else if (m.loopfn) {\n m.removeEventListener('ended', m.loopfn);\n delete m.loopfn;\n }\n } else if (b == "stopsound") {\n m.pause();\n m.currentTime = 0;\n } else if (b == "fadeoutsound" || b == "fadeinsound") {\n if (m.interval) clearInterval(m.interval);\n if (b == "fadeinsound") {\n if (m.currentTime>0) return;\n m.volume = 0;\n loop(m);\n } else {\n if (!m.currentTime) return;\n m.play();\n }\n var v = m.volume;\n m.interval = setInterval(function () {\n v = Math.min(1, Math.max(0, v + 0.005 * (b == "fadeinsound" ? 1 : -1)));\n m.volume = Math.easeInOut(v);\n if (v == 0 || v == 1) clearInterval(m.interval);\n if (v == 0) {\n m.pause();\n m.currentTime = 0;\n m.volume = 1;\n }\n }, 10);\n }\n }\n }\n }\n }\n macros['fadeinsound'] = p;\n macros['fadeoutsound'] = p;\n macros['unloopsound'] = p;\n macros['loopsound'] = p;\n macros['pausesound'] = p;\n macros['stopsound'] = p;\n macros['stopallsound'] = {\n handler: function () {\n var s = macros.playsound.soundtracks;\n for (var j in s) {\n\t\tif (s.hasOwnProperty(j)) {\n s[j].pause();\n if (s[j].currentTime) {\n\t\t s[j].currentTime = 0;\n\t\t }\n\t\t}\n }\n }\n }\n var div = document.getElementById("storeArea").firstChild;\n var fe = ["ogg", "mp3", "wav", "webm"];\n while (div) {\n var b = String.fromCharCode(92);\n var q = '"';\n var re = "['" + q + "]([^" + q + "']*?)" + b + ".(ogg|mp3|wav|webm)['" + q + "]";\n k(new RegExp(re, "gi"));\n div = div.nextSibling;\n }\n\n function k(c, e) {\n do {\n var d = c.exec(div.innerHTML);\n if (d) {\n var a = new Audio();\n if (a.canPlayType) {\n for (var i = -1; i < fe.length; i += 1) {\n if (i >= 0) d[2] = fe[i];\n if (a.canPlayType("audio/" + d[2])) break;\n }\n if (i < fe.length) {\n a.setAttribute("src", d[1] + "." + d[2]);\n a.interval = null;\n macros.playsound.soundtracks[d[1]] = a;\n } else console.log("Browser can't play '" + d[1] + "'");\n }\n }\n } while (d);\n }\n}());\n\n//fullscreen//\nwindow.fullscreen = function(enter) {\n var d = document,\n i = -1, a;\n if (typeof enter != "boolean" && !enter) {\n enter = !(d.fullscreenElement || d.mozFullScreenElement || d.webkitFullscreenElement || d.msFullscreenElement);\n }\n console.log(enter);\n a = enter ? ["requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen"]\n : ["exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen"];\n enter && (d = d.documentElement);\n while(i++ < 3) {\n if (d[a[i]]) {\n d[a[i]]();\n break;\n }\n }\n};\n\n//replace macro//\n\n(function(){version.extensions.replaceMacrosCombined={major:1,minor:1,revision:4};var nullobj={handler:function(){}};function showVer(n,notrans){if(!n){return\n}n.innerHTML="";new Wikifier(n,n.tweecode);n.setAttribute("data-enabled","true");n.style.display="inline";n.classList.remove("revision-span-out");\nif(!notrans){n.classList.add("revision-span-in");if(n.timeout){clearTimeout(n.timeout)}n.timeout=setTimeout(function(){n.classList.remove("revision-span-in");\nn=null},1)}}function hideVer(n,notrans){if(!n){return}n.setAttribute("data-enabled","false");n.classList.remove("revision-span-in");\nif(n.timeout){clearTimeout(n.timeout)}if(!notrans){n.classList.add("revision-span-out");n.timeout=setTimeout(function(){if(n.getAttribute("data-enabled")=="false"){n.classList.remove("revision-span-out");\nn.style.display="none";n.innerHTML=""}n=null},1000)}else{n.style.display="none";n.innerHTML="";n=null}}function tagcontents(b,starttags,desttags,endtags,k){var l=0,c="",tg,a,i;\nfunction tagfound(i,e){for(var j=0;j<e.length;j++){if(a.indexOf("<<"+e[j],i)==i){return e[j]}}}a=b.source.slice(k);for(i=0;\ni<a.length;i++){if(tg=tagfound(i,starttags)){l++}else{if((tg=tagfound(i,desttags))&&l==0){b.nextMatch=k+i+tg.length+4;return[c,tg]\n}else{if(tg=tagfound(i,endtags)){l--;if(l<0){return null}}}}c+=a.charAt(i)}return null}var begintags=[];var endtags=[];function revisionSpanHandler(g,e,f,b){var k=b.source.indexOf(">>",b.matchStart)+2,vsns=[],vtype=e,flen=f.length,becomes,c,cn,m,h,vsn;\nfunction mkspan(vtype){h=insertElement(m,"span",null,"revision-span "+vtype);h.setAttribute("data-enabled",false);h.style.display="none";\nh.tweecode="";return h}if(this.shorthand&&flen){while(f.length>0){vsns.push([f.shift(),(this.flavour=="insert"?"gains":"becomes")])\n}}else{if(this.flavour=="insert"||(this.flavour=="continue"&&this.trigger=="time")){vsns.push(["","becomes"])}}if(this.flavour=="continue"&&flen){b.nextMatch=k+b.source.slice(k).length;\nvsns.push([b.source.slice(k),vtype])}else{becomes=["becomes","gains"];c=tagcontents(b,begintags,becomes.concat(endtags),endtags,k);\nif(c&&endtags.indexOf(c[1])==-1){while(c){vsns.push(c);c=tagcontents(b,begintags,becomes,endtags,b.nextMatch)}c=tagcontents(b,begintags,["end"+e],endtags,b.nextMatch)\n}if(!c){throwError(g,"can't find matching end"+e);return}vsns.push(c);if(this.flavour=="continue"){k=b.nextMatch;b.nextMatch=k+b.source.slice(k).length;\nvsns.push([b.source.slice(k),""])}}if(this.flavour=="remove"){vsns.push(["","becomes"])}cn=0;m=insertElement(g,"span",null,e);\nm.setAttribute("data-flavour",this.flavour);h=mkspan("initial");vsn=vsns.shift();h.tweecode=vsn[0];showVer(h,true);while(vsns.length>0){if(vsn){vtype=vsn[1]\n}vsn=vsns.shift();h=mkspan(vtype);h.tweecode=vsn[0]}if(typeof this.setup=="function"){this.setup(m,g,f)}}function quantity(m){return(m.children.length-1)+(m.getAttribute("data-flavour")=="remove")\n}function revisionSetup(m,g,f){m.className+=" "+f[0].replace(" ","_")}function keySetup(m,g,f){var key=f[0];m.setEventListener("keydown",function l(e){var done=!revise("revise",m);\nif(done){m.removeEventListener("keydown",l)}})}function timeSetup(m,g,f){function cssTimeUnit(s){if(typeof s=="string"){if(s.slice(-2).toLowerCase()=="ms"){return Number(s.slice(0,-2))||0\n}else{if(s.slice(-1).toLowerCase()=="s"){return Number(s.slice(0,-1))*1000||0}}}throwError(g,s+" isn't a CSS time unit");\nreturn 0}var tm=cssTimeUnit(f[0]);setTimeout(function timefn(){var done=!revise("revise",m);if(!done){setTimeout(timefn,tm)\n}},tm)}function hoverSetup(m){var fn,noMouseEnter=(document.head.onmouseenter!==null),m1=m.children[0],m2=m.children[1];if(!m1||!m2){return\n}m1.onmouseenter=function(e){if(this.getAttribute("data-enabled")!="false"){revise("revise",this.parentNode)}};m2.onmouseleave=function(e){if(this.getAttribute("data-enabled")!="false"){revise("revert",this.parentNode)\n}};if(noMouseEnter){fn=function(n){return function(e){if(!event.relatedTarget||(event.relatedTarget!=this&&!(this.compareDocumentPosition(event.relatedTarget)&Node.DOCUMENT_POSITION_CONTAINED_BY))){this[n]()\n}}};m1.onmouseover=fn("onmouseenter");m2.onmouseout=fn("onmouseleave")}m=null}function mouseSetup(m){var evt=(document.head.onmouseenter===null?"onmouseenter":"onmouseover");\nm[evt]=function(){var done=!revise("revise",this);if(done){this[evt]=null}};m=null}function linkSetup(m,g,f){var l=Wikifier.createInternalLink(),p=m.parentNode;\nl.className="internalLink replaceLink";p.insertBefore(l,m);l.insertBefore(m,null);l.onclick=function(){var p,done=false;if(m&&m.parentNode==this){done=!revise("revise",m);\nscrollWindowTo(m)}if(done){this.parentNode.insertBefore(m,this);this.parentNode.removeChild(this)}};l=null}function visitedSetup(m,g,f){var i,done,shv=state.history[0].variables,os="once seen",d=(m.firstChild&&(this.flavour=="insert"?m.firstChild.nextSibling:m.firstChild).tweecode);\nshv[os]=shv[os]||{};if(d&&!shv[os].hasOwnProperty(d)){shv[os][d]=1}else{for(i=shv[os][d];i>0&&!done;i--){done=!revise("revise",m,true)\n}if(shv[os].hasOwnProperty(d)){shv[os][d]+=1}}}[{name:"insert",flavour:"insert",trigger:"link",setup:linkSetup},{name:"timedinsert",flavour:"insert",trigger:"time",setup:timeSetup},{name:"insertion",flavour:"insert",trigger:"revisemacro",setup:revisionSetup},{name:"later",flavour:"insert",trigger:"visited",setup:visitedSetup},{name:"keyinsert",flavour:"insert",trigger:"key",setup:keySetup},{name:"replace",flavour:"replace",trigger:"link",setup:linkSetup},{name:"timedreplace",flavour:"replace",trigger:"time",setup:timeSetup},{name:"mousereplace",flavour:"replace",trigger:"mouse",setup:mouseSetup},{name:"hoverreplace",flavour:"replace",trigger:"hover",setup:hoverSetup},{name:"revision",flavour:"replace",trigger:"revisemacro",setup:revisionSetup},{name:"keyreplace",flavour:"replace",trigger:"key",setup:keySetup},{name:"timedremove",flavour:"remove",trigger:"time",setup:timeSetup},{name:"mouseremove",flavour:"remove",trigger:"mouse",setup:mouseSetup},{name:"hoverremove",flavour:"remove",trigger:"hover",setup:hoverSetup},{name:"removal",flavour:"remove",trigger:"revisemacro",setup:revisionSetup},{name:"once",flavour:"remove",trigger:"visited",setup:visitedSetup},{name:"keyremove",flavour:"remove",trigger:"key",setup:keySetup},{name:"continue",flavour:"continue",trigger:"link",setup:linkSetup},{name:"timedcontinue",flavour:"continue",trigger:"time",setup:timeSetup},{name:"mousecontinue",flavour:"continue",trigger:"mouse",setup:mouseSetup},{name:"keycontinue",flavour:"continue",trigger:"key",setup:keySetup},{name:"cycle",flavour:"cycle",trigger:"revisemacro",setup:revisionSetup},{name:"mousecycle",flavour:"cycle",trigger:"mouse",setup:mouseSetup},{name:"timedcycle",flavour:"cycle",trigger:"time",setup:timeSetup},{name:"keycycle",flavour:"replace",trigger:"key",setup:keySetup}].forEach(function(e){e.handler=revisionSpanHandler;\ne.shorthand=(["link","mouse","hover"].indexOf(e.trigger)>-1);macros[e.name]=e;macros["end"+e.name]=nullobj;begintags.push(e.name);\nendtags.push("end"+e.name)});function insideDepartingSpan(elem){var r=elem.parentNode;while(!r.classList.contains("passage")){if(r.classList.contains("revision-span-out")){return true\n}r=r.parentNode}}function reviseAll(rt,rname){var rall=document.querySelectorAll(".passage [data-flavour]."+rname),ret=false;\nfor(var i=0;i<rall.length;i++){if(!insideDepartingSpan(rall[i])){ret=revise(rt,rall[i])||ret}}return ret}function revise(rt,r,notrans){var ind2,curr,next,ind=-1,rev=(rt=="revert"),rnd=(rt.indexOf("random")>-1),fl=r.getAttribute("data-flavour"),rc=r.childNodes,cyc=(fl=="cycle"),rcl=rc.length-1;\nfunction doToGainerSpans(n,fn){for(var k=n-1;k>=0;k--){if(rc[k+1].classList.contains("gains")){fn(rc[k],notrans)}else{break\n}}}for(var k=0;k<=rcl;k++){if(rc[k].getAttribute("data-enabled")=="true"){ind=k}}if(rev){ind-=1}curr=(ind>=0?rc[ind]:(cyc?rc[rcl]:null));\nind2=ind;if(rnd){ind2=(ind+(Math.floor(Math.random()*rcl)))%rcl}next=((ind2<rcl)?rc[ind2+1]:(cyc?rc[0]:null));var docurr=(rev?showVer:hideVer);\nvar donext=(rev?hideVer:showVer);var currfn=function(){if(!(next&&next.classList.contains("gains"))||rnd){docurr(curr,notrans);\ndoToGainerSpans(ind,docurr,notrans)}};var nextfn=function(){donext(next,notrans);if(rnd){doToGainerSpans(ind2+1,donext,notrans)\n}};if(!rev){currfn();nextfn()}else{nextfn();currfn()}return(cyc?true:(rev?(ind>0):(ind2<rcl-1)))}macros.revert=macros.revise=macros.randomise=macros.randomize={handler:function(a,b,c){var l,rev,rname;\nfunction disableLink(l){l.style.display="none"}function enableLink(l){l.style.display="inline"}function updateLink(l){if(l.className.indexOf("random")>-1){enableLink(l);\nreturn}var rall=document.querySelectorAll(".passage [data-flavour]."+rname),cannext,canprev,i,ind,r,fl;for(i=0;i<rall.length;\ni++){r=rall[i],fl=r.getAttribute("data-flavour");if(insideDepartingSpan(r)){continue}if(fl=="cycle"){cannext=canprev=true\n}else{if(r.firstChild.getAttribute("data-enabled")==!1+""){canprev=true}if(r.lastChild.getAttribute("data-enabled")==!1+""){cannext=true\n}}}var can=(l.classList.contains("revert")?canprev:cannext);(can?enableLink:disableLink)(l)}function toggleText(w){w.classList.toggle(rl+"Enabled");\nw.classList.toggle(rl+"Disabled");w.style.display=((w.style.display=="none")?"inline":"none")}var rl="reviseLink";if(c.length<2){throwError(a,b+" macro needs 2 parameters");\nreturn}rname=c.shift().replace(" ","_");l=Wikifier.createInternalLink(a,null);l.className="internalLink "+rl+" "+rl+"_"+rname+" "+b;\nvar v="";var end=false;var out=false;if(c.length>1&&c[0][0]=="$"){v=c[0].slice(1);c.shift()}switch(c[c.length-1]){case"end":end=true;\nc.pop();break;case"out":out=true;c.pop();break}var h=state.history[0].variables;for(var i=0;i<c.length;i++){var on=(i==Math.max(c.indexOf(h[v]),0));\nvar d=insertElement(null,"span",null,rl+((on)?"En":"Dis")+"abled");if(on){h[v]=c[i];l.setAttribute("data-cycle",i)}else{d.style.display="none"\n}insertText(d,c[i]);l.appendChild(d)}l.onclick=function(){reviseAll(b,rname);var t=this.childNodes,u=this.getAttribute("data-cycle")-0,m=t.length,n,lall,i;\nif((end||out)&&u==m-(end?2:1)){if(end){n=this.removeChild(t[u+1]);n.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,this)\n}else{this.parentNode.removeChild(this);return}}else{toggleText(t[u]);u=(u+1)%m;if(v){h[v]=c[u]}toggleText(t[u]);this.setAttribute("data-cycle",u)\n}lall=document.getElementsByClassName(rl+"_"+rname);for(i=0;i<lall.length;i++){updateLink(lall[i])}};l=null}};macros.mouserevise=macros.hoverrevise={handler:function(a,b,c,d){var endtags=["end"+b],evt=(window.onmouseenter===null?"onmouseenter":"onmouseover"),t=tagcontents(d,[b],endtags,endtags,d.source.indexOf(">>",d.matchStart)+2);\nif(t){var rname=c[0].replace(" ","_"),h=insertElement(a,"span",null,"hoverrevise hoverrevise_"+rname),f=function(){var done=!reviseAll("revise",rname);\nif(b!="hoverrevise"&&done){this[evt]=null}};new Wikifier(h,t[0]);if(b=="hoverrevise"){h.onmouseover=f;h.onmouseout=function(){reviseAll("revert",rname)\n}}else{h[evt]=f}h=null}}};macros.instantrevise={handler:function(a,b,c,d){reviseAll("revise",c[0].replace(" ","_"))}};macros.endmouserevise=nullobj;\nmacros.endhoverrevise=nullobj}());\n\n//Backslashes for linebreaks//\n(function(){\nvar bs = String.fromCharCode(92);\nWikifier.formatters.unshift({\n name: "continuedLine",\n match: bs+bs+"s",\n handler: function(a) {\n a.nextMatch = a.matchStart+3;\n }\n});\n}());\n\n//GoTo//\nversion.extensions.timedgotoMacro={major:1,minor:1,revision:0};macros["goto"]=macros["timedgoto"]={timer:null,handler:function(a,b,c,d){\nfunction cssTimeUnit(s){if(typeof s=="string"){if(s.slice(-2).toLowerCase()=="ms"){return Number(s.slice(0,-2))||0;\n}else{if(s.slice(-1).toLowerCase()=="s"){return Number(s.slice(0,-1))*1000||0;}}}throwError(a,s+" isn't a CSS time unit");\nreturn 0;}var t,d,m,s;t=c[c.length-1];d=d.fullArgs();m=0;if(b!="goto"){d=d.slice(0,d.lastIndexOf(t));\nm=cssTimeUnit(t);}d=eval(Wikifier.parse(d));if(d+""){if(this.timer){clearTimeout(this.timer);\n}s=state.history[0].passage.title;this.timer=setTimeout(function(){if(state.history[0].passage.title==s){state.display(d,a);\n}},m);}}};\n\n//Timed GoTo//\nversion.extensions.timedgotoMacro={major:1,minor:2,revision:0};\nmacros["goto"]=macros.timedgoto={timer:null,handler:function(a,b,c,d){function cssTimeUnit(s){if(typeof s=="string"){if(s.slice(-2).toLowerCase()=="ms"){return +(s.slice(0,-2))||0\n}else{if(s.slice(-1).toLowerCase()=="s"){return +(s.slice(0,-1))*1000||0\n}}}throwError(a,s+" isn't a CSS time unit");return 0}var t,d,m,s;\nt=c[c.length-1];d=d.fullArgs();m=0;if(b!="goto"){d=d.slice(0,d.lastIndexOf(t));\nm=cssTimeUnit(t)}d=eval(Wikifier.parse(d));if(d+""&&state&&state.init){if(macros["goto"].timer){clearTimeout(macros["goto"].timer)\n}s=state.history[0].passage.title;macros["goto"].timer=setTimeout(function(){if(state.history[0].passage.title==s){state.display(d,a)\n}},m)}}};\n\n//Cycling Link//\nversion.extensions.cyclinglinkMacro={major:3,minor:3,revision:0};\nmacros.cyclinglink={handler:function(a,b,c){var rl="cyclingLink";\nfunction toggleText(w){w.classList.remove("cyclingLinkInit");\nw.classList.toggle(rl+"Enabled");w.classList.toggle(rl+"Disabled");\nw.style.display=((w.style.display=="none")?"inline":"none")}switch(c[c.length-1]){case"end":var end=true;\nc.pop();break;case"out":var out=true;c.pop();break}var v="";if(c.length&&c[0][0]=="$"){v=c[0].slice(1);\nc.shift()}var h=state.history[0].variables;if(out&&h[v]===""){return\n}var l=Wikifier.createInternalLink(a,null);l.className="internalLink cyclingLink";\nl.setAttribute("data-cycle",0);for(var i=0;i<c.length;i++){var on=(i==Math.max(c.indexOf(h[v]),0));\nvar d=insertElement(null,"span",null,"cyclingLinkInit cyclingLink"+((on)?"En":"Dis")+"abled");\nif(on){h[v]=c[i];l.setAttribute("data-cycle",i)}else{d.style.display="none"\n}insertText(d,c[i]);if(on&&end&&i==c.length-1){l.parentNode.replaceChild(d,l)\n}else{l.appendChild(d)}}l.onclick=function(){var t=this.childNodes;\nvar u=this.getAttribute("data-cycle")-0;var m=t.length;toggleText(t[u]);\nu=(u+1);if(!(out&&u==m)){u%=m;if(v){h[v]=c[u]}}else{h[v]=""}if((end||out)&&u==m-(end?1:0)){if(end){var n=this.removeChild(t[u]);\nn.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,this)\n}else{this.parentNode.removeChild(this);return}return}toggleText(t[u]);\nthis.setAttribute("data-cycle",u)}}};
the uncle who works for nintendo: author's notes
michael lutz
//replace css//\n\n.revision-span-in {\n\topacity: 0;\n}\n.revision-span:not(.revision-span-out) {\n\ttransition: 1s; -webkit-transition: 1s;\n}\n.revision-span-out {\n\tposition:absolute;\n\topacity: 0;\n}\n\nbody {\n /* Remove default styles */\n background-color: black;\n margin: 10% 0 0 0;\n font-size: 100%;\n /* Used to center the box */\n text-align: center;\n}\n:-webkit-full-screen { background-color: transparent; }\n:-moz-full-screen { background-color: transparent; }\n:-ms-fullscreen { background-color: transparent; }\n:fullscreen { background-color: transparent; }\n\n#passages {\n /* Box background (white with 70% opacity) */\n background-color: rgba(255, 255, 255, 0.7);\n\n /* Border */\n border: 2px transparent;\n border-radius: 7px;\n outline: none;\n border-color: white;\n box-shadow: 0 0 20px white;\n\n /* Box width */\n width: 60%;\n\n /* Center the box */\n display: inline-block;\n min-height: 40%;\n margin:auto;\n margin-top: -5%;\n margin-bottom: 5%;\n padding: 0px;\n}\n\n.passage {\n margin: 0px;\n /* Inner margin within the box */\n padding: 2em;\n\n /* Text formatting */\n font-family: 'Lucida Console', Monaco, monospace;\n color: black;\n font-size: 120%;\n font-weight: normal;\n text-align:left;\n}\n\n/* No sidebar */\n#sidebar {\n display:none;\n}\n\n/* Links */\na.internalLink, a.externalLink {\n color: DarkRed;\n font-weight: bold;\n}\na.internalLink:hover, a.externalLink:hover {\n color: FireBrick;\n text-decoration: none;\n}\n\n/* Shrink the page when viewed on devices with a low screen width */\n@media screen and (max-width: 960px) {\n .passage { font-size: 90%;}\n #passages { width: 70%; }\n}\n@media screen and (max-width: 840px) {\n .passage { font-size: 87.5%; }\n #passages { width: 80%; }\n}\n@media screen and (max-width: 720px) {\n .passage { font-size: 75%; }\n #passages { width: 90%; }\n}\n