<<set $sound = "yes">>\s\n<<set $currentLoops = []>>\s\n<<display "Audio Tracks">>\n<<display "Style Changer">><<hiddenBar>>\s\n<<display "Style Changer">><<night>>\s\n<center><div class="fullwidth">[img[cover_art_striding_place_atherton.png][P01]]</div></center>\n<div style="font-size:80%"><center>\s\n Story Gertrude Atherton\n Interiors Tory Hoke\nInteractivity sub-Q\n Cover Art Elena Distefano\n</center>\nThis story provides the best experience\non a desktop computer with headphones.</div>\n<center>[[Begin|P01]]</center>
<<display "Common Elements">>\s\n<img src="images/P33.png" style="width:100%;"/>\n<p class="ind">[[There was no face.|P34]]</p>
window.fadeCredits = function() {\n\n\tjQuery("#closingCredits").delay(5000).fadeIn(2000);\n\n}\n\nwindow.toggle = function(toggleID) {\n\n\tif (jQuery('#'+toggleID).is(':visible')) {\n\t\tjQuery('#toggleButton').html("[+] (may contain spoilers) ");\n\t\tjQuery('#'+toggleID).hide();\n\t}\n\telse {\n\t\tjQuery('#toggleButton').html("[-] ");\n\t\tjQuery('#'+toggleID).show();\n\t}\n\n}
<<set $hunting_ground = "audio/village_distant_ambience.mp3">>\s\n<<set $river_and_ambience = "audio/nighttime_forest_ambience.mp3">>\s\n<<set $funeral = "audio/funeral.mp3">>\s\n<<set $night_walk = "audio/night_in_the_woods.mp3">>\s\n<<set $river_water = "audio/river_water.mp3">>\s\n<<set $love_theme = "audio/calmness.mp3">>\s\n<<set $epic_theme = "audio/epic_river_water.mp3">>\s\n<<set $sound = "yes">>\s
<div class="audioButton">\s\n<<button "[]">><<stopallsound>><<set $sound = "no">><</button>>\s\n<<button "||">><<pauseallsound>><</button>>\s\n<<button "<)">><<quieter>><</button>>\s\n<<button "<)))">><<louder>><</button>>\s\n<<button "|>">><<fadeinsounds $currentLoops>><</button>>\s\n</div>\n<<display "Audio Tracks">>
<<display "Common Elements">>\s\n<img src="images/P21.png" style="width:100%;"/>\n<p class="ind">The hand was in the same place, still gesticulating as wildly; the body was undoubtedly caught in the rocks below, perhaps already half-way along one of those hideous shelves. Weigall let himself down upon a lower rock, braced his shoulder against the mass beside him, then, leaning out over the water, thrust the branch into the hand. The fingers clutched it convulsively. Weigall tugged powerfully, his own feet dragged perilously near the edge. For a moment he produced no impression, then [[an arm shot above the waters|P22]].</p>
<<display "Common Elements">>\s\n<<display "Style Changer">><<night>>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $funeral>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($funeral),1)>>\s\n<<fadeinsound $night_walk 0.20 5000>>\s\n<<set $currentLoops.push($night_walk)>>\s\n<<endif>>\s\n<img src="images/P07.png" style="width:100%;"/>\n<p class="ind">“I cherish the theory,” Gifford had said, “that the soul sometimes lingers in the body after death. During madness, of course, it is an impotent prisoner, albeit a conscious one. Fancy its agony, and its horror! What more natural than that, when the life-spark goes out, the tortured soul should take possession of the vacant skull and triumph once more for a few hours while old friends look their last? It has had time to repent while compelled to crouch and behold the result of its work, and it has shrived itself into a state of comparative purity. If I had my way, I should stay inside my bones until the coffin had gone into its niche, that I might obviate for my poor old comrade the tragic impersonality of death. And I should like to see justice done to it, as it were—to see it lowered among its ancestors with the ceremony and solemnity that are its due. I am afraid that if I dissevered myself too quickly, I should yield to curiosity and hasten to investigate the mysteries of space.”</p>\s\n<p class="ind">“You believe in the soul as an independent entity, then—that it and the vital principle are not [[one and the same|P11]]?”</p>
<<display "Common Elements">>\s\n<img src="images/P08.png" style="width:100%;"/>\n<p class="ind">“Absolutely. The body and soul are twins, life comrades—sometimes friends, sometimes enemies, but always loyal in the last instance. Some day, when I am tired of the world, I shall go to India and become a mahatma, solely for the pleasure of receiving proof during life of this [[independent relationship|P12]].”</p>
<<display "Common Elements">>\s\n<img src="images/P09.png" style="width:100%;"/>\n<p class="ind">“Suppose you were not sealed up properly, and returned after one of your astral flights to find your earthly part unfit for habitation? It is an experiment I don’t think I should [[care to try|P13]], unless even juggling with soul and flesh had palled.”</p>
<<display "Common Elements">>\s\n<img src="images/P10.png" style="width:100%;"/>\n<p class="ind">“That would not be an uninteresting predicament. I should rather enjoy [[experimenting with broken machinery|P14]].”</p>
<<silently>>\n<<set $StyleChanger = \nfunction()\n{\n\n\tfunction changeLinkClass(newClass)\n\t{\n\t\tvar links = document.getElementsByTagName("a");\n\t\tfor(var i=0;i<links.length;i++)\n\t\t{\n\t\t\tlinks[i].className = newClass;\n\t\t\talert("setting className " + links[i] + " " + newClass);\n\t\t} \n\t}\n\n\tmacros['hiddenBar'] =\n\t{\n\t\thandler: function(){\n\t\t\tdocument.getElementById("ui-bar").style.display="none";\n\t\t\tdocument.getElementById("passages").style.border=0;\n\t\t}\n\t};\n\n\tmacros['visibleBar'] =\n\t{\n\t\thandler: function(){\n\t\t\tdocument.getElementById("ui-bar").style.display=true;\n\t\t}\n\t};\n\n\tmacros['day'] =\n\t{\n\t\thandler: function(){\n\t\t\tdocument.getElementsByTagName("body")[0].style.backgroundColor="#DDD";\n\t\t\tdocument.getElementById("passages").className = "day";\n\t\t}\n\t\n\t};\n\n\tmacros['evening'] =\n\t{\n\t\thandler: function(){\n\t\t\tdocument.getElementsByTagName("body")[0].style.backgroundColor="#666";\n\t\t\tdocument.getElementById("passages").className = "evening";\n\t\t}\n\t\n\t};\n\n\tmacros['night'] =\n\t{\n\t\thandler: function(){\n\t\t\tdocument.getElementsByTagName("body")[0].style.backgroundColor="#000";\n\t\t\tdocument.getElementById("passages").className = "night";\n\t\t}\n\t\n\t};\n\n}>>\n<<print $StyleChanger()>>\n<<endsilently>>
<<display "Common Elements">>\s\n<<display "Style Changer">><<night>>\s\n<img src="images/P17.png" style="width:100%;"/>\n<p class="ind">The high wild roar of water smote suddenly upon Weigall’s ear and checked his memories. He [[left the wood...|P16]]</p>
<<display "Common Elements">>\s\n<img src="images/P13.png" style="width:100%;"/>\n<p class="ind">...and walked out on the huge slippery stones which nearly close the River Wharfe at this point, and watched the waters boil down into the narrow pass with their furious untiring energy. The black quiet of the woods rose high on either side. The stars seemed colder and whiter just above. On either hand the perspective of the river might have run into a rayless cavern. There was no lonelier spot in England, nor one which had the right to claim so many ghosts, if ghosts there were.</p>\s\n<p class="ind">Weigall was not a coward, but he recalled uncomfortably the tales of those that had been done to death in the Strid.</p>\s\n<blockquote><i>This striding place is called the ‘Strid,’\nA name which it took of yore;\nA thousand years hath it borne the name,\nAnd it shall a thousand more.</i></blockquote>\s\n<p class="ind">Wordsworth’s Boy of Egremond had been disposed of by the practical Whitaker; but countless others, more venturesome than wise, had gone down into that narrow boiling course, never to appear in the still pool a few yards beyond. Below the great rocks which form the walls of the Strid was believed to be a natural vault, on to whose shelves the dead were drawn. The spot had an ugly fascination. Weigall stood, visioning skeletons, uncoffined and green, the home of the eyeless things which had devoured all that had covered and filled that rattling symbol of man’s mortality; then fell to wondering if any one had attempted to leap the Strid of late. It was covered with slime; he had never seen it look [[so treacherous|P17]].</p>
<<display "Common Elements">>\s\n<img src="images/P18.png" style="width:100%;"/>\n<p class="ind">He shuddered and turned away, impelled, despite his manhood, to flee the spot. As he did so, something tossing in the foam below the fall—something as white, yet independent of it—caught his eye and arrested his step. Then he saw that it was describing a contrary motion to the rushing water—an upward backward motion. Weigall stood rigid, breathless; he fancied he heard the [[crackling of his hair|P18]].</p>
<<display "Common Elements">>\s\n<img src="images/P14.png" style="width:100%;"/>\n<p class="ind">Was that a hand? It thrust itself still higher above the boiling foam, turned sidewise, and [[four frantic fingers|P19]] were distinctly visible against the black rock beyond.</p>
The Striding Place
<<display "Common Elements">>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $epic_theme>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($epic_theme),1)>>\s\n<<fadeinsound $river_and_ambience 0.20 5000>>\s\n<<set $currentLoops.push($river_and_ambience)>>\s\n<<endif>>\s\n<img src="images/P30.png" style="width:100%;"/>\n<p class="ind">Weigall reached the pool. A man in his evening clothes floated on it, his face turned towards a projecting rock over which his arm had fallen, upholding the body. The hand that had held the branch hung limply over the rock, its white reflection visible in the [[black water|P31]].</p>
<<display "Common Elements">>\s\n<img src="images/P31.png" style="width:100%;"/>\n<p class="ind">Weigall plunged into the shallow pool, lifted Gifford in his arms and [[returned to the bank|P32]].</p>
<<display "Common Elements">>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $river_and_ambience>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($$river_and_ambience),1)>>\s\n<<fadeinsound $love_theme 0.20 5000>>\s\n<<set $currentLoops.push($love_theme)>>\s\n<<endif>>\s\n<img src="images/P34.png" style="width:100%;"/>\n[[. . .|P35]]
<<if $sound eq "yes">>\s\n<<fadeoutsound $river_water>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($river_water),1)>>\s\n<<fadeinsound $epic_theme 0.20 5000>>\s\n<<set $currentLoops.push($epic_theme)>>\s\n<<endif>>\s\n<img src="images/P20.png" style="width:100%;"/>\n<p class="ind">Weigall dashed to the nearest tree, dragged and twisted off a branch with his strong arms, and returned as swiftly to [[the Strid|P21]].</p>
<<display "volume controls">>
/*\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\n //------------ End Math methods -------------------------------\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\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\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())) { throwError("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 if (fadeIn) {\n this.stopAndClear();\n this.looping = true;\n }\n else this.looping = false;\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\n //alert("about to set vol to " + globalVolume + " x " + this.volumeProportion);\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())) { return throwError("Can't loop because duration is not known (audio not loaded, probably not found.)"); }\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); // returns list of form ["url/to/audio.fileType",/to/audio,fileType]\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 throwError("Given clipName " + clipName + " does not exist in this project. Please check your variable names."); }\n return clips[clipName];\n\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 throwError("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(func, 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 for (var i = 0; i < func.args.length; i++) {\n switch (typeof func.args[i]) {\n case "string" :\n if (clipName === undefined) clipName = func.args[i].toString();\n break;\n case "number" :\n var tempNum = parseFloat(func.args[i]);\n if (volumeProportion === undefined && tempNum <= 1.0) volumeProportion = tempNum;\n else if (overlap === undefined && tempNum >=updateInterval) overlap = tempNum; \n break;\n case "boolean" :\n if (loop === undefined) loop = func.args[i];\n break;\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 throwError("No audio clip name specified."); } \n break;\n case volumeProportionLabel :\n if (volumeProportion === undefined || volumeProportion > 1.0 || volumeProportion < 0.0) { return throwError("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 throwError("No fade duration specified (must be a number in milliseconds greater than + " + updateInterval + " ms.)"); }\n break;\n case loopLabel :\n if (loop === undefined) { return throwError("No loop flag provided (must be a boolean, aka true or false.)"); }\n break;\n }\n }\n }\n return [clipName, volumeProportion, overlap, loop];\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 /***********************************************************\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.add("updatevolume", {\n handler: function () {\n \n var args = manageCommonArgs(this, [clipNameLabel, volumeProportionLabel]);\n var soundtrack = getSoundTrack(this.args[0]);\n soundtrack.setVolumeProportion(args[1]);\n soundtrack.updateVolume();\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 */\n macros.add("playsound", {\n handler : function () {\n\n var args = manageCommonArgs(this, [clipNameLabel]);\n\n var soundtrack = getSoundTrack(this.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.add("playsounds", {\n handler: function () {\n\n var clipNameString = this.args[0];\n if (this.args[0] === undefined || this.args[0] == "") return;\n clipNameString = this.args[0].toString();\n if (clipNameString == "[]") return;\n var clipNames = clipNameString.split(",");\n if (clipNames.length < 1) return;\n var args = manageCommonArgs(this);\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 clip at its current location. \n Use playsound to resume it.\n\n Parameters:\n\n REQUIRED: clipName\n\n */ \n macros.add("pausesound", {\n handler: function() {\n var args = manageCommonArgs(this, [clipNameLabel]); \n getSoundTrack(this.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.add("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.add("stopsound", {\n handler: function() {\n var args = manageCommonArgs(this, [clipNameLabel]); \n getSoundTrack(this.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.add("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 (0 ms by default)\n */ \n macros.add("loopsound", {\n handler: function () {\n \n var args = manageCommonArgs(this, [clipNameLabel]);\n var soundtrack = getSoundTrack(this.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.add("unloopsound", {\n handler: function () {\n var args = manageCommonArgs(this, [clipNameLabel]); \n getSoundTrack(this.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.add("fadeinsound", {\n handler: function () {\n\n var args = manageCommonArgs(this, [clipNameLabel]);\n \n var soundtrack = getSoundTrack(this.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.add("fadeinsounds", {\n handler: function () {\n\n var clipNameString = this.args[0];\n if (this.args[0] === undefined || this.args[0] == "") return;\n clipNameString = this.args[0].toString();\n if (clipNameString == "[]") return;\n var clipNames = clipNameString.split(",");\n if (clipNames.length < 1) return;\n\n var args = manageCommonArgs(this);\n\n for (var index = 0; index < clipNames.length; index++) {\n var soundtrack = getSoundTrack(this.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.add("fadeoutsound", {\n handler: function () {\n var args = manageCommonArgs(this, [clipNameLabel]); \n fadeSound(this.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.add("fadeoutsounds", {\n handler: function () {\n\n var clipNameString = this.args[0];\n if (this.args[0] === undefined) return;\n clipNameString = this.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.add("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.add("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.add("jumpscare", {\n handler: function () {\n var args = manageCommonArgs(this, [clipNameLabel]);\n var soundtrack = getSoundTrack(this.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\n
<<display "volume controls">>
<img src="none" style="display:none;" onerror="window.fadeCredits();"/>\n<<display "Common Elements">>\s\n<img src="images/P35.png" style="width:100%;"/>\n<div id="closingCredits" style="display:none">\n<center>\nTHE STRIDING PLACE\nby\nGertrude Atherton\n\n Interiors Tory Hoke\nInteractivity sub-Q\n Cover Art Elena Distefano\n\n<iframe src="/html/departureContent.html" style="width:150px;height:150px;padding:0;margin:0;display:block;border:none;overflow:hidden;"></iframe></center>\n</div>
<p class="ind">The blood sprang to Weigall’s head; he was choked with the impression that the Strid had him in her roaring hold, and he saw nothing. Then the mist cleared. The hand and arm were nearer, although the rest of the body was still concealed by the foam. Weigall peered out with distended eyes. The meagre light revealed in the cuffs links of a peculiar device. The fingers clutching the branch were as familiar.</p>\s\n<p class="ind">Weigall forgot the slippery stones, the terrible death if he stepped too far. He pulled with passionate will and muscle. Memories flung themselves into the hot light of his brain, trooping rapidly upon each other’s heels, as in the thought of the drowning. Most of the pleasures of his life, good and bad, were identified in some way with this friend. Scenes of college days, of travel, where they had deliberately sought adventure and stood between one another and death upon more occasions than one, of hours of delightful companionship among the treasures of art, and others in the pursuit of pleasure, flashed like the changing particles of a kaleidoscope. Weigall had loved several women; but he would have flouted in these moments the thought that he had ever loved any woman as he loved Wyatt Gifford. There were so many charming women in the world, and in the thirty-two years of his life he had never known another man to whom he had cared to give his intimate friendship.</p>\s\n<p class="ind">He threw himself on his face. His wrists were cracking, the skin was torn from his hands. The fingers still gripped the stick. There was life in them yet.</p>\s\n<p class="ind">Suddenly something gave way. The hand swung about, tearing the branch from Weigall’s grasp. The body had been liberated and flung outward, though still submerged by the foam and spray.</p>\s\n<p class="ind">Weigall scrambled to his feet and sprang along the rocks, knowing that the danger from suction was over and that Gifford must be carried straight to the quiet pool. Gifford was a fish in the water and could live under it longer than most men. If he survived this, it would not be the first time that his [[pluck and science had saved him from drowning|P30]].</p>
<<display "Common Elements">>\s\n<img src="images/P32.png" style="width:100%;"/>\n<p class="ind">He laid the body down and threw off his coat that he might be the freer to practise the methods of resuscitation. He was glad of the moment’s respite. The valiant life in the man might have been exhausted in that last struggle. He had not dared to look at his face, to put his ear to the heart. The hesitation lasted but a moment. There was no time to lose.</p>\s\n<p class="ind">He turned to his prostrate friend. As he did so, something strange and disagreeable smote his senses. For a half-moment he did not appreciate its nature. Then his teeth clacked together, his feet, his outstretched arms pointed towards the woods. But he sprang to the side of the man and bent down and peered into [[his face|P33]].</p>
/* Your story will use the CSS in this passage to style the page.\nGive this passage more tags, and it will only affect passages with those tags.\nExample selectors: */\n\n@import url(http://fonts.googleapis.com/css?family=Lora|Lato);\n\nbody, html {\n\t/* This affects the entire page */\n\tmargin: 0;\n\twidth: 100%;\n}\n\na {\tcolor: #CC6666; }\na:hover { color: #FF6633; }\na:hover, a:visited, a:link, a:active\n{ text-decoration: none; }\n\ntd { vertical-align: top; }\ntd.align-right { text-align: right; }\ntd.align-center { text-align: center; }\n\np.ind { \n\ttext-indent: 2em;\n}\n\n\n.story-title {\n\tfont-size: 250%;\n\tfont-family: 'Lato', sans;\n}\n\n.fullwidth {\n\n\twidth:100%;\n\tmargin: 0 auto;\n\tposition: relative;\n\n}\n\n\ninput, textarea {\n\tcolor: #fff;\n\tbackground-color:#F7F2E4;\n\tborder: 1px solid #fff;\n}\ninput[type=text] {\n\tcolor:#333;\n\tfont-family: 'Lora', serif;\n\tfont-size:16px;\n\tfont-weight:bold;\n\tpadding: 3px 10px;\n\ttext-decoration:none;\n\ttext-shadow:0px 1px 0px #fffff;\n\twidth: 8em;\n\tmin-width: 4em;\n}\ninput:focus, textarea:focus {\n\tborder: 1px solid #FF6633;\n}\ninput:hover, textarea:hover {\n\tborder: 1px solid #CC6666;\n}\n\n#ui-bar {\n\tdisplay: none;\n\n}\n\n\n\t#ui-bar header, #story-caption, #ui-bar footer {\n\t\ttext-align: left;\n\t\twidth: 66%;\n\t}\n\t#menu {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tmargin: 2.5% 3.5% 0 0;\n\t}\n\t#menu ul {\n\t\tmargin: 0;\n\t}\n\t#menu li {\n\t\tmargin-bottom: 0.5em;\n\t}\n\t#menu-story {\n\t\tmargin-bottom: 0.7em;\n\t\tline-height: 0.85;\n\t}\n\n\n\n#passages {\n\tpadding-top:50px;\n\tpadding-bottom:75px;\n\tborder: 0;\n\twidth: 100%;\n\tmargin: 0;\n\tfont-family: 'Lora', serif;\n}\n\n.passage {\n\t/* This only affects passages */\n\t/* font */\n\tfont-size: large;\n\tmargin: 0 auto;\n\twidth: 550px;\n}\n\n\n\n/* for tablet */\n@media only screen and (min-width: 768px) and (max-width: 959px) {\n\n\t.passage {\n\t\twidth: 450px;\n\t}\n\t\n}\n\n/* for mobile */\n@media screen and (max-width: 766px) {\n\t.passage {\n\t\twidth: 300px;\n\t}\n\n}\n\n\n#passages.day {\tcolor: #333; }\n#passages.day a {\n\t/* This affects passage links */\n\tcolor: #CC6666;\t\n}\n#passages.day a:hover {\n\t/* This affects links while the cursor is over them */\n\tcolor: #FF6633;\n}\n#passages.day a:hover, a:visited, a:link, a:active\n{\n text-decoration: none;\n}\n\n#passages.night { color: #AAA; }\n#passages.night a {\n\t/* This affects passage links */\n\tcolor: #66CCFF;\n}\n#passages.night a:hover {\n\t/* This affects links while the cursor is over them */\n\tcolor: #D1F0FF;\n}\n#passages.night a:hover, a:visited, a:link, a:active\n{\n text-decoration: none;\n}\n\n\n#passages.evening { color: #DDD; }\n#passages.evening a {\n\t/* This affects passage links */\n\tcolor: #66CCFF;\n}\n#passages.evening a:hover {\n\t/* This affects links while the cursor is over them */\n\tcolor: #D1F0FF;\n}\n#passages.evening a:hover, a:visited, a:link, a:active\n{\n text-decoration: none;\n}\n\n\n\n\n\n\n.transition-in {\n\topacity: 0;\n\tposition: absolute;\n}\n.transition-out {\n\topacity: 0 !important;\n\tposition: absolute;\n}\n\n.revision-span-in {\n\topacity: 0;\n}\n.revision-span:not(.revision-span-out) {\n\ttransition: 2s; \n\t-webkit-transition: 2s;\n}\n.revision-span-out {\n\tposition:absolute;\n\topacity: 0;\n}\n\n\n\n.disabled { display:none; }\n\n\n.audioButton button {\n\t-moz-box-shadow:inset 0px 1px 0px 0px #ffffff;\n\t-webkit-box-shadow:inset 0px 1px 0px 0px #ffffff;\n\tbox-shadow:inset 0px 1px 0px 0px #ffffff;\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #FF6633), color-stop(1, #CCC));\n\tbackground:-moz-linear-gradient(top, #666 5%, #CCC 100%);\n\tbackground:-webkit-linear-gradient(top, #666 5%, #CCC 100%);\n\tbackground:-o-linear-gradient(top, #666 5%, #CCC 100%);\n\tbackground:-ms-linear-gradient(top, #666 5%, #CCC 100%);\n\tbackground:linear-gradient(to bottom, #666 5%, #CCC 100%);\n\tfilter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#666', endColorstr='#CCC',GradientType=0);\n\tbackground-color:#CCC;\n\t-moz-border-radius:4px;\n\t-webkit-border-radius:4px;\n\tborder-radius:4px;\n\tborder:1px solid #dcdcdc;\n\tdisplay:inline-block;\n\tcursor:pointer;\n\tcolor:#FFF;\n\tfont-family:Verdana;\n\tfont-size:10px;\n\tpadding:4px 3px;\n}\n.audioButton button:hover {\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #CC6666), color-stop(1, #666));\n\tbackground:-moz-linear-gradient(top, #CCC 5%, #666 100%);\n\tbackground:-webkit-linear-gradient(top, #CCC 5%, #666 100%);\n\tbackground:-o-linear-gradient(top, #CCC 5%, #666 100%);\n\tbackground:-ms-linear-gradient(top, #CCC 5%, #666 100%);\n\tbackground:linear-gradient(to bottom, #CCC 5%, #666 100%);\n\tfilter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#CCC', endColorstr='#666',GradientType=0);\n\tbackground-color:#CCC;\n}\n.audioButton button:active {\n\tposition:relative;\n\ttop:1px;\n}\n\n\n.timedcontinue.replacement-in {\n\topacity: 0;\n}\n.timedcontinue {\n\ttransition: 2s;\n\t-webkit-transition: 2s;\n}\n.timedcontinue.replacement-out {\n\topacity: 0;\n}\n
/*! <<cyclinglink>> macro for SugarCube */\n(function(){var requiredSugarCubeBuild=2680;if(!version||!version.build||version.build<requiredSugarCubeBuild)throw new Error("<<cyclinglink>> macro requires SugarCube build "+requiredSugarCubeBuild+" or greater, aborting load");version.extensions["cyclinglinkMacro"]={major:3,minor:3,revision:2};macros["cyclinglink"]={handler:function(a,b,c){function toggleText(w){w.classList.remove("cyclingLinkInit");w.classList.toggle(rl+"Enabled");w.classList.toggle(rl+"Disabled");w.style.display=w.style.display===\n"none"?"inline":"none"}var rl="cyclingLink";switch(c[c.length-1]){case "end":var end=true;c.pop();break;case "out":var out=true;c.pop();break}var v="";if(c.length&&c[0][0]==="$"){v=c[0].slice(1);c.shift()}var h=state.active.variables;if(out&&h[v]==="")return;var l=insertElement(a,"a");l.className="link-internal cyclingLink";l.setAttribute("data-cycle",0);for(var i=0;i<c.length;i++){var on=i===Math.max(c.indexOf(h[v]),0);var d=insertElement(null,"span",null,"cyclingLinkInit cyclingLink"+(on?"En":"Dis")+\n"abled");if(on){h[v]=c[i];l.setAttribute("data-cycle",i)}else d.style.display="none";insertText(d,c[i]);if(on&&end&&i===c.length-1)l.parentNode.replaceChild(d,l);else l.appendChild(d)}l.onclick=function(){var t=this.childNodes;var u=this.getAttribute("data-cycle")-0;var m=t.length;toggleText(t[u]);u=u+1;if(!(out&&u===m)){u%=m;if(v)h[v]=c[u]}else h[v]="";if((end||out)&&u===m-(end?1:0)){if(end){var n=this.removeChild(t[u]);n.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,\nthis)}else{this.parentNode.removeChild(this);return}return}toggleText(t[u]);this.setAttribute("data-cycle",u)}}}})();
<<display "Common Elements">>\s\n<img src="images/P19.gif" style="width:100%;"/>\n<p class="ind">Weigall’s superstitious terror left him. A man was there, struggling to free himself from the suction beneath the Strid, swept down, doubtless, but a moment before his arrival, perhaps as he stood with his back to the current.</p>\s\n<p class="ind">He stepped as close to the edge as he dared. The hand doubled as if in imprecation, shaking savagely in the face of that force which leaves its creatures to immutable law; then spread wide again, clutching, expanding, crying for help [[as audibly as the human voice|P20]].</p>
<<display "Common Elements">>\s\n<img src="images/P11.png" style="width:100%;"/>\n<<if $sound eq "yes">>\s\n<<fadeoutsound $night_walk>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($night_walk),1)>>\s\n<<fadeinsound $river_water 0.20 5000>>\s\n<<set $currentLoops.push($river_water)>>\s\n<<endif>>\s\n<center>[[. . .|P15]]</center>
<<display "Common Elements">>\s\n<<display "Style Changer">><<evening>>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $hunting_ground>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($hunting_ground),1)>>\s\n<<fadeinsound $river_and_ambience 0.20 5000>>\s\n<<set $currentLoops.push($river_and_ambience)>>\s\n<<endif>>\s\n<img src="images/P16.png" style="width:100%;"/>\n<p class="ind">But it was no one of these things that sat on Weigall’s mind as, when the other men went up to bed, he let himself out of the castle and sauntered down to the river. His intimate friend, the companion of his boyhood, the chum of his college days, his fellow-traveller in many lands, the man for whom he possessed stronger affection than for all men, had mysteriously disappeared two days ago, and his track might have sprung to the upper air for all trace he had left [[behind him|P04]].</p>\s
<<display "Common Elements">>\s\n<img src="images/P02.png" style="width:100%;"/>\n<p class="ind">It had been a bad day. A heavy rain had made the moor so spongy that it fairly sprang beneath the feet. Whether or not the grouse had haunts of their own, wherein they were immune from rheumatism, the bag had been small. The women, too, were an unusually dull lot, with the exception of a new-minded débutante who bothered Weigall at dinner by demanding the verbal restoration of the vague paintings on the vaulted roof [[above them|P03]].</p>\s
<<display "Style Changer">><<day>>\s\n<<display "Common Elements">>\s\n<<if $sound eq "yes">>\s\n<<fadeinsound $hunting_ground 0.30 3000>>\s\n<<set $currentLoops.push($hunting_ground)>>\s\n<<endif>>\s\n<img src="images/P01.png" style="width:100%;"/>\n<p class="ind">Weigall, continental and detached, tired early of grouse-shooting. To stand propped against a sod fence while his host’s workmen routed up the birds with long poles and drove them towards the waiting guns made him feel himself a parody on the ancestors who had roamed the moors and forests of this West Riding of Yorkshire in hot pursuit of game worth the killing. But when in England in August he always accepted whatever proffered for the season, and invited his host to shoot pheasants on his estates in the South. The amusements of life, he argued, should be accepted with the same philosophy as [[its ills|P02]]. </p>\s
<<display "Common Elements">>\s\n<img src="images/P17.png" style="width:100%;"/>\n<p class="ind">It was very dark in the depths where Weigall trod. He smiled as he recalled a remark of Gifford’s: “An English wood is like a good many other things in life—very promising at a distance, but a hollow mockery when you get within. You see daylight on both sides, and the sun freckles the very bracken. Our woods need the night to make them seem what they ought to be—what they once were, before our ancestors’ descendants demanded so much more money, in these so much more various days.”</p>\s\n<p class="ind">Weigall strolled along, smoking, and thinking of his friend, his pranks—many of which had done more credit to his imagination than this—and recalling conversations that had lasted the night through. Just before the end of the London season they had walked the streets one hot night after a party, discussing the various theories of [[the soul’s destiny|P08]].</p>
<<display "Common Elements">>\s\n<<display "Style Changer">><<night>>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $love_theme>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($love_theme),1)>>\s\n<<fadeinsound $river_and_ambience 0.20 5000>>\s\n<<set $currentLoops.push($river_and_ambience)>>\s\n<<endif>>\s\n<img src="images/P16.png" style="width:100%;"/>\n<p class="ind">However, Weigall’s affection for his friend was too deep to companion with tranquillity in the present state of doubt, and, instead of going to bed early with the other men, he determined to walk until ready for sleep. He went down to the river and followed the path through the woods. There was no moon, but the stars sprinkled their cold light upon the pretty belt of water flowing placidly past wood and ruin, between green masses of overhanging rocks or sloping banks tangled with tree and shrub, leaping occasionally over stones with the harsh notes of an angry scold, to recover its equanimity the moment the way was [[clear again|P07]].</p>\s
<<display "Common Elements">>\s\n<img src="images/P04.png" style="width:100%;"/>\n<p class="ind">Weigall did not believe for a moment that Wyatt Gifford was dead, and although it was impossible not to be affected by the general uneasiness, he was disposed to be more angry than frightened. At Cambridge Gifford had been an incorrigible practical joker, and by no means had outgrown the habit; it would be like him to cut across the country in his evening clothes, board a cattle-train, and amuse himself touching up [[the picture of the sensation|P06]] in West Riding.</p>
<<display "Common Elements">>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $river_and_ambience>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($river_and_ambience),1)>>\s\n<<fadeinsound $love_theme 0.20 5000>>\s\n<<set $currentLoops.push($love_theme)>>\s\n<<endif>>\s\n<img src="images/P03.png" style="width:100%;"/>\n<p class="ind">He had been a guest on the adjoining estate during the past week, shooting with the fervor of the true sportsman, making love in the intervals to Adeline Cavan, and apparently in the best of spirits. As far as was known there was nothing to lower his mental mercury, for his rent-roll was a large one, Miss Cavan blushed whenever he looked at her, and, being one of the best shots in England, he was never happier than in August. The suicide theory was preposterous, all agreed, and there was as little reason to believe him murdered. Nevertheless, he had walked out of March Abbey two nights ago without hat or overcoat, and had not been seen since.</p>\s\n<p class="ind">The country was being patrolled night and day. A hundred keepers and workmen were beating the woods and poking the bogs on the moors, but as yet [[not so much as a handkerchief had been found|P05]].</p>\s
by Gertrude Atherton\n\nCover by Elena Distefano\nInteriors by Tory Hoke\nInteractivity by sub-Q
<<display "Common Elements">>\s\n<img src="images/P06.png" style="width:100%;"/>\n<p class="ind">Weigall and Gifford had had no time to comment there, and the afternoon and evening were full; but, coming forth from the house of festivity together, they had reverted almost at once to [[the topic|P10]].</p>
<<display "Common Elements">>\s\n<<display "Style Changer">><<day>>\s\n<<if $sound eq "yes">>\s\n<<fadeoutsound $river_and_ambience>>\s\n<<set $currentLoops.splice($currentLoops.indexOf($river_and_ambience),1)>>\s\n<<fadeinsound $funeral 0.20 5000>>\s\n<<set $currentLoops.push($funeral)>>\s\n<<endif>>\s\n<img src="images/P05.png" style="width:100%;"/>\n<p class="ind">That afternoon they had met at the coffin of a college friend whose mind had been a blank for the past three years. Some months previously they had called at the asylum to see him. His expression had been senile, his face imprinted with the record of debauchery. In death the face was placid, intelligent, without ignoble lineation—the face of [[the man they had known|P09]] at college.</p>