Apologies! You are using an outdated browser which lacks required capabilities. Please upgrade your browser to improve your experience.

Initializing. Please wait…

// Trigger browser fullscreen mode. See twinery.org/forum/discussion/comment/15038\n\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 a = ["requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen"];\n enter && (d = d.documentElement);\n while(i++ < 3) {\n if (d[a[i]]) {\n d[a[i]]();\n break;\n }\n }\n}
<<set $blood = 3>>\nSo a guy in a pink button-down shirt and a Red Sox cap led the charge across the street. They were going to invade the tower, and presumably [[vanquish|Blood]] the unholy woman. Red Sox was carrying a [[bat|Bat]].
<div class="actor"><div id="lojka"></div></div>\n<<set $leftReplace = 'You are '>>\n<<set $rightReplace = 'you must '>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n\tvar sndLojkaMusic = new Howl({src: ['lojkamusic.ogg'], loop: true});\n\tsndLojkaMusic.volume(0);\n\tsndLojkaMusic.play();\n\tsndLojkaMusic.fade(0, 0.5, 20000); \n var t = theaterJS({\n minSpeed: { erase: 30, type: 50 },\n maxSpeed: { erase: 100, type: 300 }\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .7\n }), t.addScene(2000, "lojka: I am Ms", -7, "You are Ms. Lojka,", 200, " my precious,", 300, " and such has always been the price we mu", -5, "you must pay for living.", 5000), \n\t\tt.addScene("lojka: "),\n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka8 Repeat');\n\t\t\tdone();\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("lojka1.jpg")');\n\t$('#bgmask2').hide().delay(19000).fadeIn(5000);\n<</script>>\n\n<div class="typed-speed100-delay1500">\n<span class="title">Ms. Lojka^2000</span>\n<span class="subtitle">or: In Despair to Will to Be Oneself</span>\n^2000<span class="byline">By Jordan Magnuson^2000</span>\n<span class="illustratedbyline">Illustrated by Pavel Tymoshenko</span>\n</div>\n\n<div id="version">version $version<br/>[[Sound Credits]]</div>\n\n<<timed 24s>>\n<span id="beginbutton" class="fadein button">\n<<click "Begin">><<script>>\n$.when( fullscreen() ).done( state.play("Lojka") );\n<</script>><</click>>\n</span>\n<</timed>>\n\n<<script>>\npostdisplay.fadeInVersion = function() {\n\t$('#version').hide().delay(25000).fadeIn(1000);\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '-1');\n\t$('#bgmask1').css('z-index', '0');\n\t$('#bgmask1').css('background-image', 'url("ponies.jpg")');\n\t$('#bgmask1').hide();\n<</script>>\n<div id="choices">\n<div class="choice">[[Ask to go back to the beginning|Lojka4]]</div>\n<div class="choice"><<click "Hang up the phone">><<script>>\n\tif (confirm('Close the browser, and leave this nightmare forever?')) {\n\t\tsndNeon.stop();\n\t\tsndWhispers.stop();\n\t\tsndCannon.stop();\n\t\tsndKey01.stop();\n\t\tsndKey02.stop();\n\t\tsndKey03.stop();\n\t\tsndKey04.stop();\n\t\tsndKey05.stop();\n\t\tsndKey06.stop();\n\t\tsndKey07.stop();\n\t\tsndKey08.stop();\n\t\t$('body').removeClass('neon-flicker');\n\t\t$('body').stop(true,true);\n\t\t$('body').fadeTo(0,1);\n\t\tState.play('Hang Up');\n\t}\n\telse {\n\t\tsndCannon.play();\n\t}\n<</script>><</click>></div>\n</div>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n\t$('#choices').hide();\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, "lojka: You have made your choices,", 80, " my dear,", 100, " just as I have made mine,", 80, " and you know,", 50, " as I do,", 100, " that all of this has happened already.", 1000, " Or would you like again to try and change the past?", 800, " To go back and choose your bright things, and your ponies?", function (done) {$('#bgmask1').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);sndNeon.play();done()}, 1000), \n\t\tt.addScene(function (done) {\n\t\t\tsndWhisper04.play();\n\t\t\t$('#choices').fadeIn(5000);\n\t\t\tdone();\n\t\t }),\t\t\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '0');\n\t$('#bgmask1').css('z-index', '-1');\n\t$('#bgmask2').css('background-image', 'url("babel.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, "lojka: Have you forgotten what sort of bricks you used to build this tower,", 80, " and why I built", -7, "you built it here in this great teeming city?", 1500, " Or do you still tell yourself that it was an African king who built Babel"), \n\t\tt.addScene(function (done) {\n\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);\n\t\t\tsndNeon.play();\n\t\t\tdone();\n\t\t }),\t\t\n\t\tt.addScene("?", 2000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka3');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\tneonSign();\n\t$('#bgmask1')\n\t .delay(3000)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("tower.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(600)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("lamb.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(600)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("rasputin.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("ponies.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("babel.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("heart.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("lojka2.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tsndScream01.play();\n\t\tplayRandomGlitchSound(500);\n\t\t$(this).css('background-image', 'url("lojka1.jpg")').fadeIn(0).fadeOut(10000); \n\t\tnext(); \n\t })\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n\tsetTimeout(function() { \n\t\tsndWhispers.play();\n\t\tsndWhispers.fade(0, 0.6, 10000); \n\t}, 16000);\n\t$('.passage').hide();\n\t$('.passage').delay(18000).fadeIn(0);\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .78,\n speed: .9\n }), t.addScene(20000, "lojka: Dearie,", 1000, " dearie.", 1000, " And now,", 100, " after choosing to pick up the phone,", 100, " you would silence poor old Ms. Lojka because you don't like what she has to say?", 1e3, " You would make a mockery of ten million years of suffering because you are too timid to take responsibility for the means of your own existence?", 1500), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka2');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '-1');\n\t$('#bgmask1').css('z-index', '0');\n\t$('#bgmask1').css('background-image', 'url("lamb.jpg")');\n\t$('#bgmask1').hide();\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, "lojka: So throw away your camera my dear—", 500, "you won't be needing it.", 1200, " Go fetch us a lamb.", function (done) {$('#bgmask1').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);sndNeon.play();done()}, 1000, " Rip off its hooves and dip them in the blood of any of New York's dying urchins,", 80, " or the blood of the peasants of Russia;", 200, " dip them in Matt's blood,", 100, " or in Rasputin's.", 800, " Then dress up your tower till the blood flows like rivers between its crevices,", 100, " and crimson pours forth from its windows;", 400, " till the earth itself gives way before you,", 250, " and your dark,", 80, " wet foundations are restored.", 4000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka8');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '0');\n\t$('#bgmask1').css('z-index', '-1');\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, function (done) {$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);sndNeon.play();done()}, "lojka: Our tower will stand as it has always stood,", 80, " dearie,", 100, " because you are still here,", 100, " still talking to poor old Ms. Lojka;", 1000, " because you have never once been able to hang up that phone.", 2000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka7');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '-1');\n\t$('#bgmask1').css('z-index', '0');\n\t$('#bgmask1').css('background-image', 'url("rasputin.jpg")');\n\t$('#bgmask1').hide();\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, "lojka: Do you still tell mysel", -5, "yourself it was", function (done) {$('#bgmask1').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);sndNeon.play();done()}, " Rasputin who fed on the peasants of Russia?", 2000, " But tell me,", 100, " my sweet—", 600, "where are your friends who used to walk these streets and tend the delis?", 800, " Tell me,", 100, " where is Matt,", 200, " the nowhere king?", 2000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka6');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '0');\n\t$('#bgmask1').css('z-index', '-1');\n\t$('#bgmask2').css('background-image', 'url("lojka2.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(1000, "lojka: My poor sweet dear.", 1000, " Like old Ms. Lojka you would talk to myself an", -9, " yourself,", 100, " and tell yourself a story of your past and future,", 80, " and of how you can change them.", 1200, " But Ms. Lojka has already been there.", 1000, " Or where do you think I found these gargoyle wings?", function (done) {$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);sndNeon.play();done()}, 1500, " Where do you think you found yours?", 2000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka5');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>
<<script>>\n$('#bgmask1').fadeOut(100).fadeIn(0).fadeOut(100);\n<</script>>\n\n[[Babies|Chicks]]
<<script>>\n\t$('#ui-bar').css('display', 'block');\n<</script>>\n\n[[Title]]\n[[Lojka]]\n[[Kills Things]]\n[[Rasputin]]\n[[Made It]]\n[[Scout]]\n[[Babel]]\n[[New York]]\n[[Soul]]\n[[Favor]]\n[[Understood2]]\n[[Lojka1]]\n[[Lojka2]]\n[[Lojka3]]\n[[Lojka4]]\n[[Lojka5]]\n[[Lojka6]]\n[[Lojka7]]\n[[Lojka8]]\n[[Hang Up]]\n\nversion $version
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\n\tvar startDelay = 3000;\n\tvar endDelay = 6000;\n\n\t$('#bgmask1').hide();\n\t$('#bgmask2').hide();\n\t$('body').prepend('<div id="document-body-middle"><div id="document-body-top"></div></div><div id="top-repeat"><div id="top-left"></div><div id="top-right"></div></div><div id="anonymous-sparrow"></div><div id="anonymous-sparrow-tag"></div>');\n\t$('#anonymous-sparrow').hide().delay(startDelay).slideDown(1500);\n\t$('#anonymous-sparrow-tag').hide().delay(startDelay + 1000).fadeIn(500).delay(2000).fadeOut(500);\n\n\t$('body').removeClass('neon-flicker');\n\t$('body').stop(true,true);\n\t$('body').fadeIn(0);\n\npostdisplay.sceneSetup = function(sceneSetup) {\n\t$('body').removeClass('neon-flicker');\n\t$('body').stop(true,true);\n\t$('body').fadeIn(0);\n\t$('#lojka').hide().delay(startDelay + 2000).fadeIn(200);\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 500\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: 0.7,\n speed: 0.8\n }); \n\t\tt.addScene(startDelay + 7000, "lojka: I heard a scream as I walked from the bus stop to my job today,", 100, " and a man fell out of the sky onto a mini cooper that was parked in front of Barnes & Noble.", 1200, " Shattered the windshield.", 700, " Apparently a suicide.", 1000, " I'm not sure, because I didn't stop to look—", 1000, "just clutched my camera and kept on walking.", 4000, " One day that tower's going to fall."); \t\n\t\tt.addScene(function (done) {\n\t\t\t$('#anonymous-sparrow').delay(endDelay).slideUp(1500);\n\t\t\tsetTimeout(function() { \n\t\t\t\t$('#lojka').css('background-image', 'none');\n\t\t\t}, endDelay + 1000);\n\t\t\tdone();\n\t\t });\n};\n<</script>>
<<set $blood = 1>>\n<<script>>\n\t$('#bgmask2').css('background-image', 'url("lamb.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n\nThey say she [[kills things|Blood]] up there. Babies... Chicks... everything that's [[innocent|Babies]] and [[pure|Babies]]. Two weeks ago one of the Subway employees found a dead lamb on the sidewalk in front of their--whatever you call Subways. They aren't shops, or restaurants. Delicatessen maybe. Yeah, [[delicatessen|Lamb]].
<<set $essence = 1>>\nIt was a big freakin tower built by some [[African king|King]] thousands of years ago. He wanted to have a [[look at heaven|Essence]], so he thought he'd build himself a ten-thousand-foot [[ziggurat|Ziggurat]].
<<script>>\n\t$('#bgmask2').css('background-image', 'url("lojka1.jpg")');\n\t$('#bgmask2').hide().delay(3000).fadeIn(5000);\n\tsetTimeout(function() { \n\t\tsndWhisper01.play();\n\t}, 3000);\n<</script>>\n\nThe reason I want to get a photo of that tower falling is because [[I built it|Built It]].
Ms. Lojka
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $shadows eq 1>>\n[[A circle, a square, a string, a thought|Central Park]].\n<<endif>>\n<<if $shadows gte 2>>\n[[A circle, a square, a string, a thought. To be real yet weightless and casting no shadows|Favor]].\n<<endif>>\n\n\n
<<set $blood = 4>>\nI learned later, from the [[obituary|Bam]], that the bat was called "[[The Nowhere King|Blood]]" and was given to Matt (that was the guy's name) by his grandfather on Matt's ninth birthday. Strange name for a bat, if you ask me.
That's right: I built that tower [[stone by stone|View]], brick by scorching brick, till it was [[two-hundred feet high|View]], standing for all to see in the heart of New York.
<<script>>\npostdisplay.hideChoices = function(e) {\t\n\t$('#choices').hide();\n}\n<</script>>\n<div class="typed-speed20-delay2000">Ms. Lojka called again today.</div>\n\n<div id="choices">\n<div class="choice">[[I answered the phone|Hear]]</div>\n<div class="choice"><<click "I threw the phone out the window">><<script>>\n\tif (confirm('Close the browser and leave this story forever?')) {\n\t\tState.play('Hang Up');\n\t}\n<</script>><</click>></div>\n</div>
<<click "Begin">><<script>>\nplayRandomGlitchSound(2000);\n<</script>><</click>>
<<set $vision = 1>>\n\nSome say it was built by the Dutch in the [[late sixteen-twenties|Date]], when the city was still called New Amsterdam; others say it's more recent, but fail to give any dates. The craziest speculators maintain that it harkens back to a more ancient age: that the tower is New York's own [[Stonehenge|Vision]].
<<set $blood = 5>>\nSee, here's the thing: Matt never made it across the street. He turned for a second to beckon his followers, and bam--he was down. A drunk cab driver, seemingly out of nowhere, [[splattered him|Blood]] across the pavement. The rally lost momentum after that, and everybody left.
<<script>>\n$('#bgmask1').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).fadeIn(0);\n<</script>>\n\n[[Chicks|Lamb]]
<<script>>\n\t$('#bgmask2').css('background-image', 'url("lojka2.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n<<set $servant = 2>>\nBut when it was finished, and I was preparing to move in, a woman from the Bronx approached me and said that the tower was hers, and she was going to live up there and [[kill things|Servant]] in her spare time, and I had better not try and [[interfere|Interfere]]. She had big plans to stink up the whole city.
// Add a div beneath body that we will use to handle background images and transitions.\n$('body').prepend('<div id="bgmask1"></div><div id="bgmask2"></div>');\n\n// Favicon\n;(function () {\n\tvar favicon = document.createElement("link");\n\tfavicon.rel = "shortcut icon";\n\tfavicon.href = "favicon.ico";\n\tdocument.head.appendChild(favicon);\n}());\n\n// Preloading\n$('body').prepend('<div id="preload-01"></div><div id="preload-02"></div><div id="preload-03"></div><div id="preload-04"></div><div id="preload-05"></div><div id="preload-06"></div><div id="preload-07"></div><div id="preload-08"></div><div id="preload-09"></div><div id="preload-10"></div><div id="preload-11"></div><div id="preload-12"></div><div id="preload-13"></div><div id="preload-14"></div>');
Close your browser window to continue.\n\n<<script>>\npostdisplay.stopFlash = function() {\n\t$('.super-outer-passage-wrapper').stop(true,true);\n\t$('.super-outer-passage-wrapper').fadeTo(0,0);\n};\n<</script>>
<<script>>\n\t$('#bgmask1').hide();\n\t$('#bgmask2').hide();\n\t$('body').prepend('<div id="document-body-middle"><div id="document-body-top"></div></div><div id="top-repeat"><div id="top-left"></div><div id="top-right"></div></div>');\n<</script>>\n\nSome text.
WARNING: the following game contains depictions of violence (both graphical and textual) and flashing images and sounds. It is not suitable for children. \n\n<span class="button">[[Continue|Title]]</span>
<<script>>\npostdisplay.hideChoices = function(hideChoices) {\t\n\t$('#choices').hide();\n\tdelete postdisplay[hideChoices];\n}\n<</script>>\n<div class="typed-speed20-delay1000">She said she'd kill more people if I didn't do as she asked.</div><div id="choices">\n<div class="choice"><<click "I hung up the phone">><<script>>\n\tif (confirm('Close the browser, and leave this nightmare forever?')) {\n\t\tsndWhisper02.stop();\n\t\tsndCannon.stop();\n\t\tsndKey01.stop();\n\t\tsndKey02.stop();\n\t\tsndKey03.stop();\n\t\tsndKey04.stop();\n\t\tsndKey05.stop();\n\t\tsndKey06.stop();\n\t\tsndKey07.stop();\n\t\tsndKey08.stop();\n\t\t$('body').removeClass('neon-flicker');\n\t\t$('body').stop(true,true);\n\t\t$('body').fadeTo(0,1);\n\t\tState.play('Hang Up');\n\t}\n\telse {\n\t\tsndCannon.play();\n\t}\n<</script>><</click>></div>\n<div class="choice"><<choice [[I waited to hear what she'd ask for|Hear]]>></div>\n</div>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').stop().hide();\n<</script>>\n<<script>>\npostdisplay["toggleBackground"] = function (toggleBackground) {\n\t$( "a.togglebackground" ).click(function(event) {\n\t\tevent.preventDefault();\n\t\t$( "#bgmask2" ).fadeToggle(0);\n\t\t$(this).stop().fadeTo(0, 0);\n\t\tstate.active.variables.endclicks -= 1;\n\t\tif (state.active.variables.endclicks <= 0) {\n\t\t\tsetTimeout(function() {\n\t\t\t\tState.play('Fake End')\n\t\t\t}, 4000);\n\t\t}\n\t});\n};\n<</script>>\n<<set $endclicks = 6>>\n\n<<if $endhide neq 1>><a class="togglebackground">One</a>\n<<else>><a style="opacity:0;" class="togglebackground">One</a>\n<</if>>\n\n<<if $endhide neq 2>><a class="togglebackground">day</a>\n<<else>><a style="opacity:0;" class="togglebackground">day</a>\n<</if>>\n\n<<if $endhide neq 3>><a class="togglebackground">that</a>\n<<else>><a style="opacity:0;" class="togglebackground">that</a>\n<</if>>\n\n<<if $endhide neq 4>><a class="togglebackground">tower's</a>\n<<else>><a style="opacity:0;" class="togglebackground">tower's</a>\n<</if>>\n\n<<if $endhide neq 5>><a class="togglebackground">going</a>\n<<else>><a style="opacity:0;" class="togglebackground">going</a>\n<</if>>\n\n<<if $endhide neq 6>><a class="togglebackground">to</a>\n<<else>><a style="opacity:0;" class="togglebackground">to</a>\n<</if>>\n\n<<if $endhide neq 7>><a class="togglebackground">fall.</a>\n<<else>><a style="opacity:0;" class="togglebackground">fall.</a>\n<</if>>\n
/*! howler.js v2.0.0-beta10 | (c) 2013-2016, James Simpson of GoldFire Studios | MIT License | howlerjs.com */\n!function(){"use strict";function e(){try{"undefined"!=typeof AudioContext?o=new AudioContext:"undefined"!=typeof webkitAudioContext?o=new webkitAudioContext:t=!1}catch(e){t=!1}if(!t)if("undefined"!=typeof Audio)try{var a=new Audio;"undefined"==typeof a.oncanplaythrough&&(d="canplay")}catch(e){r=!0}else r=!0;try{var a=new Audio;a.muted&&(r=!0)}catch(e){}var i=/iP(hone|od|ad)/.test(n&&n.platform),_=n&&n.appVersion.match(/OS (\sd+)_(\sd+)_?(\sd+)?/),s=_?parseInt(_[1],10):null;if(i&&s&&9>s){var l=/safari/.test(n&&n.userAgent.toLowerCase());(n&&n.standalone&&!l||n&&!n.standalone&&!l)&&(t=!1)}t&&(u="undefined"==typeof o.createGain?o.createGainNode():o.createGain(),u.gain.value=1,u.connect(o.destination))}var n=window&&window.navigator?window.navigator:null,o=null,t=!0,r=!1,u=null,d="canplaythrough";e();var a=function(){this.init()};a.prototype={init:function(){var e=this||i;return e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e.state=o?o.state||"running":"running",e.autoSuspend=!0,e._autoSuspend(),e.mobileAutoEnable=!0,e.noAudio=r,e.usingWebAudio=t,e.ctx=o,e.masterGain=u,r||e._setupCodecs(),e},volume:function(e){var n=this||i;if(e=parseFloat(e),"undefined"!=typeof e&&e>=0&&1>=e){n._volume=e,t&&(u.gain.value=e);for(var o=0;o<n._howls.length;o++)if(!n._howls[o]._webAudio)for(var r=n._howls[o]._getSoundIds(),d=0;d<r.length;d++){var a=n._howls[o]._soundById(r[d]);a&&a._node&&(a._node.volume=a._volume*e)}return n}return n._volume},mute:function(e){var n=this||i;n._muted=e,t&&(u.gain.value=e?0:n._volume);for(var o=0;o<n._howls.length;o++)if(!n._howls[o]._webAudio)for(var r=n._howls[o]._getSoundIds(),d=0;d<r.length;d++){var a=n._howls[o]._soundById(r[d]);a&&a._node&&(a._node.muted=e?!0:a._muted)}return n},unload:function(){for(var n=this||i,t=n._howls.length-1;t>=0;t--)n._howls[t].unload();return n.usingWebAudio&&"undefined"!=typeof o.close&&(n.ctx=null,o.close(),e(),n.ctx=o),n},codecs:function(e){return(this||i)._codecs[e]},_setupCodecs:function(){var e=this||i,o=new Audio,t=o.canPlayType("audio/mpeg;").replace(/^no$/,""),r=n&&n.userAgent.match(/OPR\s/([0-6].)/g),u=r&&parseInt(r[0].split("/")[1],10)<33;return e._codecs={mp3:!(u||!t&&!o.canPlayType("audio/mp3;").replace(/^no$/,"")),mpeg:!!t,opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),aac:!!o.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!o.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(o.canPlayType("audio/x-m4a;")||o.canPlayType("audio/m4a;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(o.canPlayType("audio/x-mp4;")||o.canPlayType("audio/mp4;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,""),webm:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,""),dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,"")},e},_enableMobileAudio:function(){var e=this||i,t=/iPhone|iPad|iPod|Android|BlackBerry|BB10|Silk|Mobi/i.test(n&&n.userAgent),r=!!("ontouchend"in window||n&&n.maxTouchPoints>0||n&&n.msMaxTouchPoints>0);if(!o||!e._mobileEnabled&&t&&r){e._mobileEnabled=!1,i.unload(),e._scratchBuffer=o.createBuffer(1,1,22050);var u=function(){var n=o.createBufferSource();n.buffer=e._scratchBuffer,n.connect(o.destination),"undefined"==typeof n.start?n.noteOn(0):n.start(0),n.onended=function(){n.disconnect(0),e._mobileEnabled=!0,e.mobileAutoEnable=!1,document.removeEventListener("touchend",u,!0)}};return document.addEventListener("touchend",u,!0),e}},_autoSuspend:function(){var e=this;if(e.autoSuspend&&o&&"undefined"!=typeof o.suspend&&t){for(var n=0;n<e._howls.length;n++)if(e._howls[n]._webAudio)for(var r=0;r<e._howls[n]._sounds.length;r++)if(!e._howls[n]._sounds[r]._paused)return e;return e._suspendTimer=setTimeout(function(){e.autoSuspend&&(e._suspendTimer=null,e.state="suspending",o.suspend().then(function(){e.state="suspended",e._resumeAfterSuspend&&(delete e._resumeAfterSuspend,e._autoResume())}))},3e4),e}},_autoResume:function(){var e=this;if(o&&"undefined"!=typeof o.resume&&t)return"running"===e.state&&e._suspendTimer?(clearTimeout(e._suspendTimer),e._suspendTimer=null):"suspended"===e.state?(e.state="resuming",o.resume().then(function(){e.state="running"}),e._suspendTimer&&(clearTimeout(e._suspendTimer),e._suspendTimer=null)):"suspending"===e.state&&(e._resumeAfterSuspend=!0),e}};var i=new a,_=function(e){var n=this;return e.src&&0!==e.src.length?void n.init(e):void console.error("An array of source files must be passed with any new Howl.")};_.prototype={init:function(e){var n=this;return n._autoplay=e.autoplay||!1,n._format="string"!=typeof e.format?e.format:[e.format],n._html5=e.html5||!1,n._muted=e.mute||!1,n._loop=e.loop||!1,n._pool=e.pool||5,n._preload="boolean"==typeof e.preload?e.preload:!0,n._rate=e.rate||1,n._sprite=e.sprite||{},n._src="string"!=typeof e.src?e.src:[e.src],n._volume=void 0!==e.volume?e.volume:1,n._duration=0,n._state="unloaded",n._sounds=[],n._endTimers={},n._queue=[],n._onend=e.onend?[{fn:e.onend}]:[],n._onfade=e.onfade?[{fn:e.onfade}]:[],n._onload=e.onload?[{fn:e.onload}]:[],n._onloaderror=e.onloaderror?[{fn:e.onloaderror}]:[],n._onpause=e.onpause?[{fn:e.onpause}]:[],n._onplay=e.onplay?[{fn:e.onplay}]:[],n._onstop=e.onstop?[{fn:e.onstop}]:[],n._onmute=e.onmute?[{fn:e.onmute}]:[],n._onvolume=e.onvolume?[{fn:e.onvolume}]:[],n._onrate=e.onrate?[{fn:e.onrate}]:[],n._onseek=e.onseek?[{fn:e.onseek}]:[],n._webAudio=t&&!n._html5,"undefined"!=typeof o&&o&&i.mobileAutoEnable&&i._enableMobileAudio(),i._howls.push(n),n._preload&&n.load(),n},load:function(){var e=this,n=null;if(r)return void e._emit("loaderror",null,"No audio support.");"string"==typeof e._src&&(e._src=[e._src]);for(var o=0;o<e._src.length;o++){var t,u;if(e._format&&e._format[o]?t=e._format[o]:(u=e._src[o],t=/^data:audio\s/([^;,]+);/i.exec(u),t||(t=/\s.([^.]+)$/.exec(u.split("?",1)[0])),t&&(t=t[1].toLowerCase())),i.codecs(t)){n=e._src[o];break}}return n?(e._src=n,e._state="loading","https:"===window.location.protocol&&"http:"===n.slice(0,5)&&(e._html5=!0,e._webAudio=!1),new s(e),e._webAudio&&f(e),e):void e._emit("loaderror",null,"No codec support for selected audio sources.")},play:function(e){var t=this,r=arguments,u=null;if("number"==typeof e)u=e,e=null;else if("undefined"==typeof e){e="__default";for(var a=0,_=0;_<t._sounds.length;_++)t._sounds[_]._paused&&!t._sounds[_]._ended&&(a++,u=t._sounds[_]._id);1===a?e=null:u=null}var s=u?t._soundById(u):t._inactiveSound();if(!s)return null;if(u&&!e&&(e=s._sprite||"__default"),"loaded"!==t._state&&!t._sprite[e])return t._queue.push({event:"play",action:function(){t.play(t._soundById(s._id)?s._id:void 0)}}),s._id;if(u&&!s._paused)return r[1]||setTimeout(function(){t._emit("play",s._id)},0),s._id;t._webAudio&&i._autoResume();var l=s._seek>0?s._seek:t._sprite[e][0]/1e3,f=(t._sprite[e][0]+t._sprite[e][1])/1e3-l,c=1e3*f/Math.abs(s._rate);c!==1/0&&(t._endTimers[s._id]=setTimeout(t._ended.bind(t,s),c)),s._paused=!1,s._ended=!1,s._sprite=e,s._seek=l,s._start=t._sprite[e][0]/1e3,s._stop=(t._sprite[e][0]+t._sprite[e][1])/1e3,s._loop=!(!s._loop&&!t._sprite[e][2]);var p=s._node;if(t._webAudio){var m=function(){t._refreshBuffer(s);var e=s._muted||t._muted?0:s._volume*i.volume();p.gain.setValueAtTime(e,o.currentTime),s._playStart=o.currentTime,"undefined"==typeof p.bufferSource.start?s._loop?p.bufferSource.noteGrainOn(0,l,86400):p.bufferSource.noteGrainOn(0,l,f):s._loop?p.bufferSource.start(0,l,86400):p.bufferSource.start(0,l,f),t._endTimers[s._id]||c===1/0||(t._endTimers[s._id]=setTimeout(t._ended.bind(t,s),c)),r[1]||setTimeout(function(){t._emit("play",s._id)},0)};"loaded"===t._state?m():(t.once("load",m,s._id),t._clearTimer(s._id))}else{var v=function(){p.currentTime=l,p.muted=s._muted||t._muted||i._muted||p.muted,p.volume=s._volume*i.volume(),p.playbackRate=s._rate,setTimeout(function(){p.play(),r[1]||t._emit("play",s._id)},0)},h="loaded"===t._state&&(window&&window.ejecta||!p.readyState&&n.isCocoonJS);if(4===p.readyState||h)v();else{var y=function(){c!==1/0&&(t._endTimers[s._id]=setTimeout(t._ended.bind(t,s),c)),v(),p.removeEventListener(d,y,!1)};p.addEventListener(d,y,!1),t._clearTimer(s._id)}}return s._id},pause:function(e){var n=this;if("loaded"!==n._state)return n._queue.push({event:"pause",action:function(){n.pause(e)}}),n;for(var o=n._getSoundIds(e),t=0;t<o.length;t++){n._clearTimer(o[t]);var r=n._soundById(o[t]);if(r&&!r._paused){if(r._seek=n.seek(o[t]),r._paused=!0,n._stopFade(o[t]),r._node)if(n._webAudio){if(!r._node.bufferSource)return n;"undefined"==typeof r._node.bufferSource.stop?r._node.bufferSource.noteOff(0):r._node.bufferSource.stop(0),n._cleanBuffer(r._node)}else isNaN(r._node.duration)&&r._node.duration!==1/0||r._node.pause();arguments[1]||n._emit("pause",r._id)}}return n},stop:function(e){var n=this;if("loaded"!==n._state)return n._queue.push({event:"stop",action:function(){n.stop(e)}}),n;for(var o=n._getSoundIds(e),t=0;t<o.length;t++){n._clearTimer(o[t]);var r=n._soundById(o[t]);if(r&&!r._paused&&(r._seek=r._start||0,r._paused=!0,r._ended=!0,n._stopFade(o[t]),r._node))if(n._webAudio){if(!r._node.bufferSource)return n;"undefined"==typeof r._node.bufferSource.stop?r._node.bufferSource.noteOff(0):r._node.bufferSource.stop(0),n._cleanBuffer(r._node)}else isNaN(r._node.duration)&&r._node.duration!==1/0||(r._node.pause(),r._node.currentTime=r._start||0);r&&n._emit("stop",r._id)}return n},mute:function(e,n){var t=this;if("loaded"!==t._state)return t._queue.push({event:"mute",action:function(){t.mute(e,n)}}),t;if("undefined"==typeof n){if("boolean"!=typeof e)return t._muted;t._muted=e}for(var r=t._getSoundIds(n),u=0;u<r.length;u++){var d=t._soundById(r[u]);d&&(d._muted=e,t._webAudio&&d._node?d._node.gain.setValueAtTime(e?0:d._volume*i.volume(),o.currentTime):d._node&&(d._node.muted=i._muted?!0:e),t._emit("mute",d._id))}return t},volume:function(){var e,n,t=this,r=arguments;if(0===r.length)return t._volume;if(1===r.length){var u=t._getSoundIds(),d=u.indexOf(r[0]);d>=0?n=parseInt(r[0],10):e=parseFloat(r[0])}else r.length>=2&&(e=parseFloat(r[0]),n=parseInt(r[1],10));var a;if(!("undefined"!=typeof e&&e>=0&&1>=e))return a=n?t._soundById(n):t._sounds[0],a?a._volume:0;if("loaded"!==t._state)return t._queue.push({event:"volume",action:function(){t.volume.apply(t,r)}}),t;"undefined"==typeof n&&(t._volume=e),n=t._getSoundIds(n);for(var _=0;_<n.length;_++)a=t._soundById(n[_]),a&&(a._volume=e,r[2]||t._stopFade(n[_]),t._webAudio&&a._node&&!a._muted?a._node.gain.setValueAtTime(e*i.volume(),o.currentTime):a._node&&!a._muted&&(a._node.volume=e*i.volume()),t._emit("volume",a._id));return t},fade:function(e,n,t,r){var u=this;if("loaded"!==u._state)return u._queue.push({event:"fade",action:function(){u.fade(e,n,t,r)}}),u;u.volume(e,r);for(var d=u._getSoundIds(r),a=0;a<d.length;a++){var i=u._soundById(d[a]);if(i)if(r||u._stopFade(d[a]),u._webAudio&&!i._muted){var _=o.currentTime,s=_+t/1e3;i._volume=e,i._node.gain.setValueAtTime(e,_),i._node.gain.linearRampToValueAtTime(n,s),i._timeout=setTimeout(function(e,t){delete t._timeout,setTimeout(function(){t._volume=n,u._emit("fade",e)},s-o.currentTime>0?Math.ceil(1e3*(s-o.currentTime)):0)}.bind(u,d[a],i),t)}else{var l=Math.abs(e-n),f=e>n?"out":"in",c=l/.01,p=t/c;!function(){var o=e;i._interval=setInterval(function(e,t){o+="in"===f?.01:-.01,o=Math.max(0,o),o=Math.min(1,o),o=Math.round(100*o)/100,u.volume(o,e,!0),o===n&&(clearInterval(t._interval),delete t._interval,u._emit("fade",e))}.bind(u,d[a],i),p)}()}}return u},_stopFade:function(e){var n=this,t=n._soundById(e);return t._interval?(clearInterval(t._interval),delete t._interval,n._emit("fade",e)):t._timeout&&(clearTimeout(t._timeout),delete t._timeout,t._node.gain.cancelScheduledValues(o.currentTime),n._emit("fade",e)),n},loop:function(){var e,n,o,t=this,r=arguments;if(0===r.length)return t._loop;if(1===r.length){if("boolean"!=typeof r[0])return o=t._soundById(parseInt(r[0],10)),o?o._loop:!1;e=r[0],t._loop=e}else 2===r.length&&(e=r[0],n=parseInt(r[1],10));for(var u=t._getSoundIds(n),d=0;d<u.length;d++)o=t._soundById(u[d]),o&&(o._loop=e,t._webAudio&&o._node&&o._node.bufferSource&&(o._node.bufferSource.loop=e));return t},rate:function(){var e,n,o=this,t=arguments;if(0===t.length)n=o._sounds[0]._id;else if(1===t.length){var r=o._getSoundIds(),u=r.indexOf(t[0]);u>=0?n=parseInt(t[0],10):e=parseFloat(t[0])}else 2===t.length&&(e=parseFloat(t[0]),n=parseInt(t[1],10));var d;if("number"!=typeof e)return d=o._soundById(n),d?d._rate:o._rate;if("loaded"!==o._state)return o._queue.push({event:"rate",action:function(){o.rate.apply(o,t)}}),o;"undefined"==typeof n&&(o._rate=e),n=o._getSoundIds(n);for(var a=0;a<n.length;a++)if(d=o._soundById(n[a])){d._rate=e,o._webAudio&&d._node&&d._node.bufferSource?d._node.bufferSource.playbackRate.value=e:d._node&&(d._node.playbackRate=e);var i=o.seek(n[a]),_=(o._sprite[d._sprite][0]+o._sprite[d._sprite][1])/1e3-i,s=1e3*_/Math.abs(d._rate);o._clearTimer(n[a]),o._endTimers[n[a]]=setTimeout(o._ended.bind(o,d),s),o._emit("rate",d._id)}return o},seek:function(){var e,n,t=this,r=arguments;if(0===r.length)n=t._sounds[0]._id;else if(1===r.length){var u=t._getSoundIds(),d=u.indexOf(r[0]);d>=0?n=parseInt(r[0],10):(n=t._sounds[0]._id,e=parseFloat(r[0]))}else 2===r.length&&(e=parseFloat(r[0]),n=parseInt(r[1],10));if("undefined"==typeof n)return t;if("loaded"!==t._state)return t._queue.push({event:"seek",action:function(){t.seek.apply(t,r)}}),t;var a=t._soundById(n);if(a){if(!(e>=0))return t._webAudio?a._seek+(t.playing(n)?o.currentTime-a._playStart:0):a._node.currentTime;var i=t.playing(n);i&&t.pause(n,!0),a._seek=e,t._clearTimer(n),i&&t.play(n,!0),t._emit("seek",n)}return t},playing:function(e){var n=this,o=n._soundById(e)||n._sounds[0];return o?!o._paused:!1},duration:function(e){var n=this,o=n._soundById(e)||n._sounds[0];return n._duration/o._rate},state:function(){return this._state},unload:function(){for(var e=this,n=e._sounds,o=0;o<n.length;o++){n[o]._paused||(e.stop(n[o]._id),e._emit("end",n[o]._id)),e._webAudio||(n[o]._node.src="",n[o]._node.removeEventListener("error",n[o]._errorFn,!1),n[o]._node.removeEventListener(d,n[o]._loadFn,!1)),delete n[o]._node,e._clearTimer(n[o]._id);var t=i._howls.indexOf(e);t>=0&&i._howls.splice(t,1)}return l&&delete l[e._src],e._state="unloaded",e._sounds=[],e=null,null},on:function(e,n,o,t){var r=this,u=r["_on"+e];return"function"==typeof n&&u.push(t?{id:o,fn:n,once:t}:{id:o,fn:n}),r},off:function(e,n,o){var t=this,r=t["_on"+e];if(n){for(var u=0;u<r.length;u++)if(n===r[u].fn&&o===r[u].id){r.splice(u,1);break}}else if(e)t["_on"+e]=[];else for(var d=Object.keys(t),u=0;u<d.length;u++)0===d[u].indexOf("_on")&&Array.isArray(t[d[u]])&&(t[d[u]]=[]);return t},once:function(e,n,o){var t=this;return t.on(e,n,o,1),t},_emit:function(e,n,o){for(var t=this,r=t["_on"+e],u=r.length-1;u>=0;u--)r[u].id&&r[u].id!==n&&"load"!==e||(setTimeout(function(e){e.call(this,n,o)}.bind(t,r[u].fn),0),r[u].once&&t.off(e,r[u].fn,r[u].id));return t},_loadQueue:function(){var e=this;if(e._queue.length>0){var n=e._queue[0];e.once(n.event,function(){e._queue.shift(),e._loadQueue()}),n.action()}return e},_ended:function(e){var n=this,t=e._sprite,r=!(!e._loop&&!n._sprite[t][2]);if(n._emit("end",e._id),!n._webAudio&&r&&n.stop(e._id).play(e._id),n._webAudio&&r){n._emit("play",e._id),e._seek=e._start||0,e._playStart=o.currentTime;var u=1e3*(e._stop-e._start)/Math.abs(e._rate);n._endTimers[e._id]=setTimeout(n._ended.bind(n,e),u)}return n._webAudio&&!r&&(e._paused=!0,e._ended=!0,e._seek=e._start||0,n._clearTimer(e._id),n._cleanBuffer(e._node),i._autoSuspend()),n._webAudio||r||n.stop(e._id),n},_clearTimer:function(e){var n=this;return n._endTimers[e]&&(clearTimeout(n._endTimers[e]),delete n._endTimers[e]),n},_soundById:function(e){for(var n=this,o=0;o<n._sounds.length;o++)if(e===n._sounds[o]._id)return n._sounds[o];return null},_inactiveSound:function(){var e=this;e._drain();for(var n=0;n<e._sounds.length;n++)if(e._sounds[n]._ended)return e._sounds[n].reset();return new s(e)},_drain:function(){var e=this,n=e._pool,o=0,t=0;if(!(e._sounds.length<n)){for(t=0;t<e._sounds.length;t++)e._sounds[t]._ended&&o++;for(t=e._sounds.length-1;t>=0;t--){if(n>=o)return;e._sounds[t]._ended&&(e._webAudio&&e._sounds[t]._node&&e._sounds[t]._node.disconnect(0),e._sounds.splice(t,1),o--)}}},_getSoundIds:function(e){var n=this;if("undefined"==typeof e){for(var o=[],t=0;t<n._sounds.length;t++)o.push(n._sounds[t]._id);return o}return[e]},_refreshBuffer:function(e){var n=this;return e._node.bufferSource=o.createBufferSource(),e._node.bufferSource.buffer=l[n._src],e._panner?e._node.bufferSource.connect(e._panner):e._node.bufferSource.connect(e._node),e._node.bufferSource.loop=e._loop,e._loop&&(e._node.bufferSource.loopStart=e._start||0,e._node.bufferSource.loopEnd=e._stop),e._node.bufferSource.playbackRate.value=n._rate,n},_cleanBuffer:function(e){var n=this;if(n._scratchBuffer){e.bufferSource.onended=null,e.bufferSource.disconnect(0);try{e.bufferSource.buffer=n._scratchBuffer}catch(o){}}return e.bufferSource=null,n}};var s=function(e){this._parent=e,this.init()};if(s.prototype={init:function(){var e=this,n=e._parent;return e._muted=n._muted,e._loop=n._loop,e._volume=n._volume,e._muted=n._muted,e._rate=n._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=Math.round(Date.now()*Math.random()),n._sounds.push(e),e.create(),e},create:function(){var e=this,n=e._parent,t=i._muted||e._muted||e._parent._muted?0:e._volume*i.volume();return n._webAudio?(e._node="undefined"==typeof o.createGain?o.createGainNode():o.createGain(),e._node.gain.setValueAtTime(t,o.currentTime),e._node.paused=!0,e._node.connect(u)):(e._node=new Audio,e._errorFn=e._errorListener.bind(e),e._node.addEventListener("error",e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(d,e._loadFn,!1),e._node.src=n._src,e._node.preload="auto",e._node.volume=t,e._node.load()),e},reset:function(){var e=this,n=e._parent;return e._muted=n._muted,e._loop=n._loop,e._volume=n._volume,e._muted=n._muted,e._rate=n._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=Math.round(Date.now()*Math.random()),e},_errorListener:function(){var e=this;e._node.error&&4===e._node.error.code&&(i.noAudio=!0),e._parent._emit("loaderror",e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener("error",e._errorListener,!1)},_loadListener:function(){var e=this,n=e._parent;n._duration=Math.ceil(10*e._node.duration)/10,0===Object.keys(n._sprite).length&&(n._sprite={__default:[0,1e3*n._duration]}),"loaded"!==n._state&&(n._state="loaded",n._emit("load"),n._loadQueue()),n._autoplay&&n.play(),e._node.removeEventListener(d,e._loadFn,!1)}},t)var l={},f=function(e){var n=e._src;if(l[n])return e._duration=l[n].duration,void m(e);if(/^data:[^;]+;base64,/.test(n)){window.atob=window.atob||function(e){for(var n,o,t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r=String(e).replace(/=+$/,""),u=0,d=0,a="";o=r.charAt(d++);~o&&(n=u%4?64*n+o:o,u++%4)?a+=String.fromCharCode(255&n>>(-2*u&6)):0)o=t.indexOf(o);return a};for(var o=atob(n.split(",")[1]),t=new Uint8Array(o.length),r=0;r<o.length;++r)t[r]=o.charCodeAt(r);p(t.buffer,e)}else{var u=new XMLHttpRequest;u.open("GET",n,!0),u.responseType="arraybuffer",u.onload=function(){var n=(u.status+"")[0];return"0"!==n&&"2"!==n&&"3"!==n?void e._emit("loaderror",null,"Failed loading audio file with status: "+u.status+"."):void p(u.response,e)},u.onerror=function(){e._webAudio&&(e._html5=!0,e._webAudio=!1,e._sounds=[],delete l[n],e.load())},c(u)}},c=function(e){try{e.send()}catch(n){e.onerror()}},p=function(e,n){o.decodeAudioData(e,function(e){e&&n._sounds.length>0&&(l[n._src]=e,m(n,e))},function(){n._emit("loaderror",null,"Decoding audio data failed.")})},m=function(e,n){n&&!e._duration&&(e._duration=n.duration),0===Object.keys(e._sprite).length&&(e._sprite={__default:[0,1e3*e._duration]}),"loaded"!==e._state&&(e._state="loaded",e._emit("load"),e._loadQueue()),e._autoplay&&e.play()};"function"==typeof define&&define.amd&&define([],function(){return{Howler:i,Howl:_}}),"undefined"!=typeof exports&&(exports.Howler=i,exports.Howl=_),"undefined"!=typeof window?(window.HowlerGlobal=a,window.Howler=i,window.Howl=_,window.Sound=s):"undefined"!=typeof global&&(global.HowlerGlobal=a,global.Howler=i,global.Howl=_,global.Sound=s)}();\n/*! Effects Plugin */\n!function(){"use strict";HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype._velocity=[0,0,0],HowlerGlobal.prototype._listenerAttr={dopplerFactor:1,speedOfSound:343.3},HowlerGlobal.prototype.pos=function(e,n,t){var o=this;return o.ctx&&o.ctx.listener?(n="number"!=typeof n?o._pos[1]:n,t="number"!=typeof t?o._pos[2]:t,"number"!=typeof e?o._pos:(o._pos=[e,n,t],o.ctx.listener.setPosition(o._pos[0],o._pos[1],o._pos[2]),o)):o},HowlerGlobal.prototype.orientation=function(e,n,t,o,r,i){var a=this;if(!a.ctx||!a.ctx.listener)return a;var p=a._orientation;return n="number"!=typeof n?p[1]:n,t="number"!=typeof t?p[2]:t,o="number"!=typeof o?p[3]:o,r="number"!=typeof r?p[4]:r,i="number"!=typeof i?p[5]:i,"number"!=typeof e?p:(a._orientation=[e,n,t,o,r,i],a.ctx.listener.setOrientation(e,n,t,o,r,i),a)},HowlerGlobal.prototype.velocity=function(e,n,t){var o=this;return o.ctx&&o.ctx.listener?(n="number"!=typeof n?o._velocity[1]:n,t="number"!=typeof t?o._velocity[2]:t,"number"!=typeof e?o._velocity:(o._velocity=[e,n,t],o.ctx.listener.setVelocity(o._velocity[0],o._velocity[1],o._velocity[2]),o)):o},HowlerGlobal.prototype.listenerAttr=function(e){var n=this;if(!n.ctx||!n.ctx.listener)return n;var t=n._listenerAttr;return e?(n._listenerAttr={dopplerFactor:"undefined"!=typeof e.dopplerFactor?e.dopplerFactor:t.dopplerFactor,speedOfSound:"undefined"!=typeof e.speedOfSound?e.speedOfSound:t.speedOfSound},n.ctx.listener.dopplerFactor=t.dopplerFactor,n.ctx.listener.speedOfSound=t.speedOfSound,n):t},Howl.prototype.init=function(e){return function(n){var t=this;return t._orientation=n.orientation||[1,0,0],t._pos=n.pos||null,t._velocity=n.velocity||[0,0,0],t._pannerAttr={coneInnerAngle:"undefined"!=typeof n.coneInnerAngle?n.coneInnerAngle:360,coneOuterAngle:"undefined"!=typeof n.coneOuterAngle?n.coneOuterAngle:360,coneOuterGain:"undefined"!=typeof n.coneOuterGain?n.coneOuterGain:0,distanceModel:"undefined"!=typeof n.distanceModel?n.distanceModel:"inverse",maxDistance:"undefined"!=typeof n.maxDistance?n.maxDistance:1e4,panningModel:"undefined"!=typeof n.panningModel?n.panningModel:"HRTF",refDistance:"undefined"!=typeof n.refDistance?n.refDistance:1,rolloffFactor:"undefined"!=typeof n.rolloffFactor?n.rolloffFactor:1},t._onpos=n.onpos?[{fn:n.onpos}]:[],t._onorientation=n.onorientation?[{fn:n.onorientation}]:[],t._onvelocity=n.onvelocity?[{fn:n.onvelocity}]:[],e.call(this,n)}}(Howl.prototype.init),Howl.prototype.pos=function(n,t,o,r){var i=this;if(!i._webAudio)return i;if("loaded"!==i._state)return i._queue.push({event:"pos",action:function(){i.pos(n,t,o,r)}}),i;if(t="number"!=typeof t?0:t,o="number"!=typeof o?-.5:o,"undefined"==typeof r){if("number"!=typeof n)return i._pos;i._pos=[n,t,o]}for(var a=i._getSoundIds(r),p=0;p<a.length;p++){var l=i._soundById(a[p]);if(l){if("number"!=typeof n)return l._pos;l._pos=[n,t,o],l._node&&(l._panner||e(l),l._panner.setPosition(n,t,o)),i._emit("pos",l._id)}}return i},Howl.prototype.orientation=function(n,t,o,r){var i=this;if(!i._webAudio)return i;if("loaded"!==i._state)return i._queue.push({event:"orientation",action:function(){i.orientation(n,t,o,r)}}),i;if(t="number"!=typeof t?i._orientation[1]:t,o="number"!=typeof o?i._orientation[2]:o,"undefined"==typeof r){if("number"!=typeof n)return i._orientation;i._orientation=[n,t,o]}for(var a=i._getSoundIds(r),p=0;p<a.length;p++){var l=i._soundById(a[p]);if(l){if("number"!=typeof n)return l._orientation;l._orientation=[n,t,o],l._node&&(l._panner||(l._pos||(l._pos=i._pos||[0,0,-.5]),e(l)),l._panner.setOrientation(n,t,o)),i._emit("orientation",l._id)}}return i},Howl.prototype.velocity=function(n,t,o,r){var i=this;if(!i._webAudio)return i;if("loaded"!==i._state)return i._queue.push({event:"velocity",action:function(){i.velocity(n,t,o,r)}}),i;if(t="number"!=typeof t?i._velocity[1]:t,o="number"!=typeof o?i._velocity[2]:o,"undefined"==typeof r){if("number"!=typeof n)return i._velocity;i._velocity=[n,t,o]}for(var a=i._getSoundIds(r),p=0;p<a.length;p++){var l=i._soundById(a[p]);if(l){if("number"!=typeof n)return l._velocity;l._velocity=[n,t,o],l._node&&(l._pos||(l._pos=i._pos||[0,0,-.5]),l._panner||e(l),l._panner.setVelocity(n,t,o)),i._emit("velocity",l._id)}}return i},Howl.prototype.pannerAttr=function(){var n,t,o,r=this,i=arguments;if(!r._webAudio)return r;if(0===i.length)return r._pannerAttr;if(1===i.length){if("object"!=typeof i[0])return o=r._soundById(parseInt(i[0],10)),o?o._pannerAttr:r._pannerAttr;n=i[0],"undefined"==typeof t&&(r._pannerAttr={coneInnerAngle:"undefined"!=typeof n.coneInnerAngle?n.coneInnerAngle:r._coneInnerAngle,coneOuterAngle:"undefined"!=typeof n.coneOuterAngle?n.coneOuterAngle:r._coneOuterAngle,coneOuterGain:"undefined"!=typeof n.coneOuterGain?n.coneOuterGain:r._coneOuterGain,distanceModel:"undefined"!=typeof n.distanceModel?n.distanceModel:r._distanceModel,maxDistance:"undefined"!=typeof n.maxDistance?n.maxDistance:r._maxDistance,panningModel:"undefined"!=typeof n.panningModel?n.panningModel:r._panningModel,refDistance:"undefined"!=typeof n.refDistance?n.refDistance:r._refDistance,rolloffFactor:"undefined"!=typeof n.rolloffFactor?n.rolloffFactor:r._rolloffFactor})}else 2===i.length&&(n=i[0],t=parseInt(i[1],10));for(var a=r._getSoundIds(t),p=0;p<a.length;p++)if(o=r._soundById(a[p])){var l=o._pannerAttr;l={coneInnerAngle:"undefined"!=typeof n.coneInnerAngle?n.coneInnerAngle:l.coneInnerAngle,coneOuterAngle:"undefined"!=typeof n.coneOuterAngle?n.coneOuterAngle:l.coneOuterAngle,coneOuterGain:"undefined"!=typeof n.coneOuterGain?n.coneOuterGain:l.coneOuterGain,distanceModel:"undefined"!=typeof n.distanceModel?n.distanceModel:l.distanceModel,maxDistance:"undefined"!=typeof n.maxDistance?n.maxDistance:l.maxDistance,panningModel:"undefined"!=typeof n.panningModel?n.panningModel:l.panningModel,refDistance:"undefined"!=typeof n.refDistance?n.refDistance:l.refDistance,rolloffFactor:"undefined"!=typeof n.rolloffFactor?n.rolloffFactor:l.rolloffFactor};var c=o._panner;c?(c.coneInnerAngle=l.coneInnerAngle,c.coneOuterAngle=l.coneOuterAngle,c.coneOuterGain=l.coneOuterGain,c.distanceModel=l.distanceModel,c.maxDistance=l.maxDistance,c.panningModel=l.panningModel,c.refDistance=l.refDistance,c.rolloffFactor=l.rolloffFactor):(o._pos||(o._pos=r._pos||[0,0,-.5]),e(o))}return r},Sound.prototype.init=function(e){return function(){var n=this,t=n._parent;n._orientation=t._orientation,n._pos=t._pos,n._velocity=t._velocity,n._pannerAttr=t._pannerAttr,e.call(this),n._pos&&t.pos(n._pos[0],n._pos[1],n._pos[2],n._id)}}(Sound.prototype.init),Sound.prototype.reset=function(e){return function(){var n=this,t=n._parent;return n._orientation=t._orientation,n._pos=t._pos,n._velocity=t._velocity,n._pannerAttr=t._pannerAttr,e.call(this)}}(Sound.prototype.reset);var e=function(e){e._panner=Howler.ctx.createPanner(),e._panner.coneInnerAngle=e._pannerAttr.coneInnerAngle,e._panner.coneOuterAngle=e._pannerAttr.coneOuterAngle,e._panner.coneOuterGain=e._pannerAttr.coneOuterGain,e._panner.distanceModel=e._pannerAttr.distanceModel,e._panner.maxDistance=e._pannerAttr.maxDistance,e._panner.panningModel=e._pannerAttr.panningModel,e._panner.refDistance=e._pannerAttr.refDistance,e._panner.rolloffFactor=e._pannerAttr.rolloffFactor,e._panner.setPosition(e._pos[0],e._pos[1],e._pos[2]),e._panner.setOrientation(e._orientation[0],e._orientation[1],e._orientation[2]),e._panner.setVelocity(e._velocity[0],e._velocity[1],e._velocity[2]),e._panner.connect(e._node),e._paused||e._parent.pause(e._id,!0).play(e._id)}}();
<<set $spirits = 2>>\nThe peasants, naturally [[resenting|Spirits]] his lordship, tried everything from cyanide to drowning to knives to gunshots, but [[nothing worked|Demon]].
It was my grandmother, actually, when I was [[eight years old|Ponies]]: a buck-toothed, red-headed, French-kissing girl scout.
<<script>>\npostdisplay.hideChoices = function(hideChoices) {\t\n\t$('#choices').hide();\n\tdelete postdisplay[hideChoices];\n}\n<</script>>\n<div class="typed-speed20-delay2000">Ms. Lojka called me up last week and asked me for a favor.</div><div id="choices">\n<div class="choice"><<choice [[I told her she could go to hell|Hell]]>></div>\n<div class="choice"><<choice [[I decided to hear what she had to say|Hear]]>></div>\n</div>
The king and queen of My Little Ponies would be [[so grateful|Foolproof]] that they would invite me to spend the rest of [[eternity|Foolproof]] in My Little Pony heaven with them.
<<script>>\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').stop().hide();\n<</script>>\n<<set $endclicks = 5>>\n\n<<if $endhide neq 1>><a class="togglebackground">My</a>\n<<else>><a style="opacity:0;" class="togglebackground">My</a>\n<</if>>\n\n<<if $endhide neq 2>><a class="togglebackground">tower's</a>\n<<else>><a style="opacity:0;" class="togglebackground">tower's</a>\n<</if>>\n\n<<if $endhide neq 3>><a class="togglebackground">never</a>\n<<else>><a style="opacity:0;" class="togglebackground">never</a>\n<</if>>\n\n<<if $endhide neq 4>><a class="togglebackground">going</a>\n<<else>><a style="opacity:0;" class="togglebackground">going</a>\n<</if>>\n\n<<if $endhide neq 5>><a class="togglebackground">to</a>\n<<else>><a style="opacity:0;" class="togglebackground">to</a>\n<</if>>\n\n<<if $endhide neq 6>><a class="togglebackground">fall</a>\n<<else>><a style="opacity:0;" class="togglebackground">fall</a>\n<</if>>\n
Music: "Long Note Four" by Kevin MacLeod\n\nSounds IDs from FreeSound.org:\nScream: 31135; Typing Keystrokes: 144107; Laser Cannon: 147908; Yay: 162395; Whisper 1: 193675; Whisper 2: 193747; Whisper 3: 276469; Whisper 4: 341841; Whisper Loop: 205628; Glitch Noises: 332947\n\n[[Back|Title]]
<<set $servant = 3>>\nI didn't, of course--try to interfere. Ms. Lojka scared me pretty bad. She reminded me of a woman who came to me in a [[dream|Servant]] once and sat on my chest and petrified my whole body: she was so cold and ugly and completely evil. Except that woman didn't have [[wings|Wings]], whereas Ms. Lojka did.
(function() {\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports["theaterJS"] = factory();\n\telse\n\t\troot["theaterJS"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\n\tfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\n\tvar _actor = __webpack_require__(1);\n\n\tvar _actor2 = _interopRequireDefault(_actor);\n\n\tvar _helpersUtils = __webpack_require__(3);\n\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\n\tvar _helpersType = __webpack_require__(2);\n\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\n\tvar _helpersKeyboard = __webpack_require__(4);\n\n\tvar _helpersKeyboard2 = _interopRequireDefault(_helpersKeyboard);\n\n\tvar _helpersHtml = __webpack_require__(6);\n\n\tvar _helpersHtml2 = _interopRequireDefault(_helpersHtml);\n\n\tvar NAVIGATOR = typeof window !== 'undefined' && window.navigator;\n\tvar DEFAULTS = {\n\t autoplay: true,\n\t erase: true,\n\t minSpeed: { erase: 80, type: 80 },\n\t maxSpeed: { erase: 450, type: 450 },\n\t locale: 'detect'\n\t};\n\n\tfunction theaterJS() {\n\t var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t /* ------------------------------------------------- *\s\n\t init\n\t \s* ------------------------------------------------- */\n\n\t options = _helpersUtils2['default'].merge({}, DEFAULTS, options);\n\n\t if (_helpersType2['default'].isNumber(options.minSpeed)) {\n\t var _options = options;\n\t var minSpeed = _options.minSpeed;\n\n\t options.minSpeed = { erase: minSpeed, type: minSpeed };\n\t }\n\n\t if (_helpersType2['default'].isNumber(options.maxSpeed)) {\n\t var _options2 = options;\n\t var maxSpeed = _options2.maxSpeed;\n\n\t options.maxSpeed = { erase: maxSpeed, type: maxSpeed };\n\t }\n\n\t if (options.locale === 'detect' && NAVIGATOR) {\n\t var languages = NAVIGATOR.languages;\n\t if (_helpersType2['default'].isArray(languages) && _helpersType2['default'].isString(languages[0])) {\n\t options.locale = languages[0].substr(0, 2);\n\t }\n\t }\n\n\t if (!_helpersKeyboard2['default'].supports(options.locale)) {\n\t options.locale = _helpersKeyboard2['default'].defaultLocale;\n\t }\n\n\t var props = { options: options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} };\n\t setCurrentActor(null);\n\n\t /* ------------------------------------------------- *\s\n\t methods\n\t \s* ------------------------------------------------- */\n\n\t function addActor(actorName) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n\t var a = (0, _actor2['default'])(actorName, options, callback);\n\t props.casting[a.name] = a;\n\n\t return this;\n\t }\n\n\t function setCurrentActor(actorName) {\n\t props.onStage = actorName;\n\t return this;\n\t }\n\n\t function getCurrentActor() {\n\t return props.casting[props.onStage] || null;\n\t }\n\n\t function addScene() {\n\t var sequence = [];\n\n\t function addSceneToSequence(scene) {\n\t if (_helpersType2['default'].isArray(scene)) {\n\t scene.forEach(function (s) {\n\t addSceneToSequence(s);\n\t });\n\t }\n\n\t if (_helpersType2['default'].isString(scene)) {\n\t var partials = scene.split(':');\n\n\t var actorName = undefined;\n\t if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\s\s') {\n\t actorName = partials.shift();\n\n\t addSceneToSequence({ name: 'erase', actor: actorName });\n\t }\n\n\t var speech = partials.join(':').replace(/\s\s:/g, ':');\n\t var sceneObj = { name: 'type', args: [speech] };\n\n\t if (actorName != null) {\n\t sceneObj.actor = actorName;\n\t }\n\n\t addSceneToSequence(sceneObj);\n\t }\n\n\t if (_helpersType2['default'].isFunction(scene)) {\n\t addSceneToSequence({ name: 'callback', args: [scene] });\n\t }\n\n\t if (_helpersType2['default'].isNumber(scene)) {\n\t if (scene > 0) {\n\t addSceneToSequence({ name: 'wait', args: [scene] });\n\t } else {\n\t addSceneToSequence({ name: 'erase', args: [scene] });\n\t }\n\t }\n\n\t if (_helpersType2['default'].isObject(scene)) {\n\t if (!_helpersType2['default'].isArray(scene.args)) {\n\t scene.args = [];\n\t }\n\n\t scene.args.unshift(function () {\n\t publish(scene.name + ':end', scene);\n\t playNextScene();\n\t });\n\n\t sequence.push(scene);\n\t }\n\t }\n\n\t for (var _len = arguments.length, scenes = Array(_len), _key = 0; _key < _len; _key++) {\n\t scenes[_key] = arguments[_key];\n\t }\n\n\t addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }));\n\t Array.prototype.push.apply(props.scenario, sequence);\n\n\t if (props.options.autoplay) {\n\t play();\n\t }\n\n\t return this;\n\t }\n\n\t function play() {\n\t if (props.status === 'stopping') {\n\t props.status = 'playing';\n\t }\n\n\t if (props.status === 'ready') {\n\t props.status = 'playing';\n\t playNextScene();\n\t }\n\n\t return this;\n\t }\n\n\t function replay(done) {\n\t if (props.status === 'ready' || _helpersType2['default'].isFunction(done)) {\n\t props.currentScene = -1;\n\n\t if (props.status === 'ready') play();else done();\n\t }\n\n\t return this;\n\t }\n\n\t function stop() {\n\t props.status = 'stopping';\n\t return this;\n\t }\n\n\t function playNextScene() {\n\t if (props.status === 'stopping') {\n\t props.status = 'ready';\n\t return this;\n\t }\n\n\t if (props.status !== 'playing') return this;\n\n\t if (props.currentScene + 1 >= props.scenario.length) {\n\t props.status = 'ready';\n\t publish('scenario:end');\n\t return this;\n\t }\n\n\t var nextScene = props.scenario[++props.currentScene];\n\n\t if (props.currentScene === 0) {\n\t publish('scenario:start');\n\t }\n\n\t if (nextScene.name === 'publisher') {\n\t var _nextScene$args = _toArray(nextScene.args);\n\n\t var done = _nextScene$args[0];\n\n\t var args = _nextScene$args.slice(1);\n\n\t publish.apply(undefined, _toConsumableArray(args));\n\n\t return done();\n\t }\n\n\t if (nextScene.actor) {\n\t setCurrentActor(nextScene.actor);\n\t }\n\n\t publish(nextScene.name + ':start', nextScene);\n\n\t switch (nextScene.name) {\n\t case 'type':\n\t typeAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\n\t case 'erase':\n\t eraseAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\n\t case 'callback':\n\t callbackAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\n\t case 'wait':\n\t waitAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\n\t default:\n\t console.debug('No scene handler for ' + nextScene.name);\n\t break;\n\t }\n\n\t return this;\n\t }\n\n\t function typeAction(done, value) {\n\t\t// ------------- Added Hack ------------- //\n\t\t// Sound related stuff.\n\t\t// ------------- Added Hack ------------- //\n\t\tvar everyOther = 1;\n\t\tvar playSound = true;\n\t\t// ------------- End Added Hack ------------- //\n\n\t var actor = getCurrentActor();\n\n\t var locale = props.options.locale;\n\t var minSpeed = props.options.minSpeed.type;\n\t var maxSpeed = props.options.maxSpeed.type;\n\t var initialValue = actor.displayValue;\n\t var cursor = -1;\n\t var isFixing = false;\n\t var previousMistakeCursor = null;\n\t var previousFixCursor = null;\n\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\t value = _helpersHtml2['default'].strip(value);(function type() {\n\t var actual = _helpersHtml2['default'].strip(actor.displayValue.substr(initialValue.length));\n\n\t if (actual === value) return done();\n\n\t var expected = value.substr(0, cursor + 1);\n\n\t var isMistaking = actual !== expected;\n\t var shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor);\n\t var shouldFix = isFixing || !shouldBeMistaken;\n\n\t if (isMistaking && shouldFix) {\n\t isFixing = true;\n\t previousMistakeCursor = null;\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual.substr(0, actual.length - 1), htmlMap);\n\t cursor--;\n\t previousFixCursor = cursor;\n\t } else {\n\t isFixing = false;\n\t var nextChar = value.charAt(++cursor);\n\n\t if (shouldBeMistaken) {\n\t nextChar = _helpersKeyboard2['default'].randomCharNear(nextChar, locale);\n\n\t if (previousMistakeCursor == null) {\n\t previousMistakeCursor = cursor;\n\t }\n\t }\n\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual + nextChar, htmlMap);\n\t }\n\n\t\t// ------------- Added Hack ------------- //\n\t\t// Sound related stuff.\n\t\t// ------------- Added Hack ------------- //\n\t\tplaySound = false;\n\t\tif (State.passage == 'Hang Up')\n\t\t{\n\t\t\tplaySound = false;\n\t\t}\n\t\telse if (everyOther > 0)\n\t\t{\n\t\t\tplaySound = true;\n\t\t}\n\t\tif (playSound) {\n\t\t\tplayRandomKeystrokeSound();\n\t\t}\n\t\teveryOther = -everyOther;\n\t\t// ------------- End Added Hack ------------- //\n\n\t return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\n\t return this;\n\t }\n\n\t function eraseAction(done, arg) {\n\t var actor = getCurrentActor();\n\n\t // erase scenes are added before a type scene\n\t // so for the first scene, there's no actor yet\n\t if (actor == null) {\n\t return done();\n\t }\n\n\t if (options.erase !== true) {\n\t actor.displayValue = '';\n\t return done();\n\t }\n\n\t var minSpeed = props.options.minSpeed.erase;\n\t var maxSpeed = props.options.maxSpeed.erase;\n\n\t var value = actor.displayValue;\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\n\t value = _helpersHtml2['default'].strip(value);\n\n\t var cursor = value.length;\n\n\t var speed = undefined;\n\t var nbCharactersToErase = 0;\n\n\t if (_helpersType2['default'].isNumber(arg)) {\n\t if (arg > 0) speed = arg;else nbCharactersToErase = value.length + arg;\n\t }\n\n\t (function erase() {\n\t if (cursor === nbCharactersToErase) return done();\n\t actor.displayValue = _helpersHtml2['default'].inject(value.substr(0, --cursor), htmlMap);\n\n\t return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\n\t return this;\n\t }\n\n\t function callbackAction(done, callback) {\n\t callback.call(this, done);\n\t return this;\n\t }\n\n\t function waitAction(done, delay) {\n\t setTimeout(done.bind(this), delay);\n\t return this;\n\t }\n\n\t function subscribe(events, callback) {\n\t events.split(',').forEach(function (eventName) {\n\t eventName = eventName.trim();\n\n\t if (!_helpersType2['default'].isArray(props.events[eventName])) {\n\t props.events[eventName] = [];\n\t }\n\n\t props.events[eventName].push(callback);\n\t });\n\n\t return this;\n\t }\n\n\t function publish() {\n\t for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\n\t var eventName = args[0];\n\t var callbacks = props.events[eventName] || [];\n\n\t if (callbacks.length > 0) {\n\t callbacks.concat(props.events['*'] || []).forEach(function (callback) {\n\t return callback.apply(undefined, args);\n\t });\n\t }\n\n\t return this;\n\t }\n\n\t /* ------------------------------------------------- *\s\n\t public api\n\t \s* ------------------------------------------------- */\n\n\t return Object.freeze(Object.defineProperties({\n\t addActor: addActor,\n\t getCurrentActor: getCurrentActor,\n\t addScene: addScene,\n\t play: play,\n\t replay: replay,\n\t stop: stop,\n\t on: subscribe\n\t }, {\n\t options: {\n\t get: function get() {\n\t return props.options;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t status: {\n\t get: function get() {\n\t return props.status;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t }));\n\t}\n\n\ttheaterJS.init = function () {\n\t var actorName = arguments.length <= 0 || arguments[0] === undefined ? 'actor' : arguments[0];\n\n\t var theater = theaterJS();\n\t theater.addActor(actorName, { accuracy: 1, speed: 0.8 });\n\t return theater;\n\t};\n\n\texports['default'] = theaterJS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tvar _helpersType = __webpack_require__(2);\n\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\n\tvar _helpersUtils = __webpack_require__(3);\n\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\n\tvar DOCUMENT = typeof window !== 'undefined' && window.document;\n\tvar DEFAULTS = { speed: 0.6, accuracy: 0.6 };\n\n\texports['default'] = function (actorName) {\n\t var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n\t var displayValue = '';\n\t var $element = undefined;\n\n\t if (_helpersType2['default'].isNumber(props)) {\n\t props = { speed: props, accuracy: props };\n\t }\n\n\t props = _helpersUtils2['default'].merge({}, DEFAULTS, props);\n\n\t if (DOCUMENT) {\n\t if (callback == null) {\n\t callback = '#' + actorName;\n\t }\n\n\t if (_helpersType2['default'].isString(callback)) {\n\t var selector = callback;\n\t var $e = DOCUMENT.querySelector(selector);\n\n\t if ($e != null) {\n\t $element = $e;\n\t callback = function (newValue) {\n\t $element.innerHTML = newValue;\n\t };\n\t } else {\n\t throw new Error('no matches for ' + actorName + '\s's selector: ' + selector);\n\t }\n\t }\n\t }\n\n\t if (!_helpersType2['default'].isFunction(callback)) {\n\t callback = console.log.bind(console);\n\t }\n\n\t return Object.defineProperties({\n\t $element: $element,\n\n\t getTypingSpeed: function getTypingSpeed(fastest, slowest) {\n\t var speed = _helpersUtils2['default'].randomFloat(props.speed, 1);\n\t return _helpersUtils2['default'].getPercentageOf(slowest, fastest, speed);\n\t },\n\n\t shouldBeMistaken: function shouldBeMistaken(actual, endValue) {\n\t var previousMistakeCursor = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t var previousFixCursor = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];\n\n\t var accuracy = props.accuracy * 10;\n\n\t if (accuracy >= 8) {\n\t return false;\n\t }\n\n\t if (actual.length <= accuracy) {\n\t return false;\n\t }\n\n\t if (actual.length === endValue.length) {\n\t return false;\n\t }\n\n\t if (_helpersType2['default'].isNumber(previousMistakeCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousMistakeCursor;\n\t var maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4;\n\n\t if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {\n\t return false;\n\t }\n\t }\n\n\t if (_helpersType2['default'].isNumber(previousFixCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousFixCursor;\n\t var minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2;\n\n\t if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {\n\t return false;\n\t }\n\t }\n\n\t return _helpersUtils2['default'].randomFloat(0, 0.8) > props.accuracy;\n\t }\n\t }, {\n\t displayValue: {\n\t get: function get() {\n\t return displayValue;\n\t },\n\t set: function set(value) {\n\t displayValue = value;\n\t callback(value);\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t name: {\n\t get: function get() {\n\t return actorName;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t });\n\t};\n\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\tfunction toString(o) {\n\t return ({}).toString.call(o);\n\t}\n\n\texports['default'] = {\n\t isNumber: function isNumber(o) {\n\t return typeof o === 'number';\n\t },\n\n\t isString: function isString(o) {\n\t return toString(o) === '[object String]';\n\t },\n\n\t isObject: function isObject(o) {\n\t return toString(o) === '[object Object]';\n\t },\n\n\t isArray: function isArray(o) {\n\t return toString(o) === '[object Array]';\n\t },\n\n\t isFunction: function isFunction(o) {\n\t return typeof o === 'function';\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t"use strict";\n\n\tObject.defineProperty(exports, "__esModule", {\n\t value: true\n\t});\n\texports["default"] = {\n\t merge: function merge(dst) {\n\t var objs = [].slice.call(arguments, 1);\n\n\t for (var i = 0, len = objs.length; i < len; i++) {\n\t var obj = objs[i];\n\n\t for (var key in obj) {\n\t if (!obj.hasOwnProperty(key)) continue;\n\t dst[key] = obj[key];\n\t }\n\t }\n\n\t return dst;\n\t },\n\n\t random: function random(min, max) {\n\t return Math.floor(Math.random() * (max - min + 1)) + min;\n\t },\n\n\t randomFloat: function randomFloat(min, max) {\n\t return Math.random() * (max - min) + min;\n\t },\n\n\t getPercentageOf: function getPercentageOf(min, max, percentage) {\n\t return min - min * percentage + max * percentage;\n\t }\n\t};\n\tmodule.exports = exports["default"];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tvar _type = __webpack_require__(2);\n\n\tvar _type2 = _interopRequireDefault(_type);\n\n\tvar _utils = __webpack_require__(3);\n\n\tvar _utils2 = _interopRequireDefault(_utils);\n\n\tvar _keyboardsJson = __webpack_require__(5);\n\n\tvar _keyboardsJson2 = _interopRequireDefault(_keyboardsJson);\n\n\tvar DEFAULT_LOCALE = 'en';\n\n\tfor (var locale in _keyboardsJson2['default']) {\n\t if (!_keyboardsJson2['default'].hasOwnProperty(locale)) continue;\n\n\t var keyboard = _keyboardsJson2['default'][locale];\n\t _keyboardsJson2['default'][locale] = { list: keyboard, mapped: mapKeyboard(keyboard) };\n\t}\n\n\tfunction mapKeyboard(alphabet) {\n\t var keyboard = {};\n\n\t for (var y = 0, lines = alphabet.length, chars = undefined; y < lines; y++) {\n\t chars = alphabet[y];\n\n\t for (var x = 0, charsLength = chars.length; x < charsLength; x++) {\n\t keyboard[chars[x]] = { x: x, y: y };\n\t }\n\t }\n\n\t return keyboard;\n\t}\n\n\texports['default'] = {\n\t defaultLocale: DEFAULT_LOCALE,\n\n\t supports: function supports(locale) {\n\t return _type2['default'].isObject(_keyboardsJson2['default'][locale]);\n\t },\n\n\t randomCharNear: function randomCharNear(ch, locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale "' + locale + '" is not supported');\n\t }\n\n\t var keyboard = _keyboardsJson2['default'][locale].mapped;\n\t var threshold = 1;\n\t var nearbyChars = [];\n\t var uppercase = /[A-Z]/.test(ch);\n\n\t ch = ch.toLowerCase();\n\n\t var charPosition = keyboard[ch] || [];\n\t var p = undefined;\n\n\t for (var c in keyboard) {\n\t if (!keyboard.hasOwnProperty(c) || c === ch) continue;\n\n\t p = keyboard[c];\n\n\t if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {\n\t nearbyChars.push(c);\n\t }\n\t }\n\n\t var randomChar = nearbyChars.length > 0 ? nearbyChars[_utils2['default'].random(0, nearbyChars.length - 1)] : this.randomChar(locale);\n\n\t if (uppercase) {\n\t randomChar = randomChar.toUpperCase();\n\t }\n\n\t return randomChar;\n\t },\n\n\t randomChar: function randomChar(locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale "' + locale + '" is not supported');\n\t }\n\n\t var chars = _keyboardsJson2['default'][locale].list.join('');\n\t return chars.charAt(_utils2['default'].random(0, chars.length - 1));\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\t"en": [\n\t\t\t"qwertyuiop",\n\t\t\t"asdfghjkl",\n\t\t\t"zxcvbnm"\n\t\t],\n\t\t"fr": [\n\t\t\t"azertyuiop",\n\t\t\t"qsdfghjklm",\n\t\t\t"wxcvbn"\n\t\t],\n\t\t"da": [\n\t\t\t"qwertyuiopå",\n\t\t\t"asdfghjklæø",\n\t\t\t"zxcvbnm"\n\t\t],\n\t\t"de": [\n\t\t\t"qwertzuiopü",\n\t\t\t"asdfghjklöä",\n\t\t\t"yxcvbnm"\n\t\t],\n\t\t"pl": [\n\t\t\t"qwertyuiopęó",\n\t\t\t"asdfghjkląśł",\n\t\t\t"zxcvbnmżźćń"\n\t\t],\n\t\t"pt": [\n\t\t\t"qwertyuiop",\n\t\t\t"asdfghjklç",\n\t\t\t"zxcvbnm"\n\t\t],\n\t\t"ru": [\n\t\t\t"йцукенгшщзх",\n\t\t\t"фывапролджэ",\n\t\t\t"ячсмитьбюъ"\n\t\t]\n\t};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tvar _voidElementsJson = __webpack_require__(7);\n\n\tvar _voidElementsJson2 = _interopRequireDefault(_voidElementsJson);\n\n\tfunction isVoidElement(tag) {\n\t var tagName = tag.match(/<([^\ss>]+)/);\n\t return Boolean(tagName) && _voidElementsJson2['default'].indexOf(tagName[1].toLowerCase()) > -1;\n\t}\n\n\texports['default'] = {\n\t strip: function strip(str) {\n\t return str.replace(/(<([^>]+)>)/gi, '');\n\t },\n\n\t map: function map(str) {\n\t var regexp = /<[^>]+>/gi;\n\t var tags = [];\n\t var openers = [];\n\t var result = undefined;\n\t var tag = undefined;\n\n\t while (result = regexp.exec(str)) {\n\t tag = {\n\t tagName: result[0],\n\t position: result.index\n\t };\n\n\t if (tag.tagName.charAt(1) === '/') {\n\t tag.opener = openers.pop();\n\t } else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {\n\t openers.push(tag);\n\t }\n\n\t tags.push(tag);\n\t }\n\n\t return tags;\n\t },\n\n\t inject: function inject(str, map) {\n\t for (var i = 0, tag = undefined; i < map.length; i++) {\n\t tag = map[i];\n\n\t if (str.length > 0 && tag.position <= str.length) {\n\t str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position);\n\t } else if (tag.opener && tag.opener.position < str.length) {\n\t str += tag.tagName;\n\t }\n\t }\n\n\t return str;\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = [\n\t\t"area",\n\t\t"base",\n\t\t"br",\n\t\t"col",\n\t\t"embed",\n\t\t"hr",\n\t\t"img",\n\t\t"input",\n\t\t"keygen",\n\t\t"link",\n\t\t"menuitem",\n\t\t"meta",\n\t\t"param",\n\t\t"source",\n\t\t"track",\n\t\t"wbr"\n\t];\n\n/***/ }\n/******/ ])\n});\n;\n\n}).call(window);
<<script>>\npostdisplay.hideChoices = function(hideChoices) {\t\n\t$('#choices').hide();\n\tdelete postdisplay[hideChoices];\n}\n<</script>>\n<div class="typed-speed20-delay1000">She told me that the foundations of my tower were weakening. That they were in need of more blood.</div><div id="choices">\n<div class="choice"><<choice [[I told her she could go to hell|Lojka1]]>></div>\n<div class="choice"><<choice [[I asked her to explain|Understood2]]>></div>\n</div>
[[I worked hard|Stink]].
// See http://www.motoslave.net/sugarcube/2/docs/config-object.html\n\nconfig.ui.stowBarInitially = true; // the UI bar will start stowed (shut)
<<set $essence = 2>>\nWell, this king was very [[powerful|Essence]], and so he got all the other kings in the area to help him out by sending laborers to work on his ziggurat. Even so, the project took [[three-hundred years|Bane]]. Fortunately, the ozone layer wasn't so thin back then, so people lived a lot longer than they do today.
[[The secret streets that go down to the sewers|The Empire State Building]]
Then I heard a scream as I walked from the bus stop to my job, and a man fell out of the sky onto a mini cooper that was parked in front of Barnes & Noble. Shattered the windshield. Apparently a suicide. I'm not sure, because I [[didn't stop|Walking]] to look.
[[Eddie's Pizza Truck|Brooklyn Bridge]]
That's just a historical side note, really. The point is that Rasputin was [[impossible to kill|Peasants]].
Just clutched my camera and [[kept on walking|Fall]].
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $essence eq 1>>\n[[A taste of reality|King]] .\n<<endif>>\n<<if $essence eq 2>>\n[[A taste of reality. Why do so many of us want more|Bane]]?\n<<endif>>\n<<if $essence gte 3>>\n[[A taste of reality. Why do many of us want more? ^2000We will end up with less|New York]].\n<<endif>>\n\n\n
// The MIT License (MIT)\n\n// Typed.js | Copyright (c) 2014 Matt Boldt | www.mattboldt.com\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the "Software"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n\n! function($) {\n\n "use strict";\n\n var Typed = function(el, options) {\n\n // chosen element to manipulate text\n this.el = $(el);\n\n // options\n this.options = $.extend({}, $.fn.typed.defaults, options);\n\n // attribute to type into\n this.isInput = this.el.is('input');\n this.attr = this.options.attr;\n\n // show cursor\n this.showCursor = this.isInput ? false : this.options.showCursor;\n\n // text content of element\n this.elContent = this.attr ? this.el.attr(this.attr) : this.el.text()\n\n // html or plain text\n this.contentType = this.options.contentType;\n\n // typing speed\n this.typeSpeed = this.options.typeSpeed;\n\n // add a delay before typing starts\n this.startDelay = this.options.startDelay;\n\n // backspacing speed\n this.backSpeed = this.options.backSpeed;\n\n // amount of time to wait before backspacing\n this.backDelay = this.options.backDelay;\n\n // div containing strings\n this.stringsElement = this.options.stringsElement;\n\n // input strings of text\n this.strings = this.options.strings;\n\n // character number position of current string\n this.strPos = 0;\n\n // current array position\n this.arrayPos = 0;\n\n // number to stop backspacing on.\n // default 0, can change depending on how many chars\n // you want to remove at the time\n this.stopNum = 0;\n\n // Looping logic\n this.loop = this.options.loop;\n this.loopCount = this.options.loopCount;\n this.curLoop = 0;\n\n // for stopping\n this.stop = false;\n\n // custom cursor\n this.cursorChar = this.options.cursorChar;\n\n // shuffle the strings\n this.shuffle = this.options.shuffle;\n // the order of strings\n this.sequence = [];\n\n // All systems go!\n this.build();\n };\n\n Typed.prototype = {\n\n constructor: Typed\n\n ,\n init: function() {\n // begin the loop w/ first current string (global self.strings)\n // current string will be passed as an argument each time after this\n var self = this;\n self.timeout = setTimeout(function() {\n for (var i=0;i<self.strings.length;++i) self.sequence[i]=i;\n\n // shuffle the array if true\n if(self.shuffle) self.sequence = self.shuffleArray(self.sequence);\n\n // Start typing\n self.typewrite(self.strings[self.sequence[self.arrayPos]], self.strPos);\n }, self.startDelay);\n }\n\n ,\n build: function() {\n var self = this;\n // Insert cursor\n if (this.showCursor === true) {\n this.cursor = $("<span class=\s"typed-cursor\s">" + this.cursorChar + "</span>");\n this.el.after(this.cursor);\n }\n if (this.stringsElement) {\n self.strings = [];\n this.stringsElement.hide();\n var strings = this.stringsElement.find('p');\n $.each(strings, function(key, value){\n self.strings.push($(value).html());\n });\n }\n this.init();\n }\n\n // pass current string state to each function, types 1 char per call\n ,\n typewrite: function(curString, curStrPos) {\n // exit when stopped\n if (this.stop === true) {\n return;\n }\n\n // varying values for setTimeout during typing\n // can't be global since number changes each time loop is executed\n var humanize = Math.round(Math.random() * (100 - 30)) + this.typeSpeed;\n var self = this;\n\n // ------------- optional ------------- //\n // backpaces a certain string faster\n // ------------------------------------ //\n // if (self.arrayPos == 1){\n // self.backDelay = 50;\n // }\n // else{ self.backDelay = 500; }\n\n // contain typing function in a timeout humanize'd delay\n self.timeout = setTimeout(function() {\n // check for an escape character before a pause value\n // format: \s^\sd+ .. eg: ^1000 .. should be able to print the ^ too using ^^\n // single ^ are removed from string\n var charPause = 0;\n var substr = curString.substr(curStrPos);\n if (substr.charAt(0) === '^') {\n var skip = 1; // skip atleast 1\n if (/^\s^\sd+/.test(substr)) {\n substr = /\sd+/.exec(substr)[0];\n skip += substr.length;\n charPause = parseInt(substr);\n }\n\n // strip out the escape character and pause value so they're not printed\n curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);\n }\n\n\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t// Auto pause for punctuation.\n\t\t\t\t// -------------------------------------- //\n\t\t\t\tif (curString.charAt(curStrPos - 1) === '.') {\n\t\t\t\t\tif (curString.charAt(curStrPos) !== '.')\n\t\t\t\t\t{\n\t\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (curString.charAt(curStrPos - 1) === '…') {\n\t\t\t\t\tcharPause = 750;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t}\n\t\t\t\tif (curString.charAt(curStrPos - 1) === ':') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === ';') {\n\t\t\t\t\tcharPause = 750;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === ',') {\n\t\t\t\t\tcharPause = 100;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t}\n\n\n if (self.contentType === 'html') {\n // skip over html tags while typing\n var curChar = curString.substr(curStrPos).charAt(0)\n if (curChar === '<' || curChar === '&') {\n var tag = '';\n var endTag = '';\n if (curChar === '<') {\n endTag = '>'\n } else {\n endTag = ';'\n }\n while (curString.substr(curStrPos).charAt(0) !== endTag) {\n tag += curString.substr(curStrPos).charAt(0);\n curStrPos++;\n }\n curStrPos++;\n tag += endTag;\n }\n }\n\n // timeout for any pause after a character\n self.timeout = setTimeout(function() {\n if (curStrPos === curString.length) {\n // fires callback function\n self.options.onStringTyped(self.arrayPos);\n\n // is this the final string\n if (self.arrayPos === self.strings.length - 1) {\n // animation that occurs on the last typed string\n self.options.callback();\n\n self.curLoop++;\n\n // quit if we wont loop back\n if (self.loop === false || self.curLoop === self.loopCount)\n return;\n }\n\n self.timeout = setTimeout(function() {\n self.backspace(curString, curStrPos);\n }, self.backDelay);\n } else {\n\n /* call before functions if applicable */\n if (curStrPos === 0)\n self.options.preStringTyped(self.arrayPos);\n\n // start typing each new char into existing string\n // curString: arg, self.el.html: original text inside element\n var nextString = curString.substr(0, curStrPos + 1);\n if (self.attr) {\n self.el.attr(self.attr, nextString);\n } else {\n if (self.isInput) {\n self.el.val(nextString);\n } else if (self.contentType === 'html') {\n self.el.html(nextString);\n } else {\n self.el.text(nextString);\n }\n }\n\n // add characters one by one\n curStrPos++;\n // loop the function\n self.typewrite(curString, curStrPos);\n }\n // end of character pause\n }, charPause);\n\n // humanized value for typing\n }, humanize);\n\n }\n\n ,\n backspace: function(curString, curStrPos) {\n // exit when stopped\n if (this.stop === true) {\n return;\n }\n\n // varying values for setTimeout during typing\n // can't be global since number changes each time loop is executed\n var humanize = Math.round(Math.random() * (100 - 30)) + this.backSpeed;\n var self = this;\n\n self.timeout = setTimeout(function() {\n\n // ----- this part is optional ----- //\n // check string array position\n // on the first string, only delete one word\n // the stopNum actually represents the amount of chars to\n // keep in the current string. In my case it's 14.\n // if (self.arrayPos == 1){\n // self.stopNum = 14;\n // }\n //every other time, delete the whole typed string\n // else{\n // self.stopNum = 0;\n // }\n\n if (self.contentType === 'html') {\n // skip over html tags while backspacing\n if (curString.substr(curStrPos).charAt(0) === '>') {\n var tag = '';\n while (curString.substr(curStrPos).charAt(0) !== '<') {\n tag -= curString.substr(curStrPos).charAt(0);\n curStrPos--;\n }\n curStrPos--;\n tag += '<';\n }\n }\n\n // ----- continue important stuff ----- //\n // replace text with base text + typed characters\n var nextString = curString.substr(0, curStrPos);\n if (self.attr) {\n self.el.attr(self.attr, nextString);\n } else {\n if (self.isInput) {\n self.el.val(nextString);\n } else if (self.contentType === 'html') {\n self.el.html(nextString);\n } else {\n self.el.text(nextString);\n }\n }\n\n // if the number (id of character in current string) is\n // less than the stop number, keep going\n if (curStrPos > self.stopNum) {\n // subtract characters one by one\n curStrPos--;\n // loop the function\n self.backspace(curString, curStrPos);\n }\n // if the stop number has been reached, increase\n // array position to next string\n else if (curStrPos <= self.stopNum) {\n self.arrayPos++;\n\n if (self.arrayPos === self.strings.length) {\n self.arrayPos = 0;\n\n // Shuffle sequence again\n if(self.shuffle) self.sequence = self.shuffleArray(self.sequence);\n\n self.init();\n } else\n self.typewrite(self.strings[self.sequence[self.arrayPos]], curStrPos);\n }\n\n // humanized value for typing\n }, humanize);\n\n }\n /**\n * Shuffles the numbers in the given array.\n * @param {Array} array\n * @returns {Array}\n */\n ,shuffleArray: function(array) {\n var tmp, current, top = array.length;\n if(top) while(--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n return array;\n }\n\n // Start & Stop currently not working\n\n // , stop: function() {\n // var self = this;\n\n // self.stop = true;\n // clearInterval(self.timeout);\n // }\n\n // , start: function() {\n // var self = this;\n // if(self.stop === false)\n // return;\n\n // this.stop = false;\n // this.init();\n // }\n\n // Reset and rebuild the element\n ,\n reset: function() {\n var self = this;\n clearInterval(self.timeout);\n var id = this.el.attr('id');\n this.el.after('<span id="' + id + '"/>')\n this.el.remove();\n if (typeof this.cursor !== 'undefined') {\n this.cursor.remove();\n }\n // Send the callback\n self.options.resetCallback();\n }\n\n };\n\n $.fn.typed = function(option) {\n return this.each(function() {\n var $this = $(this),\n data = $this.data('typed'),\n options = typeof option == 'object' && option;\n if (!data) $this.data('typed', (data = new Typed(this, options)));\n if (typeof option == 'string') data[option]();\n });\n };\n\n $.fn.typed.defaults = {\n strings: ["These are the default values...", "You know what you should do?", "Use your own!", "Have a great day!"],\n stringsElement: null,\n // typing speed\n typeSpeed: 0,\n // time before typing starts\n startDelay: 0,\n // backspacing speed\n backSpeed: 0,\n // shuffle the strings\n shuffle: false,\n // time before backspacing\n backDelay: 500,\n // loop\n loop: false,\n // false = infinite\n loopCount: false,\n // show cursor\n showCursor: true,\n // character for cursor\n cursorChar: "|",\n // attribute to type (null == text)\n attr: null,\n // either html or text\n contentType: 'html',\n // call when done callback function\n callback: function() {},\n // starting callback function before each string\n preStringTyped: function() {},\n //callback for every typed string\n onStringTyped: function() {},\n // callback for reset\n resetCallback: function() {}\n };\n\n\n}(window.jQuery);\n
by Jordan Magnuson
<<set $blood = 2>>\nSo anyway, they found a dead lamb in front of their delicatessen, with its throat cut open, and the hooves [[ripped from its legs|Blood]]. They tried to stash it away quietly, but some dawn-treading journalist had already gotten an eight-by-ten, and pretty soon the animal rights people were [[rallying|Rallying]] beneath a giant //Eat Fresh!// sign.
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $smoke eq 1>>\n[[Like a puff of smoke which appears for a moment and then disappears|Heaven]].\n<<endif>>\n<<if $smoke gte 2>>\n[[Like a puff of smoke which appears for a moment and then disappears. I should have known better|Babel]].\n<<endif>>\n\n
<<script>>\n\t$('body').addClass('neon-flicker');\n\tneonSign();\n<</script>>\nSome text.\n\n<div class="choice">[[Ask to go back to the beginning|Lojka4]]</div>\n<div class="choice"><<click "Hang up the phone">><<script>>\n\tif (confirm('Close the browser, and leave this nightmare forever?')) {\n\t\tsndNeon.stop();\n\t\tsndWhispers.stop();\n\t\t$('body').removeClass('neon-flicker');\n\t\t$('body').stop(true,true);\n\t\t$('body').fadeTo(0,1);\n\t\tState.play('Hang Up');\n\t}\n\telse {\n\t\tsndCannon.play();\n\t}\n<</script>><</click>></div>
<<set $version = '1.03'>>\n\n<<set $vision = 0>>\n<<set $blood = 0>>\n<<set $spirits = 0>>\n<<set $servant = 0>>\n<<set $smoke = 0>>\n<<set $essence = 0>>\n<<set $shadows = 0>>\n\n<<goto 'Warning'>>
<span class="typed-speed100-delay4000">That is all.</span>
<<set $vision = 3>>\n\nI figure it'll creak a little, then sway to the left, then sway to the right, then just come [[crashing right down|Vision]] on Chase International, shattering windows, sending debris flying, and [[killing probably hundreds of people|Hope]].
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $vision eq 1>>\n[[A vision of hope|Date]].\n<<endif>>\n<<if $vision eq 2>>\n[[A vision of hope. Or denial|Crash]].\n<<endif>>\n<<if $vision eq 3>>\n[[A vision of hope. Or denial. I don't know anymore|Hope]].\n<<endif>>\n<<if $vision gte 4>>\n[[A vision of hope. Or denial. I don't know anymore. Only pray|Kills Things]].\n<<endif>>
<<set $smoke = 1>>\nI took the advice [[to heart|Smoke]], and decided that when I died I would leave behind the largest collection of [[My Little Ponies|Heaven]] the world had ever seen.
<<script>>\n\t$('#bgmask2').css('background-image', 'url("http://jordanmagnuson.s3.amazonaws.com/mslojka/lamb.jpg")');\n\t$('#bgmask2').fadeOut(0);\n<</script>>\n\nSome passage text.
<div class="actor"><div id="lojka"></div></div>\n<<script>>\n\t$('#bgmask2').css('z-index', '0');\n\t$('#bgmask1').css('z-index', '-1');\n\t$('#bgmask2').css('background-image', 'url("babel.jpg")');\n\t$('#bgmask2').hide();\n\tneonSign();\n<</script>>\n<<script>>\n\t$('#bgmask1')\n\t .delay(3000)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("tower.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(600)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("lamb.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(600)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("rasputin.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("ponies.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("babel.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("heart.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tplayRandomGlitchSound(300);\n\t\t$(this).css('background-image', 'url("lojka2.jpg")').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200); \n\t\tnext(); \n\t })\n\t .delay(300)\n\t .queue(function (next) { \n\t\tsndScream01.play();\n\t\tplayRandomGlitchSound(500);\n\t\t$(this).css('background-image', 'url("lojka1.jpg")').fadeIn(0).fadeOut(10000); \n\t\tnext(); \n\t })\n<</script>>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n\tsetTimeout(function() { \n\t\tsndWhispers.play();\n\t\tsndWhispers.fade(0, 0.6, 10000); \n\t}, 16000);\n\t$('.passage').hide();\n\t$('.passage').delay(18000).fadeIn(0);\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .9\n }), t.addScene(20000, "lojka: Dearie,", 1000, " dearie.", 1000, " Have you forgotten what sort of bricks you used to build this tower,", 80, " and why I built", -7, "you built it here in this great teeming city?", 1500, " Or do you still tell yourself that it was an African king who built Babel"), \n\t\tt.addScene(function (done) {\n\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(200).fadeIn(0).fadeOut(300).fadeIn(0).fadeOut(10000);\n\t\t\tsndNeon.play();\n\t\t\tdone();\n\t\t }),\t\t\n\t\tt.addScene("?", 1500), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Lojka3');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[sceneSetup]\n}\n<</script>>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("ponies.jpg")');\n\t$('#bgmask2').hide().delay(2000).fadeIn(5000);\n<</script>>\n\n[[Someone|Grandmother]] once told me that we are what we leave behind.
[[The neon signs that bleed into the sky|The Lincoln Center]]
<<set $vision = 2>>\n\nWhenever it dates from, the thing should have been demolished years ago. Anyone can see it's about to topple, and [[when it does|Vision]], it'll come down with a [[crash|Crash]]. It must be two-hundred feet high and it's just sitting there in the heart of New York, right across from Subway and Barnes & Noble.
<<set $servant = 3>>\nBig black wings, with claws sticking out here and there, just like the kind you see on Gothic gargoyle statues. She [[scared me|Servant]] pretty bad.
"[[Down with the witch!|Down]]" the mob cried.
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $servant eq 1>>\n[[I am servant to my shadow|Voice]].\n<<endif>>\n<<if $servant eq 2>>\n[[I am servant to my shadow. No. No|Interfere]].\n<<endif>>\n<<if $servant gte 3>>\n[[I am servant to my shadow. No. ^2000No. I will not accept that|Scout]].\n<<endif>>\n\n\n
<div class="actor"><div id="lojka"></div></div>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n var t = theaterJS({\n minSpeed: { erase: 30, type: 50 },\n maxSpeed: { erase: 100, type: 300 }\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: .79,\n speed: .7\n });\n\tdo {\n\t\tvar leftArray = Array('I am ', 'You are ', 'We are ');\n\t\tshuffle(leftArray);\n\t\tvar leftMistake = leftArray.pop();\n\t\tvar leftReplace = leftArray.pop();\n\t}\n\twhile (leftReplace == state.active.variables.leftReplace);\n\tstate.active.variables.leftReplace = leftReplace;\n\tdo {\n\t\tvar rightArray = Array('I must ', 'you must ', 'we must ');\n\t\tshuffle(rightArray);\n\t\tvar rightMistake = rightArray.pop();\n\t\tvar rightReplace = rightArray.pop();\n\t}\n\twhile (rightReplace == state.active.variables.rightReplace);\n\tstate.active.variables.rightReplace = rightReplace;\n\tt.addScene(1000, "lojka: " + leftMistake, -leftMistake.length, leftReplace + "Ms. Lojka,", 200, " my precious,", 300, " and such has always been the price " + rightMistake, -rightMistake.length, rightReplace + "pay for living.", 1000); \n\tt.addScene("lojka: "); \n\tt.addScene(function (done) {\n\t\tState.play('Lojka8');\n\t\tdone();\n\t });\n};\nfunction shuffle(a) {\n var j, x, i;\n for (i = a.length; i; i -= 1) {\n j = Math.floor(Math.random() * i);\n x = a[i - 1];\n a[i - 1] = a[j];\n a[j] = x;\n }\n}\n<</script>>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("lojka2.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\nI didn't know it was Ms. Lojka's voice; I thought I was simply talking to myself. I was rather [[proud of the idea|Worked]] in fact—proud that nobody else had thought to build such a [[marvelous medieval fortress|Worked]] across the street from Chase International.
[[The skeleton of Brooklyn Bridge|The Botanic Gardens]]
[[The tourists with all their small cameras inside their big cameras|The Bronx Zoo]]
<div id="choices">\n<div class="choice">[[Ask to go back to the beginning|Lojka4]]</div>\n<div class="choice"><<click "Hang up the phone">><<script>>\n\tif (confirm('Close the browser, and leave this story forever?')) {\n\t\tvar win = window.open('https://docs.google.com/document/d/1MgAYp8GmoEGu0lBrY3ELWzXf1tJxWxhg3n-OIoYIBtI/edit', '_blank');\n\t\tif (win) {\n\t\t\twin.focus();\n\t\t} else {\n\t\t\tState.play('Hang Up');\n\t\t}\n\t\t\n\t}\n<</script>><</click>></div>\n</div>
[[Lojka1]]\n[[Lojka2]]\n[[Lojka3]]\n[[Lojka4]]\n[[Lojka5]]\n[[Lojka6]]\n[[Lojka7]]\n[[Lojka8]]
<<set $shadows = 1>>\nI don't mean that I kind of like it, or something; I don't mean that, given a choice of where to live, hey, it might as well be New York. I mean that I //love// [[New York City|Central Park]]. It's part of my [[soul|Shadows]].
[[The smell of my bench at the edge of Central Park|The American Museum of Natural History]]
They kept on that way for a while, until they got so excited that they had to really [[do something|Matt]].
<<set $spirits = 3>>\nPersonally, I think Rasputin was a [[demon|Spirits]].
<<script>>\n\t$('#ui-bar').css('display', 'block');\n<</script>>\n\n<span id="beginbutton" class="fadein">\n<<click "Begin Ending Sequence">><<script>>\n$.when( fullscreen() ).done( state.play("Favor") );\n<</script>><</click>>\n</span>\n\n<br/><br/>\nversion $version
"[[Down with the animal tormentor!|Down2]]"
/* Set fullscreen background to the same color as the body background. */\n:-webkit-full-screen { background-color: black; }\n:-moz-full-screen { background-color: black;; }\n:-ms-fullscreen { background-color: black; }\n:fullscreen { background-color: black; }\n\n/* Embedded typewriter font. */\n@font-face {\n font-family: 'MyTyped';\n src: url('SpecialElite.ttf') format('truetype');\n font-weight: normal;\n font-style: normal;\n}\n\n/* Preloading images. */\n#preload-01 { background: url('lojka1.jpg') no-repeat -9999px -9999px; }\n#preload-02 { background: url('babel.jpg') no-repeat -9999px -9999px; }\n#preload-03 { background: url('heart.jpg') no-repeat -9999px -9999px; }\n#preload-04 { background: url('lamb.jpg') no-repeat -9999px -9999px; }\n#preload-05 { background: url('lojka1.jpg') no-repeat -9999px -9999px; }\n#preload-06 { background: url('lojka2.jpg') no-repeat -9999px -9999px; }\n#preload-07 { background: url('ponies.jpg') no-repeat -9999px -9999px; }\n#preload-08 { background: url('rasputin.jpg') no-repeat -9999px -9999px; }\n#preload-09 { background: url('tower.jpg') no-repeat -9999px -9999px; }\n#preload-10 { background: url('document_body_middle.png') no-repeat -9999px -9999px; }\n#preload-11 { background: url('document_body_top.png') no-repeat -9999px -9999px; }\n#preload-12 { background: url('document_top_left.png') no-repeat -9999px -9999px; }\n#preload-13 { background: url('document_top_repeat.png') no-repeat -9999px -9999px; }\n#preload-14 { background: url('document_top_right.png') no-repeat -9999px -9999px; }\n\n.red {\n\tcolor: red!important;\n}\n\nhtml {\n\theight: 100%;\n\tposition: relative;\n\ttransition: none;\n}\n\nbody { \n\tfont-family: MyTyped,Lucida Sans Typewriter,Lucida Console,monaco,Bitstream Vera Sans Mono,monospace; \n\tbackground-color: yellow;\n\tbackground-image: background-image: url('black_background.png');\n\tbackground-color: black;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center center;\n\t/* Cover the whole screen. */\n -webkit-background-size: cover;\n -moz-background-size: cover;\n -o-background-size: cover;\n background-size: cover;\n}\n\n#version {\n\tcolor: white;\n\tposition: fixed;\n\tright: 2em;\n\tbottom: 2em;\n\tz-index: 10;\n\ttext-align: right;\n}\n\n#bgmask1 {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-image: background-image: url('black_background.png');\n\tbackground-color: black;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center center;\n\t/* Cover the whole screen. */\n -webkit-background-size: cover;\n -moz-background-size: cover;\n -o-background-size: cover;\n background-size: cover;\n}\n\n#bgmask2 {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-image: background-image: url('black_background.png');\n\tbackground-color: black;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center center;\n\t/* Cover the whole screen. */\n -webkit-background-size: cover;\n -moz-background-size: cover;\n -o-background-size: cover;\n background-size: cover;\n\topacity: 0;\n}\n\nbody.bgmask2 #bgmask2 {\n\topacity: 1;\n}\n\nbody.black #bgmask1 {\n\tbackground-image: url('black_background.png');\n}\n\nbody.tower #bgmask1 {\n\tbackground-image: url('tower.jpg');\n}\n\nbody.lamb #bgmask1 {\n\tbackground-image: url('lamb.jpg');\n}\n\nbody.rasputin #bgmask1 {\n\tbackground-image: url('rasputin.jpg');\n}\n\nbody.lojka1 #bgmask1 {\n\tbackground-image: url('lojka1.jpg');\n}\n\nbody.lojka2 #bgmask1 {\n\tbackground-image: url('lojka2.jpg');\n}\n\nbody.babel #bgmask1 {\n\tbackground-image: url('babel.jpg');\n}\n\nbody.ponies #bgmask1 {\n\tbackground-image: url('ponies.jpg');\n}\n\nbody.heart #bgmask1 {\n\tbackground-image: url('heart.jpg');\n}\n\nbody.document {\n\tbackground-color: #eeeeee;\n}\n\nbody.document #top-repeat {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 0;\n\tbackground: url('document_top_repeat.png') top left repeat-x;\n}\n\nbody.document #top-left {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 1;\n\tbackground: url('document_top_left.png') top left no-repeat;\n}\n\nbody.document #top-right {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 2;\n\tbackground: url('document_top_right.png') top right no-repeat;\n}\n\nbody.document #document-body-top {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 1;\n\tbackground: url('document_body_top.png') center 166px no-repeat;\n}\n\nbody.document #document-body-middle {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 0;\n\tbackground: url('document_body_middle.png') top center repeat-y;\n}\n\nbody.document #anonymous-sparrow {\n\tposition: absolute;\n\twidth: 25px;\n\theight: 30px;\n\tz-index: 5;\n\tbackground: url('anonymous_sparrow.png') no-repeat;\n\ttop: 96px;\n\tright: 126px;\n}\n\nbody.document #anonymous-sparrow-tag {\n\tposition: absolute;\n\twidth: 132px;\n\theight: 34px;\n\tz-index: 6;\n\tbackground: url('anonymous_sparrow_tag.png') no-repeat;\n\ttop: 121px;\n\tright: 75px;\n}\n\nbody.document .passage {\n top: 220px;\n width: 100%;\n\tleft: 0;\n\tmargin: 0;\n font-family: Verdana, Geneva, sans-serif;\n color: #232323;\n background-color: rgba(0,0,0,0);\n font-size: 0.8em;\n}\n\nbody.document .super-outer.passage-wrapper {\n\tposition: relative;\n\n}\n\n/* Theaterjs. */\n.actor {\n\tdisplay: block;\n\tmargin: auto;\n}\n\nbody.document .actor {\n\twidth: 640px;\n\tline-height: 2.2;\n}\n\n#lojka {\n\tdisplay: inline;\n}\n\n /** Blinking cursor effect seems to break on some multi-line paragraphs. **/\n /**\n#lojka::after {\n content: '| ';\n\t-webkit-animation: blink 1.5s infinite;\n\t-moz-animation: blink 1.5s infinite;\n\tanimation: blink 1.5s infinite;\n}\n\nbody.document #lojka::after {\n content: '';\n}\n**/\n\nbody.document .typed-cursor {\n background: url('gdocs_cursor.png') no-repeat;\n height: 20px;\n width: 6px;\n\t-webkit-animation: none;\n\t-moz-animation: none;\n\tanimation: none;\n margin-bottom: -2px;\n}\n\nbody.document #lojka {\n\tbackground-image: url('gdocs_cursor.png');\n\tbackground-repeat: no-repeat;\n\tbackground-position: right;\n\tpadding-right: 6px;\n\tpadding-top: 6px;\n}\n\n\n/** \n// Working with typing cursor:\nbody.document .passage {\n top: 20%;\n width: 38%;\n min-width: 200px;\n left: 60%;\n font-family: Verdana, Geneva, sans-serif;\n color: #232323;\n background-color: rgba(0,0,0,0);\n font-size: 0.8em;\n}\n\n// NOT working with typing cursor:\nbody.document .passage {\n\tposition: relative;\n\ttop: 220px;\n\twidth: 680px;\n\tmin-width: 200px;\n\tleft: auto;\n\tright: auto;\n\tmargin: auto;\n\tfont-family: Verdana, Geneva, sans-serif;\n\tcolor: #232323;\n\tbackground-color: rgba(0,0,0,0);\n\tfont-size: 0.8em;\n}\n**/\n\n/**\nbody.document #bgmask1 {\n\tbackground-image: url('document.png');\n\tbackground-position: top center;\n}\n\nbody.document .passage {\n\ttop: 20%;\n\twidth: 38%;\n\tmin-width: 200px;\n\tleft: 60%;\n\tfont-family: Verdana, Geneva, sans-serif;\n\tcolor: #232323;\n\tbackground-color: rgba(0,0,0,0);\n\tfont-size: 0.8em;\n}\n**/\n\n/**\nbody.document .super-outer-passage-wrapper::after {\n content: '|';\n\t-webkit-animation: blink 1.5s infinite;\n\t-moz-animation: blink 1.5s infinite;\n\tanimation: blink 1.5s infinite;\n}\n**/\n\n\n#story {\n\ttransition: none;\n\tmargin: 0!important;\n}\n\n#story .notype a {\n\tcolor: white;\n\tborder-bottom: 1px dashed white;\n}\n\n#story .notype a:hover {\n\tcolor: white;\n\tborder-bottom: 1px dashed white;\n\ttext-decoration: none;\n}\n\n#passages {\n\ttransition: none;\n}\n\n.passage {\n\ttransition: none!important;\n position: absolute;\n bottom: 10%;\n width: 60%;\n\tmin-height: 14em;\n\tbackground-color:rgba(0, 0, 0, 0.7);\n\tleft: 50%;\n\tmargin-left: -30%;\n}\n\nbody.end .passage {\n\tbackground-color:rgba(0, 0, 0, 0);\n}\n\n/* Warning */\n#passage-warning {\n\ttop: 25%;\n\tbottom: auto;\n\twidth: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tleft: 0;\n\tfont-size: 1.2em;\n}\n\n#passage-warning .super-outer-passage-wrapper {\n\twidth: 400px;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n#passage-warning .button {\n\tmargin-top: 1em;\n\tfont-size: 1em;\n}\n\n/* Title Page */\n\n.title .passage {\n\ttop: 10%;\n\tbottom: auto;\n\twidth: auto;\n\tmin-height: 338px;\n\tpadding: 0.5em;\n}\n\n.title .passage .title {\n\tfont-size: 2em;\n\tdisplay: block;\n\tmargin-bottom: 0;\n\tline-height: 1;\n}\n\n.title .passage .subtitle {\n\tfont-size: 1.2em;\n\tdisplay: block;\n\tmargin-bottom: 1em;\n}\n\n.title .passage .byline {\n\tfont-size: 1.2em;\n\tdisplay: block;\n\tpadding-top: 2em;\n}\n\n.title .passage .illustratedbyline {\n\tfont-size: 1em;\n\tdisplay: block;\n}\n\n.passage .button {\n\tfont-size: 1.2em;\n\tdisplay: block;\n\tpadding: 1em;\n\tpadding-left: 0;\n}\n\n.title .passage .button {\n\tfont-size: 1.2em;\n\topacity: 0;\n\tdisplay: block;\n\tpadding: 1em;\n\tpadding-left: 0;\n\tpadding-bottom: 0.5em;\n}\n\n.passage .button a {\n\tborder: 1px solid white !important;\n\tpadding: 0.7em 2em;\n\ttext-decoration: none;\n}\n\n.passage .button a:hover {\n\tbackground-color: rgba(255, 255, 255, 0.2)\n}\n\n.title .passage .typed-cursor {\n\tdisplay: none;\n}\n\n.nocursor .passage .typed-cursor {\n\tdisplay: none;\n}\n\n.between .passage .typed-cursor {\n\tdisplay: none;\n}\n\n/* Remove UI bar. */\n#ui-bar {\n\tdisplay: none;\n}\n\n.document #ui-bar {\n\tdisplay: none;\n}\n\n#ui-bar #menu-item-saves {\n\t/**display: none!important;**/\n}\n\n.typed {\n}\n\n.typed a, #story .notype .typed a {\n color: white!important;\n\ttext-decoration: none!important;\n\tcursor: default!important;\n\n\t-webkit-animation:displayLink ease-in 500ms; /* call our keyframe named fadeIn, use animattion ease-in and repeat it only 1 time */\n\t-moz-animation:displayLink ease-in 500ms;\n\tanimation:displayLink ease-in 500ms;\n \n\t-webkit-animation-fill-mode:forwards; /* this makes sure that after animation is done we remain at the last keyframe value (opacity: 1)*/\n\t-moz-animation-fill-mode:forwards;\n\tanimation-fill-mode:forwards;\n \n\t-webkit-animation-duration:2s;\n\t-moz-animation-duration:2s;\n\tanimation-duration:2s;\n\n\t-webkit-animation-delay:1500ms;\n\t-moz-animation-delay:1500ms;\n\tanimation-delay:1500ms;\n\n\tborder-bottom: 1px dashed rgba(0, 0, 0, 0);\n}\n\nbody.between a {\n color: white!important;\n\n\t-webkit-animation:none;\n\t-moz-animation:none;\n\tanimation:none;\n \n\t-webkit-animation-duration:none;\n\t-moz-animation-duration:none;\n\tanimation-duration:none;\n\tborder-bottom: none!important;\n}\n\nbody.between .passage {\n\tfont-style: italic;\n}\n\nbody.italic .passage {\n\tfont-style: italic;\n}\n\n.typed-original {\n\topacity: 0;\n\tcolor: white;\n\tdisplay: none;\n}\n\n\n/* \n * Choices.\n */\n\n#choices {\n\tpadding-left: 1em;\n\tpadding-top: 1em;\n\tline-height: 2;\n}\n\n#choices .choice::before {\n\tcontent: "> ";\n}\n\n/* \n * Animation stuff. See https://fabriceleven.com/design/creating-fancy-css3-fade-in-animations-on-page-load/ \n */\n@-webkit-keyframes displayLink { from {border-color: rgba(0, 0, 0, 0);} to {border-color: white;} }\n@-moz-keyframes displayLink { from {border-color: rgba(0, 0, 0, 0);} to {border-color: white;} }\n@keyframes displayLink { from {border-color: rgba(0, 0, 0, 0);} to {border-color: white;} }\n\n@-webkit-keyframes linkFadeIn { from {color: rgba(240,70,60,0);} to {color: rgba(240,70,60,1);} }\n@-moz-keyframes linkFadeIn { from {color: rgba(240,70,60,0);} to {color: rgba(240,70,60,1);} }\n@keyframes linkFadeIn { from {color: rgba(240,70,60,0);} to {color: rgba(240,70,60,1);} }\n\n@-webkit-keyframes linkFadeOut { from {opacity: 1;} to {opacity: 0;} }\n@-moz-keyframes linkFadeOut { from {opacity: 1;} to {opacity: 0;} }\n@keyframes linkFadeOut { from {opacity: 1;} to {opacity: 0;} }\n\n@-webkit-keyframes fadeIn { from { opacity:0; } to { opacity:1; } }\n@-moz-keyframes fadeIn { from { opacity:0; } to { opacity:1; } }\n@keyframes fadeIn { from { opacity:0; } to { opacity:1; } }\n \n.fadein {\n\topacity:0; /* make things invisible upon start */\n\t-webkit-animation:fadeIn ease-in 1; /* call our keyframe named fadeIn, use animattion ease-in and repeat it only 1 time */\n\t-moz-animation:fadeIn ease-in 1;\n\tanimation:fadeIn ease-in 1;\n \n\t-webkit-animation-fill-mode:forwards; /* this makes sure that after animation is done we remain at the last keyframe value (opacity: 1)*/\n\t-moz-animation-fill-mode:forwards;\n\tanimation-fill-mode:forwards;\n \n\t-webkit-animation-duration:1s;\n\t-moz-animation-duration:1s;\n\tanimation-duration:1s;\n}\n\n.fadein.slow {\n\t-webkit-animation-delay: 10s;\n\t-moz-animation-delay: 10s;\n\tanimation-delay: 10s;\n\t-webkit-animation-duration:3s;\n\t-moz-animation-duration:3s;\n\tanimation-duration:3s;\n}\n\n/* Typed.js text (and cursor) styling. */\n.typed, .typed-cursor {\n}\n\n/* Typed.js animated cursor styling. */\n.typed-cursor {\n\tdisplay: inline-block;\n\toverflow: visible;\n\topacity: 1;\n\t-webkit-animation: blink 1.5s infinite;\n\t-moz-animation: blink 1.5s infinite;\n\tanimation: blink 1.5s infinite;\n}\n@keyframes blink {\n\t0% { opacity: 1; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@-webkit-keyframes blink {\n\t0% { opacity: 1; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@-moz-keyframes blink {\n\t0% { opacity: 1; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n\n/* Duplicate text hack to get typed.js links to be clickable. \n * See https://twinery.org/forum/discussion/comment/15102/#Comment_15102\n */\n\n.super-outer-passage-wrapper {\n\tpadding: 2em;\n}\n\n.typed-original {\n\tpadding: 2em;\t/* Note: this needs to be the same as the .super-outer-passage-wrapper padding */\n\tpadding-bottom: 0;\n}\n\n/* Dupe passages are used if we want to have links in theaterjs text. */\n.dupe {\n\tcolor: rgba(0,0,0,0);\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 2em;\n\tpadding-bottom: 0;\n}\n\n#story .dupe a {\n\tcolor: rgba(0,0,0,0);\n\tborder-bottom: 1px dashed white;\n}\n\n#story .dupe a:hover {\n\tcolor: rgba(0,0,0,0);\n}
<<script>>\n\t$('#bgmask2').css('background-image', 'url("heart.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n\n<span class="typed-speed10-delay1500">[[I^1500 love^1500 New York^1500 City^1500|Love]].</span>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').hide().delay(3000).fadeIn(5000);\n<</script>>\n\nMs. Lojka lives at the top of a [[tall tower|Tower]] that stands like a broken-down sentry in the middle of New York City.
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $spirits eq 1>>\n[[Spirits fighting for our souls|Historical]].\n<<endif>>\n<<if $spirits eq 2>>\n[[Spirits fighting for our souls. Or are they all against us|Demon]]?\n<<endif>>\n<<if $spirits gte 3>>\n[[Spirits fighting for our souls. Or are they all against us? Are they in my mind|Made It]]?\n<<endif>>\n\n\n
[[The graffiti|Soul]]
<<set $smoke = 2>>\nI was confident that this plan was [[foolproof|Smoke]].
/*! typed.js integration module for SugarCube */ ! function() {\n "use strict";\n var getInlineOptions = function(classNames) {\n var match, options = {},\n typedRe = /^typed(?:-(\sw+))+\sb$/,\n parseRe = /-(speed|delay)(\sd+)\sb/g;\n if ("typed" !== classNames) {\n classNames = classNames.toLowerCase().split(/\ss+/);\n for (var i = 0; i < classNames.length; i++)\n if (typedRe.test(classNames[i])) {\n for (; null !== (match = parseRe.exec(classNames[i]));) switch (match[1]) {\n case "speed":\n options.typeSpeed = +match[2];\n break;\n case "delay":\n options.startDelay = +match[2]\n }\n break\n }\n }\n return options\n },\n typedCallbackFactory = function(el, callback) {\n\t\t\tvar outer = jQuery(el);\n\t\t\tvar inner = jQuery('<div class="typedjs-text-wrapper" style="display:block;position:absolute;left:0;top:0;"><span class="typed"></span></div>');\n\t\t\tvar source = outer.children('[class|="typed"]');\n\t\t\tif (tags().contains('between')) {\n\t\t\t\tvar strings = source.text().replace(/\s./g, ".@");\n\t\t\t\tstrings = strings.replace(/\s?/g, "?@");\n\t\t\t\tstrings = strings.split('@');\n\t\t\t\tif (strings.length > 1) {\n\t\t\t\t\tstrings.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar strings = [source.html()];\n\t\t\t}\n return function() {\n var $outer = outer,\n $inner = inner,\n $source = source,\n\t\t\t\t\t$strings = strings,\n options = jQuery.extend({\n typeSpeed: 20,\n startDelay: 1000\n }, getInlineOptions($source.attr("class")), {\n strings: $strings\n });\n "function" == typeof callback && (options.callback = callback), $outer.append($inner), $inner.children().typed(options)\n }\n };\n postrender.typedSetupHandler = function(content) {\n\t\t//----------------------------------------------------------------------\n\t\t// CUSTOM HACK: Apply typed class to every passage.\n\t\tvar typedSpeed = 20;\n\t\tvar typedDelay = 1000;\n\t\tvar autoTyped = true;\n\t\tvar currentPassage = Story.get(state.passage);\n\t\tif (state.passage == 'Title') {\n\t\t\tautoTyped = false;\n\t\t}\n\t\tif ( tags().contains('notype') ) {\n\t\t\tautoTyped = false;\n\t\t}\n\t\tif (autoTyped) {\n\t\t\tjQuery(content).wrapInner('<div class="typed-speed' + typedSpeed + '-delay' + typedDelay + '" />');\n\t\t}\n\t\tvar source = jQuery('[class|="typed"]', content);\n\t\tvar sourceHTML = source.html();\n\t\tvar sourceClasses = source.attr('class');\n\t\t//var cleanedHTML = sourceHTML.replace(/\s^\sd+/g,'');\t// Remove typedjs pauses (e.g. ^1000).\n\t\t//jQuery('[class|="typed"]', content).html().replace(/\s^\sd+/g,'');\n\t\t//source.html(cleanedHTML);\n\t\tsource.attr('class', 'typed-original').css({'position': 'absolute', 'top': 0, 'left': 0}).before('<div class="typedjs-outer-wrapper" style="display:block;position:relative;"><div style="visibility:hidden;" class="' + sourceClasses + ' typed">' + sourceHTML + '</div></div>').prev().andSelf().wrapAll('<div class="typedjs-outer-outer-wrapper" />');\n\t\t\n\t\t// Make a super outer wrapper for ALL passages, for padding purposes.\n\t\tjQuery(content).wrapInner('<div class="super-outer-passage-wrapper" />');\n\t\t//----------------------------------------------------------------------\n }, postdisplay.typedAnimationHandler = function() {\n for (var $elements = jQuery("#passages .typedjs-outer-wrapper"), callback = null, i = $elements.length - 1; i >= 0; --i) callback = typedCallbackFactory($elements[i], callback);\n "function" == typeof callback && callback();\n }\n}();
<<script>>\n\t$('#bgmask2').css('background-image', 'url("babel.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n\nHave you ever heard of the [[Tower of Babel|Big]]?
<<set $essence = 3>>\nLuckily, God destroyed it for him, so the king [[died in peace|Essence]].
I hope I'm around when it happens. I'd really like to get those [[photos|Photos]].
[[The cats with the big heads|Times Square]]
<<script>>\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').hide().delay(500).fadeIn(5000);\n<</script>>\n\n[[My|Never End][$endhide to 1]]\n[[tower's|Never End][$endhide to 2]]\n[[never|Never End][$endhide to 3]]\n[[going|Never End][$endhide to 4]]\n[[to|Never End][$endhide to 5]]\n[[fall|Never End][$endhide to 6]].\n
Anyway, when the ziggurat was finally finished, this king (whose name, by the way, was Og) realized that it was a [[bane to God|Peace]], because it was so high and so beautiful.
<<set $vision = 4>>\nI think I have a pretty good chance, because hey, I work at Barnes & Noble, and I carry my camera with me everywhere I go. I figure I'll hear the creaking, turn around, and snap away. Of course, if the tower falls westwardly I'm screwed, but I've got [[the odds|Vision]] on my side.
<<script>>\n\t$('#bgmask2').hide();\n<</script>>\n<<if $blood eq 1>>\n[[Blood|Lamb]].\n<<endif>>\n<<if $blood eq 2>>\n[[Blood. I am an heir to blood|Rallying]].\n<<endif>>\n<<if $blood eq 3>>\n[[Blood. I am heir to the blood I have taken from others|Bat]].\n<<endif>>\n<<if $blood eq 4>>\n[[Blood. I am heir to the blood I have taken from others. But that is not me|Bam]].\n<<endif>>\n<<if $blood gte 5>>\n[[Blood. I am heir to the blood I have taken from others. But that is not me. No, that is not me|Rasputin]].\n<<endif>>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("tower.jpg")');\n\t$('#bgmask2').hide().delay(500).fadeIn(5000);\n<</script>>\n\n[[One|Fall End][$endhide to 1]]\n[[day|Fall End][$endhide to 2]]\n[[that|Fall End][$endhide to 3]]\n[[tower's|Fall End][$endhide to 4]]\n[[going|Fall End][$endhide to 5]]\n[[to|Fall End][$endhide to 6]]\n[[fall|Fall End][$endhide to 7]].\n
He chose a ziggurat because in [[those days|King]], before elevators, ziggurats were the easiest kinds of buildings to climb—and when you're talking ten-thousand feet, that kind of thing matters.
<div id="lojka"></div>\n<<script>>\npostdisplay.sceneSetup = function(e) {\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 300\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: 1,\n speed: .4\n }), t.addScene(1000, "lojka: The en", 3000, -6, 3000), \n\t\tt.addScene(function (done) {\n\t\t\tState.play('Second Ring');\n\t\t\tdone()\n\t\t }),\n\t\tdelete postdisplay[e]\n};\n<</script>>
Some sample text.
<<set $shadows = 2>>\n<div class="actor"><div id="lojka"></div></div>\n<<script>>\npostdisplay.sceneSetup = function(sceneSetup) {\n\t$('#lojka').after('<span class="typed-cursor">|</span>');\n\t$('.dupe').fadeOut(0);\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 500\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: 1,\n speed: 0.95\n }), t.addScene(1000, "lojka: These are the things that make up my soul's structure.", 1000, " And inside—", 600, "the things that make up my soul's substance—", 500, "are the people who walk the streets and tend the delis.", 900, " I devour", function (done) {$('#bgmask1').fadeOut(0).fadeIn(200);done()}, -6, " love them all;", 500, " even people like Matt,", 80, " protector of the lambs."), \n\t\tt.addScene(function (done) {\n\t\t\t$('.dupe').delay(1500).fadeIn(2000);\n\t\t\tdone()\n\t\t }),\t\t\n\t\tdelete postdisplay[sceneSetup]\n};\n<</script>>\n\n<div class="dupe">These are the things that make up my soul's [[structure|Shadows]]. And inside--the things that make up my soul's [[substance|Shadows]]--are the people who walk the streets and tend the delis. I love them all; even people like Matt, protector of the lambs.</div>
<<set $spirits = 1>>\nHe killed his fiancé, Sophie von Anhalt-Zerbst, because he feared that his [[love|Spirits]] for her would consume him and make him weak. Then he turned the [[entire population|Historical]] of Russia into peasants, forcing them to work in the rice fields [[day and night|Historical]].
// The MIT License (MIT)\n\n// Typed.js | Copyright (c) 2014 Matt Boldt | www.mattboldt.com\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the "Software"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// ------------- Added Hack ------------- //\n// Sound related stuff.\n// ------------- Added Hack ------------- //\nvar everyOther = 1;\nvar playSound = true;\n// ------------- End Added Hack ------------- //\n\n\n! function($) {\n\n "use strict";\n\n var Typed = function(el, options) {\n\n // chosen element to manipulate text\n this.el = $(el);\n\n // options\n this.options = $.extend({}, $.fn.typed.defaults, options);\n\n // attribute to type into\n this.isInput = this.el.is('input');\n this.attr = this.options.attr;\n\n // show cursor\n this.showCursor = this.isInput ? false : this.options.showCursor;\n\n // text content of element\n this.elContent = this.attr ? this.el.attr(this.attr) : this.el.text()\n\n // html or plain text\n this.contentType = this.options.contentType;\n\n // typing speed\n this.typeSpeed = this.options.typeSpeed;\n\n // add a delay before typing starts\n this.startDelay = this.options.startDelay;\n\n // backspacing speed\n this.backSpeed = this.options.backSpeed;\n\n // amount of time to wait before backspacing\n this.backDelay = this.options.backDelay;\n\n // div containing strings\n this.stringsElement = this.options.stringsElement;\n\n // input strings of text\n this.strings = this.options.strings;\n\n // character number position of current string\n this.strPos = 0;\n\n // current array position\n this.arrayPos = 0;\n\n // number to stop backspacing on.\n // default 0, can change depending on how many chars\n // you want to remove at the time\n this.stopNum = 0;\n\n // Looping logic\n this.loop = this.options.loop;\n this.loopCount = this.options.loopCount;\n this.curLoop = 0;\n\n // for stopping\n this.stop = false;\n\n // custom cursor\n this.cursorChar = this.options.cursorChar;\n\n // shuffle the strings\n this.shuffle = this.options.shuffle;\n // the order of strings\n this.sequence = [];\n\n // All systems go!\n this.build();\n };\n\n Typed.prototype = {\n\n constructor: Typed\n\n ,\n init: function() {\n // begin the loop w/ first current string (global self.strings)\n // current string will be passed as an argument each time after this\n var self = this;\n self.timeout = setTimeout(function() {\n for (var i=0;i<self.strings.length;++i) self.sequence[i]=i;\n\n // shuffle the array if true\n if(self.shuffle) self.sequence = self.shuffleArray(self.sequence);\n\n // Start typing\n self.typewrite(self.strings[self.sequence[self.arrayPos]], self.strPos);\n }, self.startDelay);\n }\n\n ,\n build: function() {\n var self = this;\n // Insert cursor\n if (this.showCursor === true) {\n this.cursor = $("<span class=\s"typed-cursor\s">" + this.cursorChar + "</span>");\n this.el.after(this.cursor);\n }\n if (this.stringsElement) {\n self.strings = [];\n this.stringsElement.hide();\n var strings = this.stringsElement.find('p');\n $.each(strings, function(key, value){\n self.strings.push($(value).html());\n });\n }\n this.init();\n }\n\n // pass current string state to each function, types 1 char per call\n ,\n typewrite: function(curString, curStrPos) {\n // exit when stopped\n if (this.stop === true) {\n return;\n }\n\n // varying values for setTimeout during typing\n // can't be global since number changes each time loop is executed\n var humanize = Math.round(Math.random() * (100 - 30)) + this.typeSpeed;\n var self = this;\n\n // ------------- optional ------------- //\n // backpaces a certain string faster\n // ------------------------------------ //\n // if (self.arrayPos == 1){\n // self.backDelay = 50;\n // }\n // else{ self.backDelay = 500; }\n\n // contain typing function in a timeout humanize'd delay\n self.timeout = setTimeout(function() {\n // check for an escape character before a pause value\n // format: \s^\sd+ .. eg: ^1000 .. should be able to print the ^ too using ^^\n // single ^ are removed from string\n var charPause = 0;\n var substr = curString.substr(curStrPos);\n if (substr.charAt(0) === '^') {\n var skip = 1; // skip atleast 1\n if (/^\s^\sd+/.test(substr)) {\n substr = /\sd+/.exec(substr)[0];\n skip += substr.length;\n charPause = parseInt(substr);\n }\n\n // strip out the escape character and pause value so they're not printed\n curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);\n }\n\n\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t// Experiment to auto pause and strip out punctuation.\n\t\t\t\t// -------------------------------------- //\n\t\t\t\t/**\n\t\t\t\tvar multiplier = Math.random() * (1.5 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\tif (substr.charAt(0) === '.') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (substr.charAt(0) === '…') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (substr.charAt(0) === '—') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (substr.charAt(0) === ':') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (substr.charAt(0) === ';') {\n\t\t\t\t\tcharPause = 750;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (substr.charAt(0) === ',') {\n\t\t\t\t\tcharPause = 100;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\tif (charPause > 0)\n\t\t\t\t{\n\t\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\t\t\t\t\tcurString = curString.substring(0, curStrPos) + ' ' + curString.substring(curStrPos + 1);\n\t\t\t\t}\n\t\t\t\t**/\n\t\t\t\t\n\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t// Auto pause for punctuation.\n\t\t\t\t// -------------------------------------- //\n\t\t\t\tvar multiplier = Math.random() * (1.2 - 0.5) + 0.5;\t// Create some varation with random multiplier between 0.5 and 1.5.\n\t\t\t\tif (curString.charAt(curStrPos - 1) === '.') {\n\t\t\t\t\tif (curString.charAt(curStrPos) !== '.') {\t\t\t// For multiple periods in a row only pause for the last one.\n\t\t\t\t\t\tif (curString.charAt(curStrPos - 3) === 'M' && curString.charAt(curStrPos - 2) === 's') { // Don't pause for period in "Ms. Lojka"\n\t\t\t\t\t\t\tcharPause = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === '?') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === '…') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === '—') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === ':') {\n\t\t\t\t\tcharPause = 1000;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === ';') {\n\t\t\t\t\tcharPause = 700;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\telse if (curString.charAt(curStrPos - 1) === ',') {\n\t\t\t\t\tcharPause = 100;\t\t\t\t\t\t\t\t\t// Default pause for this character.\n\t\t\t\t}\n\t\t\t\tcharPause = Math.round(charPause * multiplier);\n\n\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t// Fade certain images in with specific timings.\n\t\t\t\t// (^ is regex for "starts with")\n\t\t\t\t// -------------------------------------- //\n\t\t\t\t/**if (State.passage == 'Lojka') {\n\t\t\t\t\tif (substr.match("^tower")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t}\n\t\t\t\t}**/\n\t\t\t\tif (State.passage == 'Kills Things') {\n\t\t\t\t\tif (substr.match("^Babies")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t\tif (substr.match("^Chicks")) {\t\t\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t\tif (substr.match("^dead lamb")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'View') {\n\t\t\t\t\tif (substr.match("^oic")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Voice') {\n\t\t\t\t\tif (substr.match("^Lojka")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t\tsndWhisper02.play();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Stink') {\n\t\t\t\t\tif (substr.match("^woman")) {\t\t\t\t\t\t\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t\tif (substr.match("^Bronx")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t\tsndWhisper03.play();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Rasputin') {\n\t\t\t\t\tif (substr.match("^asputin")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tif (State.passage == 'Scout') {\n\t\t\t\t\tif (substr.match("^behind")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (State.passage == 'Ponies') {\n\t\t\t\t\tif (substr.match("^heart")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t}\n\t\t\t\t\tif (substr.match("^behind")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100);\n\t\t\t\t\t}\n\t\t\t\t\tif (substr.match("^Little")) {\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t**/\n\t\t\t\telse if (State.passage == 'Babel') {\n\t\t\t\t\tif (substr.match("^ower")) {\n\t\t\t\t\t\tplayRandomGlitchSound(500);\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'New York') {\n\t\t\t\t\tif (substr.match("^ity")) {\n\t\t\t\t\t\tsndYay.play();\n\t\t\t\t\t\t$('#bgmask2').fadeIn(0).fadeOut(100).fadeIn(0).fadeOut(100).delay(200).fadeIn(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Favor') {\n\t\t\t\t\tif (substr.match("^favor")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$('#choices').fadeIn(5000);\n\t\t\t\t\t\t\tsndWhisper01.play();\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Hell') {\n\t\t\t\t\tif (substr.match("^asked")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$('#choices').fadeIn(5000);\n\t\t\t\t\t\t\tsndWhisper02.play();\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Hear') {\n\t\t\t\t\tif (substr.match("^blood")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$('#choices').fadeIn(5000)\n\t\t\t\t\t\t\tsndWhisper03.play();\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Second Ring') {\n\t\t\t\t\tif (substr.match("^today")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$('#choices').fadeIn(5000)\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// ------------- End sequence auto advance ------------- //\n\t\t\t\t/**\n\t\t\t\telse if (State.passage == 'Favor') {\n\t\t\t\t\tif (substr.match("^avor")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tState.play('Hell')\n\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Hell') {\n\t\t\t\t\tif (substr.match("^hell")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tState.play('Kill More')\n\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Kill More') {\n\t\t\t\t\tif (substr.match("^said")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tState.play('Hung Up')\n\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Hung Up') {\n\t\t\t\t\tif (substr.match("^phone")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tState.play('Clutch')\n\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (State.passage == 'Clutch') {\n\t\t\t\t\tif (substr.match("^look")) {\n\t\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tState.play('Walking')\n\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t**/\n\n\n if (self.contentType === 'html') {\n // skip over html tags while typing\n var curChar = curString.substr(curStrPos).charAt(0)\n if (curChar === '<' || curChar === '&') {\n var tag = '';\n var endTag = '';\n if (curChar === '<') {\n endTag = '>'\n } else {\n endTag = ';'\n }\n while (curString.substr(curStrPos).charAt(0) !== endTag) {\n tag += curString.substr(curStrPos).charAt(0);\n curStrPos++;\n }\n curStrPos++;\n tag += endTag;\n }\n }\n\n // timeout for any pause after a character\n self.timeout = setTimeout(function() {\n if (curStrPos === curString.length) {\n // fires callback function\n self.options.onStringTyped(self.arrayPos);\n\n // is this the final string\n if (self.arrayPos === self.strings.length - 1) {\n // animation that occurs on the last typed string\n self.options.callback();\n\n self.curLoop++;\n\n // quit if we wont loop back\n if (self.loop === false || self.curLoop === self.loopCount)\n return;\n }\n\n self.timeout = setTimeout(function() {\n self.backspace(curString, curStrPos);\n }, self.backDelay);\n } else {\n\n /* call before functions if applicable */\n if (curStrPos === 0)\n self.options.preStringTyped(self.arrayPos);\n\n // start typing each new char into existing string\n // curString: arg, self.el.html: original text inside element\n var nextString = curString.substr(0, curStrPos + 1);\n if (self.attr) {\n self.el.attr(self.attr, nextString);\n } else {\n if (self.isInput) {\n self.el.val(nextString);\n } else if (self.contentType === 'html') {\n self.el.html(nextString);\n } else {\n self.el.text(nextString);\n }\n }\n\n // add characters one by one\n curStrPos++;\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t\t\t// Sound related stuff.\n\t\t\t\t\t\t// ------------- Added Hack ------------- //\n\t\t\t\t\t\tplaySound = false;\n\t\t\t\t\t\tif (State.passage == 'Title')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tplaySound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/**\n\t\t\t\t\t\telse if (tags().contains('between'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tplaySound = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t**/\n\t\t\t\t\t\telse if (everyOther > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tplaySound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (playSound) {\n\t\t\t\t\t\t\tplayRandomKeystrokeSound();\n\t\t\t\t\t\t}\n\t\t\t\t\t\teveryOther = -everyOther;\n\n\n\n // loop the function\n self.typewrite(curString, curStrPos);\n }\n // end of character pause\n }, charPause);\n\n // humanized value for typing\n }, humanize);\n\n }\n\n ,\n backspace: function(curString, curStrPos) {\n // exit when stopped\n if (this.stop === true) {\n return;\n }\n\n // varying values for setTimeout during typing\n // can't be global since number changes each time loop is executed\n var humanize = Math.round(Math.random() * (100 - 30)) + this.backSpeed;\n var self = this;\n\n self.timeout = setTimeout(function() {\n\n // ----- this part is optional ----- //\n // check string array position\n // on the first string, only delete one word\n // the stopNum actually represents the amount of chars to\n // keep in the current string. In my case it's 14.\n // if (self.arrayPos == 1){\n // self.stopNum = 14;\n // }\n //every other time, delete the whole typed string\n // else{\n // self.stopNum = 0;\n // }\n\n if (self.contentType === 'html') {\n // skip over html tags while backspacing\n if (curString.substr(curStrPos).charAt(0) === '>') {\n var tag = '';\n while (curString.substr(curStrPos).charAt(0) !== '<') {\n tag -= curString.substr(curStrPos).charAt(0);\n curStrPos--;\n }\n curStrPos--;\n tag += '<';\n }\n }\n\n // ----- continue important stuff ----- //\n // replace text with base text + typed characters\n var nextString = curString.substr(0, curStrPos);\n if (self.attr) {\n self.el.attr(self.attr, nextString);\n } else {\n if (self.isInput) {\n self.el.val(nextString);\n } else if (self.contentType === 'html') {\n self.el.html(nextString);\n } else {\n self.el.text(nextString);\n }\n }\n\n // if the number (id of character in current string) is\n // less than the stop number, keep going\n if (curStrPos > self.stopNum) {\n // subtract characters one by one\n curStrPos--;\n // loop the function\n self.backspace(curString, curStrPos);\n }\n // if the stop number has been reached, increase\n // array position to next string\n else if (curStrPos <= self.stopNum) {\n self.arrayPos++;\n\n if (self.arrayPos === self.strings.length) {\n self.arrayPos = 0;\n\n // Shuffle sequence again\n if(self.shuffle) self.sequence = self.shuffleArray(self.sequence);\n\n self.init();\n } else\n self.typewrite(self.strings[self.sequence[self.arrayPos]], curStrPos);\n }\n\n // humanized value for typing\n }, humanize);\n\n }\n /**\n * Shuffles the numbers in the given array.\n * @param {Array} array\n * @returns {Array}\n */\n ,shuffleArray: function(array) {\n var tmp, current, top = array.length;\n if(top) while(--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n return array;\n }\n\n // Start & Stop currently not working\n\n // , stop: function() {\n // var self = this;\n\n // self.stop = true;\n // clearInterval(self.timeout);\n // }\n\n // , start: function() {\n // var self = this;\n // if(self.stop === false)\n // return;\n\n // this.stop = false;\n // this.init();\n // }\n\n // Reset and rebuild the element\n ,\n reset: function() {\n var self = this;\n clearInterval(self.timeout);\n var id = this.el.attr('id');\n this.el.after('<span id="' + id + '"/>')\n this.el.remove();\n if (typeof this.cursor !== 'undefined') {\n this.cursor.remove();\n }\n // Send the callback\n self.options.resetCallback();\n }\n\n };\n\n $.fn.typed = function(option) {\n return this.each(function() {\n var $this = $(this),\n data = $this.data('typed'),\n options = typeof option == 'object' && option;\n if (!data) $this.data('typed', (data = new Typed(this, options)));\n if (typeof option == 'string') data[option]();\n });\n };\n\n $.fn.typed.defaults = {\n strings: ["These are the default values...", "You know what you should do?", "Use your own!", "Have a great day!"],\n stringsElement: null,\n // typing speed\n typeSpeed: 0,\n // time before typing starts\n startDelay: 0,\n // backspacing speed\n backSpeed: 0,\n // shuffle the strings\n shuffle: false,\n // time before backspacing\n backDelay: 500,\n // loop\n loop: false,\n // false = infinite\n loopCount: false,\n // show cursor\n showCursor: true,\n // character for cursor\n cursorChar: "|",\n // attribute to type (null == text)\n attr: null,\n // either html or text\n contentType: 'html',\n // call when done callback function\n callback: function() {\n\t\t\t//console.log('in callback');\n\t\t\t$('.typed-original').show();\n\t\t\tif (State.passage == 'Hear')\n\t\t\t{\n\t\t\t\t// Hack to fix this passage not displaying properly in some browsers.\n\t\t\t\t$('.typedjs-outer-wrapper').css('opacity', '0');\n\t\t\t\t$('.typed-original').css('opacity', '1');\n\t\t\t}\n\t\t},\n // starting callback function before each string\n preStringTyped: function() {\n\t\t\t//console.log('in preStringTyped');\n\t\t},\n //callback for every typed string\n onStringTyped: function() {\n\t\t\t//console.log('in onStringTyped');\n\t\t},\n // callback for reset\n resetCallback: function() {\n\t\t\t//console.log('in resetCallback');\n\t\t}\n };\n\n\n}(window.jQuery);
<<script>>\n\t$('#bgmask2').css('background-image', 'url("lojka2.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n<<set $servant = 1>>\nI built it for the view I guess: who wouldn't want to wake up and look out over Central Park every morning from two-hundred feet up? I heard a [[voice|Voice]] say "build," [[and I built|Servant]].
window.sndWhispers = new Howl({\n\tsrc: ['whispers.mp3'],\n\tloop: true,\n\tvolume: 0.6\n});\n\nwindow.sndScream01 = new Howl({\n\tsrc: ['scream01.mp3'],\n\tloop: false,\n\tvolume: 0.8\n});\n\nwindow.sndNeon = new Howl({\n\tsrc: ['neon.mp3'],\n\tloop: false,\n\tvolume: 0.6\n});\n\nwindow.sndGlitch = new Howl({\n\tsrc: ['glitch.mp3'],\n\tloop: true,\n\tvolume: 0.6\n});\n\nwindow.sndYay = new Howl({\n\tsrc: ['yay.mp3'],\n\tloop: false,\n\tvolume: 0.6\n});\n\nwindow.sndCannon = new Howl({\n\tsrc: ['cannon.mp3'],\n\tloop: false,\n\tvolume: 0.7\n});\n\nwindow.sndWhisper01 = new Howl({\n\tsrc: ['whisper01.mp3'],\n\tloop: false,\n\tvolume: 0.9\n});\n\nwindow.sndWhisper02 = new Howl({\n\tsrc: ['whisper02.mp3'],\n\tloop: false,\n\tvolume: 0.7\n});\n\nwindow.sndWhisper03 = new Howl({\n\tsrc: ['whisper03.mp3'],\n\tloop: false,\n\tvolume: 0.7\n});\n\n\nwindow.sndWhisper04 = new Howl({\n\tsrc: ['whisper04.mp3'],\n\tloop: false,\n\tvolume: 0.7\n});\n\n/** Typewriter stuff **/\nwindow.sndKey01 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey02 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey03 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey04 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey05 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey06 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey07 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\nwindow.sndKey08 = new Howl({\n\tsrc: ['keystroke01.mp3']\n});\n\nvar sndArray = Array(sndKey01, sndKey02, sndKey03, sndKey04, sndKey05,sndKey06, sndKey07, sndKey08);\nvar sndRandom = sndKey01;\nvar minVolume = 0.1;\nvar maxVolume = 0.6;\nvar volume = minVolume;\n\nwindow.playRandomKeystrokeSound = function(volume) {\n\tsndRandom = sndArray[Math.floor(Math.random() * sndArray.length)];\n\tif (!volume) {\n\t\tvolume = Math.random() * maxVolume;\n\t}\n\tif (volume < minVolume) {\n\t\tvolume = minVolume;\n\t}\n\tsndRandom.volume(volume);\n\tsndRandom.play();\n};\n\n/** Glitch stuff **/\nwindow.playRandomGlitchSound = function(length) {\n\ttry\n\t{\n\t\tvar volume = 0.5;\n\t\t/**\n\t\tvar duration = sndGlitch.duration();\n\t\tvar position = Math.random() * duration;\n\t\tsndGlitch.seek(position);\n\t\t**/\n\t\tsndGlitch.volume(volume);\n\t\tsndGlitch.play();\n\t\tsetTimeout(function() { \n\t\t\tsndGlitch.pause();\n\t\t}, length);\t\t\n\t}\n\tcatch(e) {\n\t}\n};\n\nwindow.neonSign = function(){\n var randSeconds = Math.floor(Math.random()*2000)+0;\n var randDelay = randSeconds;\n var speed=300;\n var $toAnimate=$('body.neon-flicker');\n $toAnimate.delay(randDelay).animate({'opacity':0.3},speed,function() {\n $toAnimate.animate({'opacity':1},speed,neonSign() );\n\t\tif (Math.random() > 0.5)\n\t\t{\n\t\t\tvar volume = Math.random() * 0.6;\n\t\t}\n });\n};\n\n/** Whisper sounds in 'between' passages (and end sequence). **/\npostdisplay.handleWhisperSounds = function() {\n\tif (tags().contains('endsequence')) {\n\t\treturn;\n\t}\n\telse {\n\t\tif (tags().contains('between'))\n\t\t{\n\t\t\tsndWhispers.play();\n\t\t}\n\t\telse {\n\t\t\tsndWhispers.stop();\n\t\t}\n\t}\n};\n\npostdisplay.handleLinkClicks = function() {\n\t/** Play keystroke sound on link clicks. **/\n\t$('a').click(function() {\n\t\tplayRandomKeystrokeSound(0.7);\n\t});\n};
<div class="actor"><div id="lojka"></div></div>\n<<script>>\npostdisplay.sceneSetup = function(e) {\n\t$('.dupe').fadeOut(0);\n var t = theaterJS({\n minSpeed: 50,\n maxSpeed: 500\n });\n t.on("type:start, erase:start", function() {\n var e = t.getCurrentActor();\n e.$element.classList.add("is-typing")\n }).on("type:end, erase:end", function() {\n var e = t.getCurrentActor();\n e.$element.classList.remove("is-typing");\n }), t.addActor("lojka", {\n accuracy: 1,\n speed: 0.95\n }), t.addScene(1000, "lojka: These are the things that make up my soul's structure.", 1000, " And inside—", 700, "the things that make up my soul's substance—", 700, "are the people who walk the streets and tend the delis.", 900, " I devour", -6, "love them all;", 500, " even people like Matt,", 80, " protector of the lambs."), \n\t\tt.addScene(function (done) {\n\t\t\t$('.dupe').delay(1500).fadeIn(2000);\n\t\t\tdone()\n\t\t }),\t\t\n\t\tdelete postdisplay[e]\n};\n<</script>>\n\n<div class="dupe">These are the things that make up my soul's [[structure|Shadows]]. And inside--the things that make up my soul's [[substance|Shadows]]--are the people who walk the streets and tend the delis. I love them all; even people like Matt, protector of the lambs.</div>
<<script>>\n\t$('#bgmask2').css('background-image', 'url("rasputin.jpg")');\n\t$('#bgmask2').hide();\n<</script>>\n\nHave you ever heard of [[Rasputin|Sophie]]? He was a self-proclaimed prophet, and king of Russia until nineteen-sixteen; a really [[nasty character|Sophie]].