<img src="keys_icon.jpg"="100px" height="122px">\nYou hand the keys over to waiting, clawed hands.\n\nBut the figure laughs.\n\n"Not enough! This is no offering. Trade me something better!"\n\n[[my phone|bad times]]\n<<if $sword is "true">>\s\n[[my sword|bad times]]<<endif>>
<img src="stairs.jpg"="100px" height="122px">\nYou head up the stairs for what seems like forever. At the top there's a bathroom, and no signs of Trennor. You check for texts again, but he still hasn't replied. Fine. Maybe downstairs.\n\n[[down the stairs]]\n<<fadeoutsound "coffee.mp3">>
<img src="crown_icon.jpg"="100px" height="122px">\nAnd when you do you see that its robes are made in paper, peeling, yellowed strips, like ancient teeth. The figure whispers to you, and the sound is like pages brushing against each other.\n\nYou step closer still.\n\n"You are seeking a way out?" the figure asks.\n\n[[yes]]\n\n[[who are you?]]
<img src="garg1.jpg"="100px" height="122px">\nIs still open. What a relief.\n<<fadeoutsound "soft.mp3" 0.2>>\n[[you're a dick.]]\n<<fadeinsound "cavesound.mp3" 1.0>>
<img src="garg5.jpg"="100px" height="122px">\nYou jiggle the handle like a frenzied, candelabra holding woman in a black and white vampire movie. No luck (shocker).\n\n[[bite me]]
<img src="garg4.jpg"="100px" height="122px">\nOkay, no problem. There's no shame in giving up.\n\n[[weep gently]]\n\n[[fix the statues|shift the statues to match color]]
<img src="danger2.jpg"="100px" height="122px">\nThere there. Everyone has bad days. Let's look on the bright side, shall we?\n\n[[you just want me to go through that stupid door]]
You are almost loathe to touch this door, but you steel yourself. <<if $sword is "true">>Grip your sword tight.<<endif>> Turn the handle.\n\nThe door opens. Inside, a small, round room, bathed in gloom. The only light source is a single circular skylight, but you are surely too deep unground for much sun to reach.\n\nIn the centre of the room, someone... something is sitting. On a throne of antlers. Dressed in paper. At first you mistook it for birch bark. But the figure beckons you forth.\n<<fadeoutsound "cavesound.mp3">>\n[[And You Step Forward]]\n<<fadeinsound "soft.mp3" 0.2>>
<img src="question_icon.jpg"="100px" height="122px">\nPlease say it like you actually mean it.\n\n[[i guess]]
/*\nsqTwineSound HTML5 Sound Macro Suite\nCopyright 2014 Tory Hoke\n\nProgram URI: http://www.sub-q.com/plugins/sqTwineSound/\nDescription: Sound macros for Twine creations, including controls for volume, fade interval, and playing multiple tracks at once.\nVersion: 0.8.0\nAuthor: Tory Hoke\nAuthor URI: http://www.toryhoke.com\nLicense: GNU General Public License\nLicense URI: http://www.opensource.org/licenses/gpl-license.php\nRepository: https://github.com/AteYourLembas/sqTwineSound\nFAQ / Q & A: http://sub-q.com/questions (password: ThinkVast)\nBug Reports/Feature Requests: http://sub-q.com/forums/topic/what-would-you-like-to-see-sqtwinesound-do-that-its-not-doing/ (password: ThinkVast)\n\n sub-Q.com is password-protected while it's in beta (until January 2015.)\n Please kick the tires and report any issues with the website\n via the sub-Q.com Contact form.\n\n\nThis program based on:\nTwine: HTML5 sound macros by Leon Arnott of Glorious Trainwrecks\nthe source and influence of which appear under a Creative Commons CC0 1.0 Universal License\n\nThis program uses\n\n easeInOutSine()\n Copyright © 2001 Robert Penner\n All rights reserved.\n \n As distributed by Kirupa\n http://www.kirupa.com/forum/showthread.php?378287-Robert-Penner-s-Easing-Equations-in-Pure-JS-(no-jQuery)\n \n Open source under the BSD License. \n \n \n Redistribution and use in source and binary forms, with or without modification, \n are permitted provided that the following conditions are met:\n \n Redistributions of source code must retain the above copyright notice, this list of \n conditions and the following disclaimer.\n Redistributions in binary form must reproduce the above copyright notice, this list \n of conditions and the following disclaimer in the documentation and/or other materials \n provided with the distribution.\n \n Neither the name of the author nor the names of contributors may be used to endorse \n or promote products derived from this software without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \n EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \n AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n OF THE POSSIBILITY OF SUCH DAMAGE. \n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n \nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\n*/\n\n(function () {\n version.extensions.soundMacros = {\n major: 0,\n minor: 8,\n revision: 0\n };\n\n var globalVolume = 1.0;\n var updateInterval = 10; //Update sound volume, etc. once every 10 ms\n var defaultOverlap = 1000; //Default track overlap is 1000 ms\n var minVolume = 0.01; // Minimum possible volume -- 0 is mute, so we want somethings slightly above that\n var soundInterval = 0.1; // Creates an interval of 1/10 creates ten stages of loudness. Used by quieter/louder. Feel free to tweak\n var fileExtensions = ["ogg", "mp3", "wav", "webm"]; // Acceptable file extensions for audio\n var clips = {};\n\n // Convenience vars\n var clipNameLabel = "Clip Name";\n var overlapLabel = "Overlap";\n var volumeProportionLabel = "Volume Proportion";\n var loopLabel = "Loop?";\n\n\n //------------ Robert Penner via Kirupa math methods ----------\n //-------------------------------------------------------------\n\n function easeInOutSine(currentIteration, startValue, changeInValue, totalIterations) {\n return changeInValue / 2 * (1 - Math.cos(Math.PI * currentIteration / totalIterations)) + startValue;\n }\n\n //------------ End Math methods -------------------------------\n //-------------------------------------------------------------\n\n function error(message) {\n return throwError(message);\n }\n\n function getArgs(givenArgs) {\n\n var args = Array.prototype.slice.call(givenArgs);\n\n //alert(" split args " + args);\n //alert("typeof " + typeof(givenArgs[givenArgs.length-1]));\n //alert(givenArgs[givenArgs.length-1].fullArgs());\n\n var tempArgs = [];\n\n if (args.length > 2) {\n tempArgs = args[2].toString().split(",");\n }\n for (var i = 0; i < tempArgs.length; i++) {\n if (typeof(tempArgs[i]) == "string" && tempArgs[i].indexOf("$") === 0) {\n var varName = tempArgs[i].slice(1, tempArgs[i].length);\n if (state.history[0].variables.hasOwnProperty(varName)) tempArgs[i] = state.history[0].variables[varName];\n }\n }\n return tempArgs;\n }\n\n\n //------------- pausableTimeout ---------\n //--------------------------------------\n function pausableTimeout(func, params) {\n\n this.funcToRun = func;\n this.waitStartTime = -1;\n this.waitEndTime = -1;\n this.waitDuration = -1;\n\n this.activate = function(waitDuration) {\n\n if (this.pausedAt !== undefined) { this.waitDuration = this.timeRemaining(); }\n else if (waitDuration !== undefined) this.waitDuration = waitDuration;\n else if (this.waitDuration > -1 ) { console.log("Warning: No wait duration given to pausableTimeout. Using last specified one."); }\n else return; // Don't bother to start a loop with no wait duration\n\n this.waitStartTime = new Date().getTime();\n this.waitEndTime = new Date().getTime() + this.waitDuration;\n this.timeout = setTimeout(this.funcToRun, this.waitDuration, params);\n };\n\n this.deactivate = function() {\n this.pausedAt = this.timeElapsed();\n if (this.timeout !== undefined) clearTimeout(this.timeout);\n };\n\n this.stopAndClear = function() {\n if (this.pausedAt !== undefined) delete this.pausedAt;\n if (this.timeout !== undefined) { clearTimeout(this.timeout); delete this.timeout; }\n };\n\n this.timeElapsed = function() {\n return new Date().getTime() - this.waitStartTime;\n };\n\n this.timeRemaining = function() {\n if (this.pausedAt !== undefined) return this.waitDuration - this.pausedAt;\n return this.waitEndTime - new Date().getTime();\n };\n }\n //------------- /pausableTimeout --------\n //--------------------------------------\n\n\n //------------- sqAudio ----------------\n //--------------------------------------\n function sqAudio(fullPath, clipName, fileExt) {\n\n this.fullPath = fullPath;\n this.clipName = clipName; // Let a clip know its own name\n this.fileExt = fileExt;\n\n // Defaults\n this.volumeProportion = 1.0; // By default, full volume\n this.overlap = defaultOverlap; // By default, defaultOverlap ms\n this.isPlayable = false; // Assume audio is not playable\n this.looping = false; // Assume audio not looping\n this.alternate = false;\n this.mainAudio = new Audio();\n this.partnerAudio = new Audio();\n\n this.mainAudio.setAttribute("src", this.fullPath);\n if (this.mainAudio.canPlayType) {\n for (var i = -1; i < fileExtensions.length; i += 1) {\n if (i >= 0) fileExt = fileExtensions[i];\n if (this.mainAudio.canPlayType("audio/" + fileExt)) break;\n }\n if (i < fileExtensions.length) {\n this.mainAudio.interval = null;\n this.partnerAudio.setAttribute("src", this.fullPath);\n this.partnerAudio.interval = null;\n this.isPlayable = true;\n\n } else {\n console.log("Browser can't play '" + this.clipName + "'");\n }\n } \n\n // Convenience method for getting duration\n // TODO : protect this against audio not being loaded yet\n //\n this.getDuration = function () {\n return this.mainAudio.duration;\n };\n\n // Get what we consider the current audio track\n //\n this._getActiveAudio = function() {\n return (this.alternate) ? this.partnerAudio : this.mainAudio;\n };\n\n // Get what we consider the idle audio track\n //\n this._getIdleAudio = function() {\n return (this.alternate) ? this.mainAudio : this.partnerAudio;\n };\n\n\n\n // Perform fade on specified audio\n // Use ease\n //\n this.__fadeSound = function(audioObj, fadeIn) {\n\n var startVolume = fadeIn ? 0 : globalVolume * this.volumeProportion;\n var deltaVolume = globalVolume * this.volumeProportion * (fadeIn ? 1 : -1);\n\n //alert("__fadeSound! fadeIn " + fadeIn + ", globalVolume " + globalVolume + ", volProp " + this.volumeProportion + " startVol " + startVolume + " deltaVolume " + deltaVolume);\n\n // Handy vars for easing\n var totalIterations = this.overlap/updateInterval;\n var currentIteration = 1;\n\n audioObj.interval = setInterval(function() {\n\n //Use easing to prevent sound popping in or out\n //\n var desiredVolume = easeInOutSine(currentIteration, startVolume, deltaVolume, totalIterations);\n \n //alert("Well desiredVol is " + desiredVolume + " cos currIter " + currentIteration + " startVol " + startVolume + " delta vol " + deltaVolume + " total iter " + totalIterations);\n //This should never happen, but if it does, skip the fade\n if (isNaN(desiredVolume)) {\n audioObj.volume = startVolume + deltaVolume;\n console.log("There was a problem with the fade. Possibly overlap " + this.overlap + " is shorter than updateInterval " + updateInterval + "? ");\n } else {\n audioObj.volume = desiredVolume;\n }\n currentIteration += 1;\n \n if (audioObj.volume === (startVolume + deltaVolume)) { \n //alert("Grats! You reached your destination of " + audioObj.volume); \n clearInterval(audioObj.interval); \n }\n\n //This effectively stops the loop and poises the volume to be played again\n //That way the clip isn't needlessly looping when no one can hear it.\n if (audioObj.volume === 0) {\n audioObj.pause();\n audioObj.currentTime = 0;\n }\n }, updateInterval);\n };\n\n\n // Manages starting one loop before the last play has ended\n // and cross-fading the ends\n //\n this._crossfadeLoop = function(params) {\n\n var sqAudioObj = params[0];\n var currAudioObj = params[1];\n\n // Let loop expire if no longer looping\n //\n if (!sqAudioObj.looping) { return; }\n\n var nextAudioObj = sqAudioObj.alternate ? sqAudioObj.mainAudio : sqAudioObj.partnerAudio;\n sqAudioObj.alternate = !sqAudioObj.alternate;\n\n // Don't even bother with crossfade if there's no overlap\n if (sqAudioObj.overlap !== undefined && sqAudioObj.overlap > 1) {\n\n // fade out current sound\n //\n sqAudioObj._fadeSound(currAudioObj, false);\n\n // And fade in our partner\n //\n //nextAudioObj.volume = 0; \n //if (nextAudioObj.currentTime > 0) nextAudioObj.currentTime = 0;\n //nextAudioObj.play();\n sqAudioObj._fadeSound(nextAudioObj, true);\n\n }\n else {\n sqAudioObj.updateVolume(); \n nextAudioObj.currentTime = 0;\n nextAudioObj.play();\n }\n\n // Kick off the next timer to crossfade\n // Might as well garbage collect the old crossfadeTimeout, too.\n //\n //if (sqAudioObj.crossfadeTimeout !== undefined) { sqAudioObj.crossfadeTimeout.stopAndClear(); delete sqAudioObj.crossfadeTimeout; }\n //if (isNaN(sqAudioObj.getDuration())) { error("Can't loop because duration is not known (audio not loaded, probably not found.)"); return; }\n //sqAudioObj.crossfadeTimeout = new pausableTimeout(sqAudioObj._crossfadeLoop, [sqAudioObj, nextAudioObj]); \n //sqAudioObj.crossfadeTimeout.activate(sqAudioObj.getDuration()*1000-sqAudioObj.overlap);\n\n };\n\n\n this._fadeSound = function(activeAudioObj, fadeIn) {\n\n // Set the goal volume as a proportion of the global volume\n // (e.g. if global volume is 0.4, and volume proportion is 0.25, overall the goal volume is 0.1)\n //\n var goalVolume = globalVolume * this.volumeProportion;\n if (activeAudioObj.interval) clearInterval(activeAudioObj.interval);\n if (fadeIn) {\n if (activeAudioObj.currentTime > 0) activeAudioObj.currentTime = 0;\n activeAudioObj.volume = 0; \n this.loop();\n\n } else {\n\n if (!activeAudioObj.currentTime) return;\n activeAudioObj.volume = goalVolume;\n activeAudioObj.play();\n }\n this.__fadeSound(activeAudioObj, fadeIn);\n\n };\n\n\n // Fade sound on whatever the active audio is\n //\n this.fadeSound = function(fadeIn) {\n\n if (fadeIn) {\n this.stopAndClear();\n this.looping = true;\n }\n else {\n this.looping = false;\n }\n this._fadeSound(this._getActiveAudio(), fadeIn);\n };\n\n // Update volume proportion and volume of both audio clips\n //\n this.setVolumeProportion = function(volumeProportion) {\n this.volumeProportion = volumeProportion;\n };\n\n // Update volume of active audio clips (assumes vol proportion and global vol already set)\n //\n this.updateVolume = function() {\n this._getActiveAudio().volume = globalVolume * this.volumeProportion;\n };\n\n // Play the current audio object and reactivate any paused timer\n //\n this.play = function(loop) {\n\n //If it's a loop we want, just loop and don't make a big deal out of it\n if (loop) this.loop();\n\n else {\n\n var activeAudioObj = this._getActiveAudio();\n if (activeAudioObj) { \n activeAudioObj.play();\n }\n }\n };\n\n // Pause whatever audio is currently playing and pause the timer, too\n //\n this.pause = function() {\n if (this.crossfadeTimeout !== undefined) this.crossfadeTimeout.deactivate();\n this._getActiveAudio().pause();\n };\n\n // Stop whatever audio is currently playing and dump the timer\n //\n this.stopAndClear = function() {\n var activeAudioObj = this._getActiveAudio();\n activeAudioObj.pause();\n if (activeAudioObj.currentTime > 0) activeAudioObj.currentTime = 0;\n if (this.crossfadeTimeout !== undefined) { this.crossfadeTimeout.stopAndClear(); delete this.crossfadeTimeout; }\n };\n\n\n // Loop the track\n //\n this.loop = function() {\n\n this.looping = true;\n var activeAudioObj = this._getActiveAudio();\n\n // Create new timeout if one does not already exist; otherwise just reuse the existing one\n //\n this.crossfadeTimeout = (this.crossfadeTimeout === undefined) ? new pausableTimeout(this._crossfadeLoop, [this, activeAudioObj]) : this.crossfadeTimeout; \n if (isNaN(this.getDuration())) { error("Can't loop because duration is not known (audio not loaded, probably not found.)"); return; }\n this.crossfadeTimeout.activate((this.getDuration()*1000)-this.overlap);\n activeAudioObj.play();\n };\n\n\n }\n //------------ /sqAudio ----------------\n //--------------------------------------\n\n\n\n /***********************************************************\n * MAIN METHOD\n /***********************************************************\n /\n / Here be monsters. Proceed with caution.\n /\n */\n\n // Verify that the audio can be played in browser\n //\n function parseAudio(c) {\n\n var d = c.exec(div.innerHTML);\n\n while(d) {\n if (d) {\n if (!clips.hasOwnProperty(d[1])) {\n\n var parser = document.createElement('a');\n parser.href = d[1].toString();\n var pathnameSubstrings = parser.pathname.split("/");\n var clipName = pathnameSubstrings[pathnameSubstrings.length-1];\n var sqAudioObj = new sqAudio(parser.href + "." + d[2].toString(), clipName, d[2].toString());\n if (sqAudioObj.isPlayable) { clips[clipName] = sqAudioObj;}\n }\n }\n d = c.exec(div.innerHTML); // yes, we could just do a do/while, but some envs don't like that\n }\n }\n\n // Parse all used audio file names\n // Use whatever store area element is available in the story format\n //\n var storeElement = (document.getElementById("store-area") ? document.getElementById("store-area") : document.getElementById("storeArea"));\n var div = storeElement.firstChild;\n while (div) {\n var b = String.fromCharCode(92);\n var q = '"';\n var re = "['" + q + "]([^" + q + "']*?)" + b + ".(" + fileExtensions.join("|") + ")['" + q + "]";\n parseAudio(new RegExp(re, "gi"));\n div = div.nextSibling;\n }\n /***********************************************************\n * END MAIN METHOD\n /***********************************************************/\n\n\n\n /***********************************************************\n * SUPPORTING FUNCTIONS FOR THE MACROS\n /***********************************************************\n /\n / Here be monsters.\n /\n */\n\n // Given the clipName, get the active soundtrack\n //\n function getSoundTrack(clipName) {\n clipName = cleanClipName(clipName.toString());\n if (!clips.hasOwnProperty(clipName)) { return error("Given clipName " + clipName + " does not exist in this project. Please check your variable names."); }\n return clips[clipName];\n }\n\n\n // Centralized function for sound fading\n //\n function fadeSound(clipName, fadeIn) {\n\n var soundtrack = getSoundTrack(clipName);\n if (soundtrack === "undefined") { return error("audio clip " + clipName + " not found"); } \n soundtrack.fadeSound(fadeIn);\n \n }\n\n\n // Adjust the volume of ALL audio in the page\n //\n function adjustVolume(direction) {\n\n // Note soundInterval and minVolume are declared globally (at top of the script)\n var maxVolume = 1.0; // This is native to JavaScript. Changing will cause unexpected behavior\n globalVolume = Math.max(minVolume, Math.min(maxVolume, globalVolume + (soundInterval * direction)));\n for (var soundIndex in clips) {\n if (clips.hasOwnProperty(soundIndex)) {\n clips[soundIndex].updateVolume();\n }\n }\n }\n\n // Common argument management\n // Because of the total expected arguments (one string, one float, one int, one boolean)\n // This method attempts to be forgiving of sequence. \n // Be advised if there were even one more argument, it probably couldn't be so forgiving anymore!\n //\n function manageCommonArgs(plainArgs, requiredArgs) {\n\n // Look at the list of available arguments, clean them up, and take the first one of each desired type:\n // Recreate the arguments as a list in required sequence [clipName, volumeProportion, overlap, loop]\n\n var clipName;\n var volumeProportion;\n var overlap;\n var loop;\n\n var args = getArgs(plainArgs);\n\n for (var i = 0; i < args.length; i++) {\n\n if (!isNaN(args[i])) {\n var tempNum = parseFloat(args[i]);\n if (volumeProportion === undefined && tempNum <= 1.0) volumeProportion = tempNum;\n else if (overlap === undefined && tempNum >=updateInterval) overlap = tempNum; \n }\n else if (args[i] == "true" || args[i] == "false") {\n if (loop === undefined) loop = (args[i] == "true"); \n }\n else {\n if (clipName === undefined) clipName = args[i].toString();\n } \n }\n\n for (var requiredArg in requiredArgs) {\n if (requiredArgs.hasOwnProperty(requiredArg)) {\n switch (requiredArg) {\n case clipNameLabel :\n if (clipName === undefined) { return error("No audio clip name specified."); } \n break;\n case volumeProportionLabel :\n if (volumeProportion === undefined || volumeProportion > 1.0 || volumeProportion < 0.0) { return error("No volume proportion specified (must be a decimal number no smaller than 0.0 and no bigger than 1.0.)"); }\n break;\n case overlapLabel :\n if (overlap === undefined) { return error("No fade duration specified (must be a number in milliseconds greater than + " + updateInterval + " ms.)"); }\n break;\n case loopLabel :\n if (loop === undefined) { return error("No loop flag provided (must be a boolean, aka true or false.)"); }\n break;\n }\n }\n }\n\n return [clipName, volumeProportion, overlap, loop];\n\n }\n\n // Get the clipName up to the . if a . exists, otherwise do no harm\n //\n function cleanClipName(clipName) {\n\n var parser = document.createElement('a');\n parser.href = clipName.toString();\n var pathnameSubstrings = parser.pathname.split("/");\n clipName = pathnameSubstrings[pathnameSubstrings.length-1];\n return clipName.lastIndexOf(".") > -1 ? clipName.slice(0, clipName.lastIndexOf(".")) : clipName;\n }\n\n /***********************************************************\n * END SUPPORTING FUNCTIONS FOR THE MACROS\n /***********************************************************/\n\n\n\n /***********************************************************\n /***********************************************************\n * MACROS\n /***********************************************************\n /***********************************************************\n */\n\n /* updatevolume\n \n Given a decimal between 0.0 and 1.0, \n updates the clip's volume proportion and the clip's actual volume\n \n */\n macros.updatevolume = {\n handler: function () {\n \n var args = manageCommonArgs(arguments, [clipNameLabel, volumeProportionLabel]);\n var soundtrack = getSoundTrack(args[0]);\n soundtrack.setVolumeProportion(args[1]);\n soundtrack.updateVolume();\n }\n };\n\n /**\n playsound\n \n This version of the macro lets you do a little bit of sound mixing.\n \n Parameters:\n\n REQUIRED: clipName \n OPTIONAL: decimal proportion of volume (0.0 being minimum/mute, and 1.0 being maximum/default)\n OPTIONAL: number of milliseconds to overlap/crossfade the loop (0 ms by default)\n OPTIONAL: true if you'd like to loop, false if no\n \n */\n macros.playsound = {\n handler : function () {\n\n var args = manageCommonArgs(arguments, [clipNameLabel]);\n var soundtrack = getSoundTrack(args[0]);\n var volumeProportion = args[1] !== undefined ? args[1] : soundtrack.volumeProportion;\n soundtrack.overlap = args[2] !== undefined ? args[2] : defaultOverlap;\n var loop = args[3] !== undefined ? args[3] : false;\n soundtrack.setVolumeProportion(volumeProportion);\n soundtrack.updateVolume();\n soundtrack.play(loop); \n }\n };\n\n\n /* playsounds\n \n Play multiple sounds at once (picking up where we left off)\n If you give it no sounds to play, it quietly ignores the command.\n\n Parameters:\n\n OPTIONAL: clipName\n OPTIONAL: decimal proportion of volume (0.0 being minimum/mute, and 1.0 being maximum/default)\n OPTIONAL: number of milliseconds to overlap/crossfade (0 ms by default)\n OPTIONAL: true if you'd like to loop, false if no\n \n /\n */\n macros.playsounds = {\n handler: function () {\n\n var clipNameString = args[0];\n if (args[0] === undefined || args[0] === "") return;\n clipNameString = args[0].toString();\n if (clipNameString == "[]") return;\n var clipNames = clipNameString.split(",");\n if (clipNames.length < 1) return;\n var args = manageCommonArgs(arguments);\n for (var index = 0; index < clipNames.length; index++) {\n var soundtrack = getSoundTrack(cleanClipName(clipNames[index]));\n var volumeProportion = args[1] !== undefined ? args[1] : soundtrack.volumeProportion;\n soundtrack.overlap = args[2] !== undefined ? args[2] : defaultOverlap;\n var loop = args[3] !== undefined ? args[3] : false;\n soundtrack.setVolumeProportion(volumeProportion);\n soundtrack.updateVolume();\n soundtrack.play(loop); \n }\n }\n };\n\n\n\n /* pausesound\n \n Pauses audio at its current location. \n Use playsound to resume it.\n\n Parameters:\n\n REQUIRED: clipName\n\n */ \n macros.pausesound = {\n handler: function() {\n var args = manageCommonArgs(arguments, [clipNameLabel]); \n getSoundTrack(args[0]).pause();\n }\n };\n\n\n /* <<pauseallsound>> \n \n Pauses all sounds at their current location. \n \n If you'd like the option to start multiple sounds,\n take a look at <<playsounds>> and <<fadeinsounds>>\n */ \n macros.pauseallsound = {\n handler: function () {\n for (var clipName in clips) {\n if (clips.hasOwnProperty(clipName)) {\n getSoundTrack(clipName).pause();\n }\n }\n }\n };\n\n /* stopsound \n \n Stop the given sound immediately\n If the sound is played again, it will play from the beginning\n \n Parameters:\n\n REQUIRED: clipName\n */ \n macros.stopsound = {\n handler: function() {\n var args = manageCommonArgs(arguments, [clipNameLabel]); \n getSoundTrack(args[0]).stopAndClear();\n }\n };\n\n\n /* <<stopallsound>>\n \n Stops all sounds immediately.\n If any stopped sound is played again, it will play from the beginning\n \n If you'd like the option to start multiple sounds,\n take a look at <<playsounds>> and <<fadeinsounds>>\n */ \n macros.stopallsound = {\n handler: function () {\n for (var clipName in clips) {\n if (clips.hasOwnProperty(clipName)) {\n if (clips[clipName] !== undefined) clips[clipName].stopAndClear();\n }\n }\n }\n };\n\n /* loopsound\n \n Starts playing the given clip on repeat.\n Note that browsers will not necessarily play looping audio seamlessly.\n For seamless audio, use a fade duration/overlap (third parameter) greater than 1 millisecond\n (Well, you probably want something more perceptibe than 1 millisecond!)\n \n Parameters:\n\n REQUIRED: clipName \n OPTIONAL: decimal proportion of volume (0.0 being minimum/mute, and 1.0 being maximum/default)\n OPTIONAL: number of milliseconds to overlap/crossfade the loop (defaultOverlap by default)\n */ \n macros.loopsound = {\n handler: function () {\n \n var args = manageCommonArgs(arguments, [clipNameLabel]);\n\n var soundtrack = getSoundTrack(args[0]);\n var volumeProportion = args[1] !== undefined ? args[1] : soundtrack.volumeProportion;\n soundtrack.overlap = args[2] !== undefined ? args[2] : defaultOverlap;\n soundtrack.setVolumeProportion(volumeProportion);\n soundtrack.updateVolume();\n soundtrack.loop();\n }\n };\n\n\n /* unloopsound\n \n Let the given sound stop when it finishes its current loop\n (so the sound no longer repeats.)\n\n Parameters:\n\n REQUIRED: clipName \n\n */ \n macros.unloopsound = {\n handler: function () {\n var args = manageCommonArgs(arguments, [clipNameLabel]); \n getSoundTrack(args[0]).looping = false;\n }\n };\n\n\n /* fadeinsound\n \n Identical to loopsound, but fades in the sound over 2 seconds.\n\n Parameters:\n\n REQUIRED: clipName \n OPTIONAL: decimal proportion of volume (0.0 being minimum/mute, and 1.0 being maximum/default)\n OPTIONAL: number of milliseconds to overlap/crossfade the loop (defaults to clip's last set overlap)\n\n */\n macros.fadeinsound = {\n handler: function () {\n\n var args = manageCommonArgs(arguments, [clipNameLabel]);\n\n var soundtrack = getSoundTrack(args[0]);\n var volumeProportion = args[1] !== undefined ? args[1] : soundtrack.volumeProportion; \n soundtrack.overlap = args[2] !== undefined ? args[2] : soundtrack.overlap;\n soundtrack.volumeProportion=volumeProportion;\n soundtrack.fadeSound(true);\n }\n };\n\n /* fadeinsounds\n\n Fade in multiple sounds at once.\n \n Parameters:\n\n REQUIRED: clipNames as list \n OPTIONAL: decimal proportion of volume (0.0 being minimum/mute, and 1.0 being maximum/default)\n OPTIONAL: number of milliseconds to overlap/crossfade the loop (defaults to clip's last set overlap)\n \n */\n macros.fadeinsounds = {\n handler: function () {\n\n var clipNameString = args[0];\n if (args[0] === undefined || args[0] === "") return;\n clipNameString = args[0].toString();\n if (clipNameString == "[]") return;\n var clipNames = clipNameString.split(",");\n if (clipNames.length < 1) return;\n\n var args = manageCommonArgs(arguments);\n\n for (var index = 0; index < clipNames.length; index++) {\n var soundtrack = getSoundTrack(args[0]);\n var volumeProportion = args[1] !== undefined ? args[1] : soundtrack.volumeProportion; \n soundtrack.overlap = args[2] !== undefined ? args[2] : soundtrack.overlap;\n soundtrack.volumeProportion=volumeProportion;\n soundtrack.fadeSound(true); \n }\n }\n };\n\n /* fadeoutsound\n \n Identical to stopsound, but fades out the sound over the stored fade duration (overlap).\n \n Parameters:\n\n REQUIRED: clipName\n\n */\n macros.fadeoutsound = {\n handler: function () {\n var args = manageCommonArgs(arguments, [clipNameLabel]); \n fadeSound(args[0].toString(), false);\n }\n };\n\n\n /* fadeoutsounds\n \n Fade out multiple sounds at once.\n If you give it no sounds to play, it quietly ignores the command.\n\n Parameters:\n\n REQUIRED: clipNames as list \n \n */\n macros.fadeoutsounds = {\n handler: function () {\n\n var args = getArgs(arguments);\n var clipNameString = args[0];\n if (args[0] === undefined) return;\n clipNameString = args[0].toString();\n if (clipNameString == "[]") return;\n var clipNames = clipNameString.split(",");\n if (clipNames.length < 1) return;\n\n for (var index = 0; index < clipNames.length; index++) {\n fadeSound(cleanClipName(clipNames[index]), false);\n }\n }\n };\n\n\n /* <<quieter>>\n \n Reduces the story's globalVolume by 1/10th of the reader's system volume.\n Thus creates a 10-unit volume range for the story\n \n */\n macros.quieter = {\n handler: function () {\n adjustVolume(-1);\n }\n };\n\n /* <<louder>>\n \n Increases the story's globalVolume by 1/10th of the reader's system volume.\n Thus creates a 10-unit volume range for the story\n \n */\n macros.louder = {\n handler: function () {\n adjustVolume(1);\n }\n };\n\n\n /* jumpscare\n \n Play the clip at maximum story volume\n Don't affect any stored volume options\n PLEASE GIVE THE READER A STARTLE WARNING BEFORE USING THIS.\n \n */\n macros.jumpscare = {\n handler: function () {\n var args = manageCommonArgs(arguments, [clipNameLabel]);\n var soundtrack = getSoundTrack(args[0]);\n soundtrack.setVolumeProportion(1.0);\n soundtrack.updateVolume();\n soundtrack.play();\n }\n };\n\n /***********************************************************\n * END MACROS\n /***********************************************************/\n\n\n\n}());\n\n// You read the whole thing! THAT'S PRETTY RAD. Keep up the good work, and happy Twining.\n
<img src="arrow_icon.jpg"="100px" height="122px">\nYou head into the Junior Common Room and buy a coffee for four dollars and some cents. It tastes good. <<set $mood to 1>>\n\nNow that you feel more calm and also anxious, it's a good time to look for Trennor. It's possible he showed up already and is lost in the bowels of UC with no cell service.\n\n[[see if trennor is inside]]\n\n[[talk to the lit about it]]\n<<fadeoutsound "sunnyday.mp3">>\n<<fadeinsound "coffee.mp3" 0.2>>
<img src="garg3.jpg"="100px" height="122px">\nNo time to think about what you've done. Are you proud? Maybe. It's not relevant.\n\n[[search for loot]]\n\n[[go up the stairs]]
<img src="stairs.jpg"="100px" height="122px">\nAt the top of the stairs you emerge in a room not unlike the one that led you here. Only instead of three doors, this one only has one door. A great wide door, with thick sheaths of paint peeling off like rotted pancakes, black mold spidering up its planks.\n\nYou feel, in your stomach and heart and lungs, a great sense of forboding. But there is no way back.\n\nSo...\n\n[[open the door]]\n\n[[i wish trennor were here]]
<img src="alert_icon.jpg"="100px" height="122px">\nYou step out onto the floating walkway. The surface bobs under your feet unnervingly. You pause. Still time to turn back? Too your horror, the floor behind you is disintegrating and sinking away. Soon, the part where you stand will be below the water too.\n\n[[run for it]]\n\n[[tread carefully]]
<img src="acid.jpg"="100px" height="122px">\nYou dip your leg into the water. Mistake. You should have noticed that chemical smell. The water isn't water. You pull your leg out. You pant leg has been eaten away.\n<<set $acid to "true">>\n[[hell]]\n\n[[enter the stupid xylophone room]]
<img src="garg6.jpg"="100px" height="122px">\nYou use your hands for the purpose they were surely made. You bash and scratch and punch and kick.\n\nThe Goblin Prince howls. He grabs a thick fistful of your hair. You dig your fingers into his eye sockets. He screams.\n<<if $sliced is "true">><<elseif $acid is "true">> You are in great pain too. He shoves you into the wall and you cry out.<<endif>>\n\n[[finish this]]\n
<img src="garg7.jpg"="100px" height="122px">\nWhining at me isn't going to help anything.\n\n[[i guess|inspect one of the statues]]
Battle! In the Dungeon
<img src="garg7.jpg"="100px" height="122px">\nI'm sorry. You have to open the door.\n\n[[open the door]]\n<<set $unhelpful to "true">>
<img src="crying_icon.jpg"="100px" height="122px">\nYou double back to the quad. Trennor is gone. You cross to the stairs, leading down into the dark.\n\nDare you descend them? Return to the depths?\n\nThe first step is the hardest. And after that, the climb down is easy.
<img src="garg6.jpg"="100px" height="122px">\nNo! I'm not! I'm trying to help you! I want you to win!\n\n[[fuck you!]]\n\n[[then help me!]]
<img src="danger.jpg"="100px" height="122px">\nYou punch and grapple. The thing is bigger than you, but it's brittle. Legs snap off in your hands. A whining hiss fills your ears. You punch your hand up and paper thin skin sheds against your hand, showering you in dusty, sticky guts.\n<<set $guts to "true">>\n[[pick yourself up]]\n\n[[weep gently]]
It shouldn't come as a surprise that I can't tell you.\n\n[[all right, whatever|go up the stairs]]
<img src="colbert.jpg"="100px" height="122px">\nYes.\n\n[[shake the hand]]
The Gargoyle! University College's student newspaper.\n\nWe are a bemusing and adventurous satirical publication. Biweekly too.\n\nREAD AT: [[http://ucgargoyle.ca]]\n\nThis story was written by Penelope Evans, with thanks to Sophia Park for technical assistance.\n\nThe audio was supplied by the following creators, and retrieved from freesound.org\n\nScolex,\nDigifish,\nLuftrum\n
<img src="garg3.jpg"="100px" height="122px">\nYeah, kind of. You gotta go through one of them though, right?\n\n[[peeing door]]\n\n[[barf door]]\n\n[[passive-aggressive door]]
<img src="LIT.jpg"="100px" height="122px">\nDamn! Social anxiety got the better of you again.\n\n"Uh, nothing," you mumble, fleeing the Junior Common Room. Okay. Now you're back in the quad. Might as well see if Trennor is in one of the nearby stairwells for some reason. Your hand lingers on the freshly-installed handle of the F door.\n\n[[see if trennor is inside]]
<img src="sword_alt_icon.jpg"="100px" height="122px">\nYou hand the sword over to waiting, clawed hands.\n\nBut the figure laughs.\n\n"Not enough! This is no offering. Trade me something better!"\n\n[[my phone|bad times]]\n\n[[my keys|bad times]]
<img src="question_icon.jpg"="100px" height="122px">\nYou descend into the depths. It's almost too dark to see down here.\n\n[[turn on a light]]\n\n[[whatever]]
<img src="garg5.jpg"="100px" height="122px">\nThrough the door you enter not a room at all, but a short hallway. At the end of it, a flight of stairs leads up, into the unknown.\n\nSeems like it might be an exit after all. You have perhaps been a victim of a little jape, or prank, if you will.\n\n[[i'm laughing. haha.]]\n\n[[climb the stairs]]
<img src="colbert.jpg"="100px" height="122px">\nYes. you do.\n\n[[shake the hand]]
<img src="arrow_icon.jpg"="100px" height="122px">\nYeah, probably a good plan. You manage to resist the thrall of very stale pizza that other people have bitten and then kicked around in the dust.\n\n[[moving on]]
<img src="arrow_icon.jpg"="100px" height="122px">\nDon't mention it. I hope you make it.\n\n[[do something you may regret]]
<img src="garg4.jpg"="100px" height="122px">\nYou step quietly into the room. No statue makes a move. Which is good because if they did you would absolutely lose your mind.\n\nThere's a door on the other side.\n\n[[go try the door]]\n\n[[inspect one of the statues]]
<img src="garg3.jpg"="100px" height="122px">\nThere's no shame in giving up. You pull your hands out of the centipede corpse and give 'em a quick wipe on your jeans.\n\n[[go up the stairs]]\n\n[[weep]]
<img src="arrow_icon.jpg"="100px" height="122px">\nAt the top of the stairs you emerge in a room not unlike the one that led you here. Only instead of three doors, this one only has one door. A great wide door, with thick sheaths of paint peeling off like rotted pancakes, black mold spidering up its planks.\n\nYou feel, in your stomach and heart and lungs, a great sense of forboding. But there is no way back.\n\nSo...\n\n[[open the door]]\n\n[[i wish trennor were here]]
<img src="crying_icon.jpg"="100px" height="122px">\n\nI know.
<img src="garg4.jpg"="100px" height="122px">\nThat's the spirit!\n\n[[i guess]]
<img src="garg7.jpg"="100px" height="122px">\nThat's the catch.\n\n[[oh]]
<img src="exit_icon.jpg"="100px" height="122px">\nThere are stairs beyond the door. You climb for what seems like forever. At last, you see light. You emerge at the back of the quad. How did you never notice these stairs leading into ominious depths before?\n\nThe sun is streaming down on the brown grass. <<if $acid is "true">>\sThe spring breeze is gentle, it burns your raw skin.<<elseif $sliced is "true">>\sThe spring breeze stings the cut on your back.<<endif>>\n<<fadeoutsound "soft.mp3">>\nSomeone is crossing the grass towards you. He's waving. You don't know his face.\n<<fadeinsound "sunnyday.mp3">>\n[[hello?]]
<img src="crying_icon.jpg"="100px" height="122px">\nYou grab onto the coat of the Goblin Prince. Slam his head into the wall. Once is enough. He slumps to the ground. Blood smears your fingers when you let go.\n\n[[leave this place]]
Looks like you have aspied my menu, from the depths of the dungeon I have ensnared you in. They are tumultous depths, I know. \n\nWhat can I do for you?\n\n[[who in the heck?]]\n\n[[i hate this story]]\n\n[[i love this story]]
<img src="crown_icon.jpg"="100px" height="122px">\n"What do you offer me in trade?" the figure whispers.\n\nWhat do you have to give?\n\n[[my phone]]\n\n[[my keys]]\n<<if $sword is "true">>\n[[my sword]]<<endif>>
<img src="exit_icon.jpg"="100px" height="122px">\nThis door is gross, but apparently it beckons to you. You turn the handle and it creaks open.\n\nInside is a long room. A thin walkway floats in a pool of water. On the other side, you can see a platform with a door on the back wall. The door is marked "EXIT" in soft-glowing red.\n\n[[onward]]\n\n[[actually nope]]
<img src="phone_icon.jpg"="100px" height="122px">\nNo texts from Trennor. And he didn't reply to your facebook message asking why he's late.\n\n[[check twitter]]
<img src="garg3.jpg"="100px" height="122px">\nI don't "want" anything.\n\n[[is trennor dead?]]
<img src="sun_icon.jpg"="100px" height="122px">\nYou double back to the bench where he's sitting.\n\nYou ask him his name.\n\n"I'm Trennor. We're friends, or... we were. Sorry. Something very strange happened to me today."\n\nYou sit down on the bench.\n\nYou ask him to tell you about it.\n\nHe tells you.
<img src="crown_icon.jpg"="100px" height="122px">\nYou take a stumbling step back, but he seems to loom larger.\n\n"I am the Goblin Prince," his voice booms against the stone walls, "and you'd best learn to bargin better."\n\n[[use your hands]]\n<<if $sword is "true">>\s\n\n[[use your sword]]<<endif>>
<img src="garg4.jpg"="100px" height="122px">\nYou punch and grapple. The thing is bigger than you, but it's brittle. Legs snap off in your hands. A whining hiss fills your ears. You punch your hand up and paper thin skin sheds against your hand, showering you in dusty, sticky guts.\n<<set $guts to "true">>\n[[get up]]\n\n[[have a quick cry]]
<img src="no_icon.jpg"="100px" height="122px">\nStill nothing! What the hell, Trennor! You guys were going to meet up so you could go over your pitches for the Varsity, but you definitely don't feel like doing it alone.\n\n[[get a coffee to calm down]]\n\n[[see if trennor is inside]]\n
<img src="stairs.jpg"="100px" height="122px">\nYou wrench open the door. There's a stack of musty papers behind it, preventing you from opening it all the way. On the wall opposite you is a fading illustration of Justin Trudeau makng out with Steven Harper. O-kay.\n<<fadeoutsound "sunnyday.mp3">>\n[[up the stairs]]\n<<fadeoutsound "coffee.mp3">>\n[[down the stairs]]\n<<fadeinsound "soft.mp3" 0.1>>
<img src="sun_icon.jpg"="100px" height="122px">\nThe sun is sinking low over the buildings when you head for home.\n\nWhen you leave the campus, it feels as if a spell is breaking.\n\nYou begin to cry.\n\nIt's okay.\n\nI knew you'd make it out.\n\nI'm so proud.\n\n[[you suck.]]
<img src="phone_icon.jpg"="100px" height="122px">\nYou hand the phone over to waiting, clawed hands.\n\nBut the figure laughs.\n\n"Not enough! This is no offering. Trade me something better!"\n\n[[my keys|bad times]]\n<<if $sword is "true">>\s\n[[my sword|bad times]]<<endif>>
<img src="garg3.jpg"="100px" height="122px">\nIt doesn't work. You lay flat on your face and pretend to have died, and the thing cuts a wide slice on your back with its horrible clawed feet.\n<<set $sliced to "true">>\n[[fuck!]]\n\n
<img src="garg1.jpg"="100px" height="122px">\nThis door is kind of gross. <<if $pizza is "true">> But you did just eat horrible floor pizza, so who are you to judge?\n<<endif>>\nYou turn the handle. The door creaks open. Inside is an empty room, but there's a doorway on the back wall, with stairs leading up out of sight. Could be an exit.\n\n[[step inside]]\n\n[[uhhhh nevermind]]
<img src="exit_icon.jpg"="100px" height="122px">\nThere are stairs beyond the door. You climb for what seems like forever. At last, you see light. You emerge at the back of the quad. How did you never notice these stairs leading into ominious depths before?\n\nThe sun is streaming down on the brown grass. <<if $acid is "true">>The spring breeze is gentle, it burns your raw skin.<<elseif $sliced is "true">>The spring breeze stings the cut on your back.<<endif>>\n<<fadeoutsound "soft.mp3">>\nSomeone is crossing the grass towards you. It's Trennor!\n<<fadeinsound "sunnyday.mp3">>\n[[hug him]]\n\n[[give a friendly wave]]\n
<img src="crying_mouth_icon.jpg"="100px" height="122px">\nNo, you can't. <<if $sliced is "true">>And your back hurts.<<endif>>\n\n[[fine|get up]]
<img src="question_icon.jpg"="100px" height="122px">\nReally?\n\n[[i'm going through the door, okay?|enter the stupid xylophone room]]
<img src="phone_icon.jpg"="100px" height="122px">\nYou refresh your Twitter feed. Nothing new. Your old roommate liked one of your Instagram pics. Okay.\n\n[[check for texts again]]
<img src="colbert.jpg"="100px" height="122px">\nIt's a cutout of Colbert! What a friendly-looking guy he is.\n\nYou kind of wanna shake his hand.\n\n[[yeah!]]\n\n[[no i don't]]\n\n[[do i?]]
<img src="sword_alt_icon.jpg"="100px" height="122px">\nYou pull the item from its nest inside the guts. It's a sword! Worn and chipped. The blade is surely dull. But it's something.\n\nWith the blade in hand, you feel a little more confident.\n<<set $sword = "true">>\n[[fix the statues|shift the statues to match color]]
<img src="piss_icon.jpg"="100px" height="122px">\nYou take one careful step, and then another. Just when you are close to the other side, your foot sinks through the disolved walkway, soaking your leg up to the knee. You manage to hurl yourself onto the solid floor at the other side.\n<<set $acid to "true">>\nYou are now close enough to read the fine print on the exit sign, and you're not gonna like it.\n\nE.X.I.T - (Experimental Xylophone Intuition Trials)\n\n[[that sounds very bad]]\n\n[[are you shitting me]]\n
<img src="crying_icon.jpg"="100px" height="122px">\nYou know, I wish that also?\n\nI feel as if I have gotten to know you.\n\nI've been your guide of sorts.\n\nAnd while perhaps I have not done the best job...<<if $sliced is "true">><<elseif $acid is "true">>\sand you have paid the price.<<endif>>\n\nI do hope that you make it. And for what's ahead, I am sorry.\n\nI hope you can believe that. It's the truth.\n\n[[okay]]\n\n[[leave me alone]]\n\n[[thank you]]
<img src="garg5.jpg"="100px" height="122px">\n"Heart, lungs, liver, bones!"\n\n[[take a step back]]\n\n<<if $helpful is "true">>\s[[help me]]<<endif>>
<img src="crying_icon.jpg"="100px" height="122px">\nI'm sorry. I wish I could be of more help.\n\n[[thanks anyways]]
<img src="piss_icon.jpg"="100px" height="122px">\nUnfortunately no. And unless you want to swim for it, there's no way back. <<if $acid is "true">> Aaand, the water probably wasn't water. Because it's eaten away at your pant leg. <<endif>>\n\n[[hell]]\n\n[[enter the stupid xylophone room]]
<img src="question_icon.jpg"="100px" height="122px">\nYou dig around inside the guts of the centipede husk. What secrets may lay within? You fingers brush something hard and slick.\n\n[[yank it free]]\n\n[[no, no, i changed my mind]]
<img src="garg7.jpg"="100px" height="122px">\nYou turn to leave. He says nothing to stop you.\n\nWhen you look back over your shoulder, he's still there, sitting on a bench, kicking idly at the ground.\n\nHe looks so lost.\n\nBut you don't know him.\n\n[[ask him his name]]\n\n[[go home]]
<img src="stairs.jpg"="100px" height="122px">\nUp you go!\n\nAt the top of the stairs you emerge in a room not unlike the one that led you here. Only instead of three doors, this one only has one door. A great wide door, with thick sheaths of paint peeling off like rotted pancakes, black mold spidering up its planks.\n\nYou feel, in your stomach and heart and lungs, a great sense of forboding. But there is no way back.\n\nSo...\n\n[[open the door]]\n\n[[i wish trennor were here]]
<img src="pizza_icon.jpg"="100px" height="122px">\nYou find a lot of spiders, and some broken pool cues? No, snooker cues. Are they still called cues in billiards? You want to google it but your phone is dead.\n\nThere's also some pizza scraps down here.\n\n[[eat the pizza scraps]]\n\n[[definitely don't eat the pizza scraps]]
<img src="garg7.jpg"="100px" height="122px">\nIt shouldn't come as a surprise that I can't tell you.\n\n[[fine. fuck you.]]
by Garg Net Dot Gov
<img src="alert_icon.jpg"="100px" height="122px">\nYou manage to slip past, but not before the clawed legs of the centipede cut a score through your tender backflesh.\n<<set $sliced to "true">>\n[[fuck!]]\n\n[[keep going|go up the stairs]]
<img src="alert_icon.jpg"="100px" height="122px">\nYou step inside, headed for the stairs on the other side. Something huge and heavy and.. hairy, drops from the ceiling onto you. For a moment, you are trapped on the floor, caught up in a tangle of countless spindly legs.\n\n[[fight your way free]]\n\n[[pretend to have died]]\n\n[[piss yourself]]
[[What the Hunk?]]
<img src="garg6.jpg"="100px" height="122px">\nYou've been hurt! In both body and pride. Now what?\n\n[[fight!|fight your way free]]\n\n[[run!|go up the stairs]]
<img src="garg6.jpg"="100px" height="122px">\nYou raise your sword and make one final stab. Drive it in with both hands.\n\nThe Goblin Prince cries out.\n\nIt's a sound that makes you feel like waffle batter in a hot iron. Like a washcloth soaking in the bottom of the sink. Like blood quick drying on guilty fingers.\n\nHe sinks to the ground, dead.\n\nThe papers flutter, as if in the slightest breeze.\n\nBehind the empty throne, on the back wall, an exit sign lights up.\n\n[[leave this place]]
<img src="garg1.jpg"="100px" height="122px">\nStanding there yelling isn't going to help anything.\n\n[[true|inspect one of the statues]]
<img src="question_icon.jpg"="100px" height="122px">\nYou slam the door shut and back up a few steps. Now you're faced with a choice again.\n\n[[peeing door]]\n\n[[passive-aggressive door]]\n\n[[wait no barf door again|barf door]]
<img src="garg3.jpg"="100px" height="122px">\nIt doesn't work. You lay flat on your face and pretend to have died, and the thing cuts a wide slice on your back with its horrible clawed feet.\n<<set $sliced to "true">>\n[[fuck!|fight it off!]]
<img src="quad.jpg"="100px" height="122px">\nYou wave to Trennor. He waves back, jogging across the quad to meet you. His eyes seem oddly haunted.\n\nYou chide him for being late.\n\nHe laughs.\n\nYour own laugh seems trapped in your throat.\n\nTrennor doesn't ask about the blood on your hands. He doesn't ask about anything. It's just as well. \n\nNeither of you want to work on pitches for the Varsity anymore. You part ways and head for home.\n\n[[double back]]\n\n[[keep walking]]
Haha cool. I made it with you in mind.\n\nJust kidding!\n\nBut seriously thank you for playing.\n\nIf you love this kind of thing, you'll love the garg too!\n\nREAD AT: [[https://ucgargoyle.ca/]]
<img src="alert_icon.jpg"="100px" height="122px">\nOkay! You step over the threshold and descend the steps. There's a door at the bottom, handle barely visible in all this gloom. You glance back at the top and the secret door...\n\n[[yes???]]
<img src="arrow_icon.jpg"="100px" height="122px">\nCalm down, tough guy! \n\nYou proceed into the gloom fearlessly.\n\n[[hold up]]
<img src="sword_alt_icon.jpg"="100px" height="122px">\nYou pull the item from its nest inside the guts. It's a sword! Worn and chipped. The blade is surely dull. But it's something.\n\nWith the blade in hand, you feel a little more confident.\n<<set $sword to "true">>\n[[onwards!|go up the stairs]]
<img src="quad.jpg"="100px" height="122px">\nAnother sunny day in the quad. Not a cloud in the sky, not a mud in the field. You've been waiting here for a while, where your friend Trennor was supposed to meet you. Trennor is notoriously good at time keeping, despite his laid-back attitutde, so his lateness is a little concerning.\n\n[[check your phone]]\n<<playsound "sunnyday.mp3" 0.6 200 false>>
<img src="garg3.jpg"="100px" height="122px">\nWow. Nothing phases you, huh?\n\nWhich door are you gonna pick though?\n\n[[barf door]]\n\n[[peeing door]]\n\n[[passive-aggressive door]]
<img src="garg1.jpg"="100px" height="122px">\nYou dig around inside the guts of the centipede husk. What secrets may lay within? You fingers brush something hard and slick.\n\n[[pull it out]]\n\n[[i actually don't want to do this anymore]]
<img src="garg1.jpg"="100px" height="122px">\nIt takes some doing, but you manage to get all the statues to match up.\n\nWhen you give the red gem statue the final shove onto the red plate, you hear a heavy clunk from the door.\n\n[[try the handle]]
<img src="garg7.jpg"="100px" height="122px">\nPlease... just go up the stairs.\n\n[[fine|go up the stairs]]\n\n
<img src="crying_icon.jpg"="100px" height="122px">\nYou let out a few long, keening sobs. But you can't lie on the dusty floor crying forever.\n\n[[i suppose]]\n\n[[i can and i will]]
<img src="garg6.jpg"="100px" height="122px">\nSomething might, sooner or later.\n\nYou notice that throughout all this you haven't been bathed in darkness, despite now being well and truly trapped underground.\n\nThere are torches along the wall, each with a disgustingly energy inefficient incandescent bulb that came on when you entered.\n\n[[k.]]
<img src="question_icon.jpg"="100px" height="122px">\nWait a second. The groan didn't come from Colbert. It came from behind him.\n\n[[push the cutout aside]]\n\n[[scavenge for supplies under the snooker table]]
<img src="garg6.jpg"="100px" height="122px">\nYou push the statues onto the plates closest them. As you slide the red statue onto the blue plate, you hear an ominious groan, and then a clicking noise. It comes from above you. You look up. A panel on the ceiling has slid out. \n\nSomething huge and heavy and.. hairy, drops from the ceiling onto you. For a moment, you are trapped on the floor, caught up in a tangle of countless spindly legs.\n\n[[fight it off!]]\n\n[[play dead]]
<img src="alert_icon.jpg"="100px" height="122px">\nWhoa! A real tough customer over here. Bet you eat nails for breakfast! \n\n[[bite me]]
<img src="alert_icon.jpg"="100px" height="122px">\nThere's another light on down here. Down the darkened hallway. Light is spilling from an open, heavily-defaced door. And there's a short set of stone steps leading up to a room.\n\nAs if in a trance, you stumble forward. Through the hall, up the stairs and into the room. It has concrete floors and stone walls. Musty beige couches and metal tables. Classroom chairs.\n\nThere's a second room beyond, and a light on in that room as well.\n\n[[go beyond]]
<img src="crying_mouth_icon.jpg"="100px" height="122px">\nYou can't and you won't.\n\n[[urgh]]
<img src="stairs.jpg"="100px" height="122px">\nBehind the cutout, a door has opened in the stones of the wall, and you can see stairs, leading down into the dark.\n\nDare you step inside?\n\n[[yeah]]\n\n[[um, no thanks]]
<img src="question.jpg"="100px" height="122px">\nYou slam the door shut and back up a few steps. Now you're faced with a choice again.\n\n[[passive-aggressive door]]\n\n[[barf door]]\n\n[[peeing door again for some reason|peeing door]]
<img src="crying_icon.jpg"="100px" height="122px">\nYou let out a few long, keening sobs. But you can't lie on the dusty floor crying forever.\n\n[[yes i can]]\n\n[[i guess|get up]]
<img src="LIT.jpg"="100px" height="122px">\n"Sorry, never heard of him."\n\n"Is he a commisioner?"\n\n"Wait, is he one of the reps?"\n\n[[nevermind]]
<img src="question_icon.jpg"="100px" height="122px">\nYou can trade him a memory. For this, surely he'd provide you your freedom.\n\n[[do i get to choose which memory?]]
<img src="danger.jpg"="100px" height="122px">\nTakes one to know one. Uh, I mean, you turn the handle, and the door creaks, and you step inside.\n\nUnfortunately, this door does swing shut behind you.\n\n[[frantically jiggle the handle]]\n\n[[who cares]]
<img src="sword_alt_icon.jpg"="100px" height="122px">\nYou rush the Goblin Prince, slashing at his papers and hoping that the body underneath is soft. Ink-black blood spatters the concrete floor. The Goblin Prince roars in anger or auguish or something else.\n\nHe strikes you across the face.\n\n[[his heart|his eye]]\n\n[[his eye]]\n\n[[his liver|his eye]]
<img src="garg3.jpg"="100px" height="122px">\nWe just going to wait here? <<if $acid is "true">> Your leg looks like it hurts. <<endif>> It may not be an exit through there, but it's something. You're not going to find Trennor just moping in here.\n\n[[yeah. you're right.]]
<img src="arrow_icon.jpg"="100px" height="122px">\nThe passageway beckons...\n\n[[fine]]
<img src="question_icon.jpg"="100px" height="122px">\nThis door is kind of forbidding, or maybe not. You turn the handle and it creaks open.\n\nInside, there are gargoyle statues, each taller than you or even Trennor. If only Trennor was here now, because he'd be totally into this secret passageway dungeon-puzzle shit.\n\nThe statues all have their backs to you, and seem to be standing in no particular formation.\n\n[[enter the room]]\n\n[[haha no thanks]]
<img src="arrow_icon.jpg"="100px" height="122px">\nYou're gonna be okay.\n\n[[open the door]]\n<<set $helper to "true">>
<img src="garg5.jpg"="100px" height="122px">\nThe door opens! Beyond it is a flight of stairs, leading up out of sight.\n\n[[onwards|up we go]]
<img src="question_icon.jpg"="100px" height="122px">\nYou locate a lightswitch and flick it up. The lights flicker on down the hall, fritzing and blinking as they come to life. Ah. This is a real basement.\n\n[[hold up]]
<img src="who.jpg"="100px" height="122px">\nWell that shaved a few years off your life, but you realize, peering through the dust and gloom, that it's not a person at all.\n\n[[it's... ]]
<img src="sun_icon.jpg"="100px" height="122px">\nThe sun is at your back.\n\nYour heart and lungs and liver feel heavy.\n\nBut you keep heading for home.\n\nHey, it's okay.\n\nYou did just fine.
<img src="pizza_icon.jpg"="100px" height="122px">\nMmm. Those did not taste good. And they probably had spiders on them, so I hope you're proud of yourself.\n<<set $pizza to "true">>\n[[moving on]]
<img src="exit_icon.jpg"="100px" height="122px">\nYou book it down the walkway at your top speed, which is pretty slow because the last time you did any running was last week when you slept through all four alarms for your ten am tutorial.\n\nBut you manage to make it to the other side before the last of the walkway sinks into the depths below.\n\nYou are now close enough to read the fine print on the exit sign, and you're not gonna like it.\n\nE.X.I.T - (Experimental Xylophone Intuition Trials)\n\n[[that sounds very bad]]\n\n[[are you shitting me]]\n
<img src="garg1.jpg"="100px" height="122px">\nThe Goblin Prince leans back in his chair. And he laughs and laughs. You begin to feel kind of hazy. The room tilts on its axis. You brace yourself on the stone wall.\n\nAnd then, as quickly as it came, the feeling is gone. The world rights itself.\n\nAnd behind the Goblin Prince, on the back wall, an exit sign lights up. You slip past him quickly.\n\n[[escape]]
<img src="alert_icon.jpg"="100px" height="122px">\nYou shake the hand. It's a little crumpled, but still fun. You pull down on it.\n\n"Haha, crazy to meet you Colbert," you say. A long, ominious groan emanates from Colbert's body.\n\n[[holy cripes! (reprise)]]
body {\n margin: 10% 0 10% 0;\n}\n#passages{\n margin: 0;\n padding: 0;\n border: 0;\n}\n#passages img {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tborder: dotted #fff 0.05em;\n}\n.passage, #sidebar * {\n font-family: Consolas, Monaco, sans-serif;\n color:#ffffff;\n text-align:center;\n}\n.passage {\n border-radius: 0.2em;\n width: 60%;\n margin: auto;\n padding: 2em;\n font-size:1rem;\n background-color:#black;\n border: dotted #fff 0.05em;\n box-shadow: dotted #fff 0.5em 0.5em 0;\n}\na.internalLink, a.externalLink {\n padding: 0.1em 0.2em 0.1em 0.2em;\n color:#966656;\n}\na.internalLink:hover, a.externalLink:hover {\n text-decoration: none;\n color:#966656;\n}\na.internalLink:active, a.externalLink:active {\n color: #966656;\n}\nbody {\n background-color: #242424;\n}\n#sidebar {\n position:absolute;\n top:0px;\n left:0px;\n width:99.2%;\n overflow-x:hidden;\n background-color:#966656;\n border-bottom: dotted #fff 1px;\n}\n#sidebar * {\n color: #242424 !important;\n font-size:1.5rem;\n background-color:clear !important;\n display:inline !important;\n}\n#sidebar a:hover, #sidebar #snapback:hover, #sidebar #restart:hover {\n text-decoration:underline !important;\n}\n#sidebar a:active, #sidebar #snapback:active, #sidebar #restart:active {\n color:#fff !important;\n font-size:1.5rem;\n background-color:#000 !important;\n display:inline !important;\n}\n#sidebar li, #sidebar li > span {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n#sidebar a, #sidebar a:hover {\n border: 0 !important;\n box-shadow: none;\n}\n.menu {\n background-color:#fff;\n color:#000;\n opacity:1;\n font-size: 1.5rem;\n border: solid #000 1px;\n box-shadow: #000 0.1em 0.1em 0;\n}\n.menu div:hover {\n background-color:#000;\n color:#fff;\n}\n#credits, #share, #titleSeparator, #sidebar li br {\n display:none !important;\n}
<img src="ball.jpg"="100px" height="122px">\nIn the second room is a massive, sprawling table. Like a pool table but huge. You google: "really big pool table" quickly. It's a snooker table. You start reading the rules to snooker. You glimpse a shadowy figure out of the corner of your eye.\n\n[[holy cripes!]]
<img src="piss_icon.jpg"="100px" height="122px">\nIt seems only appropriate. The thing scuttles back up the wall, seemingly disturbed by your primitive form of self-defence.\n\nIt's a giant centipede. It's blocking your path to the stairs.\n\nWhat next?\n<<set $piss to "true">>\n[[try to duck past]]\n\n[[use your hands for the purpose they were surely made]]
<img src="garg4.jpg"="100px" height="122px">\nThat purpose? Killing. You punch and grapple. The thing is bigger than you, but it's brittle. Legs snap off in your hands. A whining hiss fills your ears. You punch your hand up and paper thin skin sheds against your hand, showering you in dusty, sticky guts.\n<<set $guts to "true">>\n[[run away from your crimes|go up the stairs]]\n\n[[weep]]
<img src="arrow_icon.jpg"="100px" height="122px">\nBoy are you a skeptic! A spider or perhaps just some hair brushes your hand.\n\n[[time to get out from under this table real quick]]
<img src="garg1.jpg"="100px" height="122px">\nAll right! Seeing as there's no where else to go, you proceed down the hallway. It's kind of long, but you can see an open archway at the end, and when you arrive there, you emerge into a tall, round room, with three doors.\n\nEach one is totally unmarked, but each has a gargoyle sitting at the top. One that seems to be... vomiting, and one that is... maybe peeing and one with its back to you.\n\n[[that's kinda gross]]\n\n[[cool, cool, whatever]]
<img src="question_icon.jpg"="100px" height="122px">\nYou slam the door shut and back up a few steps. Now you're faced with a choice again.\n\n[[barf door]]\n\n[[peeing door]]\n\n[[passive-aggressive door again|passive-aggressive door]]
<img src="garg7.jpg"="100px" height="122px">\nI can't! I want to but I... I can't. Please just go up the stairs.\n<<set $helper to "true">>\n[[fine.|go up the stairs]]
<img src="exit_icon.jpg"="100px" height="122px">\nYou re-enter the Junior Common Room. You buy a coffee for three dollars and eighty-eight cents.\n\nSomeone is playing the piano. The Literary and Athletic society are setting up an event. They ask you to leave.\n\nYou head back outside.\n\nThe sun is beginning to sink low over the buildings.\n\nThat guy you don't know is sitting on a bench, looking lost.\n\nBut you don't know him. So you might as well go home.
<img src="garg1.jpg"="100px" height="122px">\nYou run to Trennor and wrap your arms around him<<if $guts is "true">> centipede guts be damned<<endif>>. He hugs you back, tightly. When he lets you go, you recognize a haunted look in his eyes.\n\nYou chide him for being late.\n\nHe laughs.\n\nYour own laugh seems trapped in your throat.\n\nTrennor doesn't ask about the blood on your hands. He doesn't ask about anything. It's just as well. \n\nNeither of you want to work on pitches for the Varsity anymore. You part ways and head for home.\n\n[[double back]]\n\n[[keep walking]]
<img src="arrow_icon.jpg"="100px" height="122px">\nThat's the spirit!\n\n[[fix the statues|shift the statues to match color]]
<img src="garg1.jpg"="100px" height="122px">\nThe Goblin Prince's voice booms against the stone walls.\n\n"Well? What will you give me?"\n\n[[a memory]]\n\n[[fuck you|take a step back]]
<img src="crying_mouth_icon.jpg"="100px" height="122px">\nI can't tell you that. Look, I'm trying to help you. You think I get some sort of sick pleasure out of this? I'm not a monster. I want you to get out too.\n\n[[you are a monster!]]\n\n[[i'm never going to see trennor again, am i?]]
<img src="garg7.jpg"="100px" height="122px">\nYou have to open the door.\n\n[[open the door]]
<img src="garg3.jpg"="100px" height="122px">\nIt's locked, idiot.\n\n[[aaaaaaahh]]\n\n[[shut up, please]]
<img src="crown_icon.jpg"="100px" height="122px">\n"Not enough!" the figure barks. The door slams shut behind you.\n\n"You don't want to get out? Trade me something better!"\n\n[[like what?]]
<img src="phone_icon.jpg"="100px" height="122px">\nYou hide under the snooker table some more. If Trennor has texted, you have no way of knowing, since your phone is dead.\n\nThere's a chance he's down those mysterious stairs inside that secret passageway though.\n\n[[yeah right.]]
<img src="garg3.jpg"="100px" height="122px">\nYou get up off the ground and brush yourself off.\n\n[[check body for loot]]\n\n[[fix the statues|shift the statues to match color]]
<img src="question_icon.jpg"="100px" height="122px">\n"I've been looking for you," he says. He's smiling, but his eyes have a haunted look. You feel haunted yourself.\n\n[[i have to go]]\n\n[[get another coffee to calm down]]
<img src="crown_icon.jpg"="100px" height="122px">\n"Too big a question, for someone so young to ask," the figure whispers.\n\n"You are looking for a way out?"\n\n[[i guess so|yes]]
That's fair but please don't tell me about it especially on social media, I have many feelings.
<img src="garg1.jpg"="100px" height="122px">\nHmm, probably for the best. Through the door then.\n\n[[fine|enter the stupid xylophone room]]
<img src="crying_icon.jpg"="100px" height="122px">\nYou let out a few, wracking sobs. Are you ever going to see Trennor again? Do you even want to face Trennor again?\n\n[[is there even a way out?]]\n\n[[go up the stairs]]
<img src="garg1.jpg"="100px" height="122px">\nAre you going up or what? <<if $acid is "true">>I'm glad to see the acid didn't burn away your cutting wit. <<endif>>\n\n[[i'm going.|climb the stairs]]
<img src="arrow_icon.jpg"="100px" height="122px">\nTime to get out from under this table.\n\nDon't hit your head on the way up, it's very thick and also the legs don't seem to be attached properly.\n\n[[push the cutout aside]]
<img src="garg1.jpg"="100px" height="122px">\nNo time to think about what you've done. Are you proud? Maybe. It's not relevant. <<if $sliced is "true">> Are you injured? Yes, but it's also not relevant.<<endif>>\n\n[[check body for loot]]\n\n[[fix the statues|shift the statues to match color]]
<img src="garg7.jpg"="100px" height="122px">\nI knew he would be too difficult for you. The Goblin Prince has many faces and many words and he drives the hardest bargins. There may be a way to get out of this in one piece. \n\nBut there's a catch.\n\n[[what?]]
<img src="question_icon.jpg"="100px" height="122px">\nYou give the statue a good once-over. This one is standing on a plate in the floor. The plate is being depressed by its weight. The statue has a gem set in its chest. The gem is blue. The plate is yellow. The other statues are near plates as well. Some of them are next to the plate of the corresponding color. Some are not.\n\n[[shift the statues to match color]]\n\n[[push them onto the plates they're close to]]
<img src="LIT.jpg"="100px" height="122px">\nYou hover in the doorway to the Literary and Atheltic Society office. Two students ignore you from the desk. You clear your throat.\n\n"What do you need?" one asks. You know somebody on the Lit but not either of these people.\n\n[[i'm looking for my pal trennor]]\n\n[[nevermind]]\n\n
<img src="colbert.jpg"="100px" height="122px">\nHell yeah!\n\n[[shake the hand]]
<img src="garg1.jpg"="100px" height="122px">\nYeah, kind of. But there's no way back across, unless you want to swim for it.\n\n[[i don't]]\n\n[[i almost majored in swimming]]
<img src="garg7.jpg"="100px" height="122px">\nOkay.\n\n[[okay!]]