• Rewind
  • Restart
  • Bookmark
  • This story was created with Twine and is powered by TiddlyWiki
You <<replace "drop the gun.">>drop the gun.\n\nYou <<replace "dry-retch.">>dry-retch.\n\nYou [[turn and leave.|Turn and leave.]]<<endreplace>><<endreplace>>
Oh, boy. Here's the fucking G-Man.\n\n"Hello, Doctor Freeman," he says.\n\n<<replace "And you say:">>And you say:\n\n[["My god, asshole, leave me the hell alone!"|gman 3]]<<endreplace>>
<<set $didkilled = true>><<killbreen>>\n\nThe soldiers all around the room jump and recoil, but they do nothing.\n\nYou just watch the mass of the Breen-grub sag in on itself. Gallons of viscous yellow-white fluid [[pour out onto the floor.]]
"What levels?" Alyx asks, a little too brightly.\n\nThe Breen-grub extends one of those little robot arms the Combine overlords use instead of hands and gestures vaguely at the equipment strapped to its swollen waste of a body. "My various levels," it sighs.\n\n"Look," Alyx demands. [["Are you going to let us go?"|breen6]]
"I'm not sure there's... anything you can do about that," he says. "Unlesssss... you do it all again."\n\nThen the white shifts and changes-- and you're back in the snow, flat on your ass, soaked to the bone.\n\n[[Alyx is already marching toward the horizon.|the end]]
<<begin>>
He pivots his head with unnatural effort and regards a different point in empty air. "<<getspares>>
try {\n\tversion.extensions['randomizehiss'] = {\n\t\tmajor:1, minor:0, revision:0\n};\n\tmacros['randomizehiss'] = {\n\thandler: function(place, macroName, params, parser) {\n\n\tvar randint;\n\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n\n randint = getRandomIntInclusive (1, 3);\n\n\tnew Wikifier(place, "<<playsound $hiss" + randint + ">>");\n\n}\n\t};\n} catch(e) {\n\tthrowError(place,"serveevent Setup Error: "+e.message);\n}\n
No luck in the cabinets here: you'll have to leave without weapons. She puts up her hood and steps out into the cold. "Come on," she says.\n\n<<replace "You follow.">>You step onto the stairs and suddenly <<replace "the ground shakes--">>the ground shakes--\n\n<<replace "--something building under the lake-">>--massive blast of displaced time racing at you under the snow--<<becomes>>--Alyx is diving to the ground but you just stand there and [[take it in the face--|gman 1]]<<endreplace>><<endreplace>><<endreplace>>
"I'm glad you're... sssssatisfied," he manages to say.\n\nThen the white shifts and changes-- and you're back in the snow, flat on your ass, soaked to the bone.\n\n[[Alyx is already marching toward the horizon.|the end]]
try {\n\tversion.extensions['sparebreen'] = {\n\t\tmajor:1, minor:0, revision:0\n};\n\tmacros['sparebreen'] = {\n\thandler: function(place, macroName, params, parser) {\n\n function reportBreenSpared(data) {\n var xhr = new XMLHttpRequest();\n xhr.addEventListener("readystatechange", function () {\n if (this.readyState === 4) {\n console.log(this.responseText);\n }\n });\n xhr.open("POST", "http://54.203.93.132/v1/grubs/incrSpared");\n xhr.send(null);\n}\n\n reportBreenSpared();\n\n\tnew Wikifier(place, "You drop the gun on the ground.");\n}\n\t};\n} catch(e) {\n\tthrowError(place,"serveevent Setup Error: "+e.message);\n}\n
"Is that what you wanted to know?" Alyx demands.\n\n"No," grunts the grub.\n\n"Look," she says. [["Are you going to let us go?"|breen6]]
<<replace "WHUMP.">>In the trough of the wave again.\n\nThe Breen-grub is shouting, screaming: //"KILL ME, YOU PATHETIC MURDERER!"//\n\nThere's a gun in your hand, you can [[shoot him|killhimagain]] or [[not--|sparehimagain]]<<endreplace>>
version.extensions.cyclinglinkMacro={major:3,minor:3,revision:0};\nmacros.cyclinglink={handler:function(a,b,c){var rl="cyclingLink";\nfunction toggleText(w){w.classList.remove("cyclingLinkInit");\nw.classList.toggle(rl+"Enabled");w.classList.toggle(rl+"Disabled");\nw.style.display=((w.style.display=="none")?"inline":"none")}switch(c[c.length-1]){case"end":var end=true;\nc.pop();break;case"out":var out=true;c.pop();break}var v="";if(c.length&&c[0][0]=="$"){v=c[0].slice(1);\nc.shift()}var h=state.history[0].variables;if(out&&h[v]===""){return\n}var l=Wikifier.createInternalLink(a,null);l.className="internalLink cyclingLink";\nl.setAttribute("data-cycle",0);for(var i=0;i<c.length;i++){var on=(i==Math.max(c.indexOf(h[v]),0));\nvar d=insertElement(null,"span",null,"cyclingLinkInit cyclingLink"+((on)?"En":"Dis")+"abled");\nif(on){h[v]=c[i];l.setAttribute("data-cycle",i)}else{d.style.display="none"\n}insertText(d,c[i]);if(on&&end&&i==c.length-1){l.parentNode.replaceChild(d,l)\n}else{l.appendChild(d)}}l.onclick=function(){var t=this.childNodes;\nvar u=this.getAttribute("data-cycle")-0;var m=t.length;toggleText(t[u]);\nu=(u+1);if(!(out&&u==m)){u%=m;if(v){h[v]=c[u]}}else{h[v]=""}if((end||out)&&u==m-(end?1:0)){if(end){var n=this.removeChild(t[u]);\nn.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,this)\n}else{this.parentNode.removeChild(this);return}return}toggleText(t[u]);\nthis.setAttribute("data-cycle",u)}}};
"I understand you have... strong feelings, about this... but not everything makes sense in the same way it did. Not anymore," the G-Man says.\n\nHe appears to look off into the distance. "<<getkills>>
"I don't really see how I can keep you here," it snorts.\n\nAlyx waves her hand vaguely at the room, at all the weird medical tech, at the armed soldiers who took your guns. "You //can't?"//\n\nThe grub shifts its gelatinous mass in a manner that might be interperable as a shrug. //"They// don't let me do much," he sighs. "They do not permit me much freedom of movement. //Or thought."//\n\n[[Huh.|breen7]]
Like a creature in thrall, you find yourself crossing the room. Heavy steps.\n\nYou stand quite close to the grub. The smell is //so foul--// fucking hell. You swallow bile.\n\nThen the Breen-grub <<replace "opens its human mouth">>OPENS ITS HUMAN MOUTH AND EJECTS <<replace "A FORCEFUL STREAM">>A FORCEFUL STREAM OF PUTRID WATERY SLUDGE [[DIRECTLY INTO YOUR FACE|secret2]] FROM ABOUT TWO FEET AWAY--<<endreplace>><<endreplace>>
<<killbreen>>\n\nSPPBBT! The grub's face spurts ichor.\n\nCRASH! The wave hits the building.\n\nThe fucking G-Man is here. He fixes his eyes on you. "Let's get the score," he says. "<<getkills>>
<<if $sound is true>>Sound is on.<<else>>Sound is off.<<endif>>\n[[Sound Settings|soundsettings]]
He fixes you with an <<replace "uncomfortable stare.">>uncomfortable stare.\n\n<<if $killed > $spared>>"I think it means he's <<if $didkilled is true>>still <<endif>>dead.<<else>>"I think it means... he's <<if $didkilled is false>>still <<endif>>alive.<<endif>> Are you [[pleased]] by this... [[or not?"|or not?]]<<endreplace>>
She puts up her hood and steps out into the cold. "Come on," she says.\n\n<<replace "You follow.">>You step onto the stairs and suddenly <<replace "the ground shakes--">>the ground shakes--\n\n<<replace "--something building under the lake--">>--massive blast of displaced time racing at you under the snow--<<becomes>>--Alyx is diving to the ground but you just stand there and [[take it in the face--|gman 1]]<<endreplace>><<endreplace>><<endreplace>>
CREDITS\n[[Laura Michet|http://lauramichet.com/]] - design, writing, and code\nBennett Sala - data wrangler/server code\n\n[[back|begin]]
body {\nbackground: #472443; /* For browsers that do not support gradients */\nbackground: -webkit-linear-gradient(#472443, #243147); /* For Safari 5.1 to 6.0 */\nbackground: -o-linear-gradient(#472443, #243147); /* For Opera 11.1 to 12.0 */\nbackground: -moz-linear-gradient(#472443, #243147); /* For Firefox 3.6 to 15 */\nbackground: linear-gradient(#472443, #243147) !important; /* Standard syntax */\ncolor: #FFFFFF;\nfont-family: 'Lato', sans-serif;\nheight: 100%;\nmargin: 0;\nbackground-repeat: no-repeat !important;\nbackground-attachment: fixed !important;\n}\nhtml {\n height: 100%;\n}\n#passages {\n padding: 3%;\n border: 0;\n text-align:center;\n margin-left:0;\n text-color:#a9b9dc\n}\n.passage {\n display: inline-block;\n width: 60%;\n min-height:40%;\n padding: 0em;\n font-size: 2em\n}\n#sidebar {\n display:none;\n}\na.internalLink, a.externalLink {\n color:#d31f1f;\n}\na.internalLink:hover, a.externalLink:hover {\n color:#e03333;\n text-decoration:none;\n}\n\n.customdisplay{text-align:center;}\n\nbody[data-tags~=machinery] {background: black;}\n\nimg {\n height: auto;\n width: auto\s9; /* ie8 */\n\tdisplay: block;\n\tmargin-left: auto;\n margin-right: auto;\n}\n\n.revision-span-in {\n\topacity: 0;\n}\n.revision-span:not(.revision-span-out) {\n\ttransition: 1s; -webkit-transition: 1s;\n}\n.revision-span-out {\n\tposition:absolute;\n\topacity: 0;\n}
<<set $deathtruth = false>>"We didn't really see," you say. You can't look at it while you speak. Your intestines feel like they're jump-roping around in your lower abdomen. "We got... we got teleported away--"\n\n"By <<revise guyin "the suit?">><<revision guyin>><<becomes>>the suit?<<endrevision>> The guy in the suit??" the grub blurts.<<revision guyin>><<becomes>>\n\n<<replace "Alyx stiffens.">>Alyx stiffens.\n\n"He //comes around here,"// the grub hisses. "Doctor Freeman... you and your friends. Agents of chaos. He comes around here sometimes and my //levels// get so [[hard to control."|deathlie2]]<<endreplace>><<endrevision>>
He nods jerkily. "This is a problem... you all occupy the same self, here in the trough of the wave. Do you know what that means?"\n\n[["No,"|gman 4]] you say.
BREENFATE.EXE
try {\n\tversion.extensions['killbreen'] = {\n\t\tmajor:1, minor:0, revision:0\n};\n\tmacros['killbreen'] = {\n\thandler: function(place, macroName, params, parser) {\n\n function reportBreenKilled(data) {\n var xhr = new XMLHttpRequest();\n xhr.addEventListener("readystatechange", function () {\n if (this.readyState === 4) {\n console.log(this.responseText);\n }\n });\n xhr.open("POST", "http://54.203.93.132/v1/grubs/incrKilled");\n xhr.send(null);\n }\n\n reportBreenKilled();\n\n\tnew Wikifier(place, "//BLAM.// One shot.");\n}\n\t};\n} catch(e) {\n\tthrowError(place,"serveevent Setup Error: "+e.message);\n}\n
(function () {\n "use strict";\n version.extensions['soundMacros'] = {\n major: 1,\n minor: 1,\n revision: 2\n };\n var p = macros['playsound'] = {\n soundtracks: {},\n handler: function (a, b, c, d) {\n var loop = function (m) {\n if (m.loop == undefined) {\n m.loopfn = function () {\n this.play();\n };\n m.addEventListener('ended', m.loopfn, 0);\n } else m.loop = true;\n m.play();\n };\n var s = eval(d.fullArgs());\n if (s) {\n s = s.toString();\n var m = this.soundtracks[s.slice(0, s.lastIndexOf("."))];\n if (m) {\n if (b == "playsound") {\n m.play();\n } else if (b == "loopsound") {\n loop(m);\n } else if (b == "pausesound") {\n m.pause();\n } else if (b == "unloopsound") {\n if (m.loop != undefined) {\n m.loop = false;\n } else if (m.loopfn) {\n m.removeEventListener('ended', m.loopfn);\n delete m.loopfn;\n }\n } else if (b == "stopsound") {\n m.pause();\n m.currentTime = 0;\n } else if (b == "fadeoutsound" || b == "fadeinsound") {\n if (m.interval) clearInterval(m.interval);\n if (b == "fadeinsound") {\n if (m.currentTime>0) return;\n m.volume = 0;\n loop(m);\n } else {\n if (!m.currentTime) return;\n m.play();\n }\n var v = m.volume;\n m.interval = setInterval(function () {\n v = Math.min(1, Math.max(0, v + 0.005 * (b == "fadeinsound" ? 1 : -1)));\n m.volume = Math.easeInOut(v);\n if (v == 0 || v == 1) clearInterval(m.interval);\n if (v == 0) {\n m.pause();\n m.currentTime = 0;\n m.volume = 1;\n }\n }, 10);\n }\n }\n }\n }\n }\n macros['fadeinsound'] = p;\n macros['fadeoutsound'] = p;\n macros['unloopsound'] = p;\n macros['loopsound'] = p;\n macros['pausesound'] = p;\n macros['stopsound'] = p;\n macros['stopallsound'] = {\n handler: function () {\n var s = macros.playsound.soundtracks;\n for (var j in s) {\n\t\tif (s.hasOwnProperty(j)) {\n s[j].pause();\n if (s[j].currentTime) {\n\t\t s[j].currentTime = 0;\n\t\t }\n\t\t}\n }\n }\n }\n var div = document.getElementById("storeArea").firstChild;\n var fe = ["ogg", "mp3", "wav", "webm"];\n while (div) {\n var b = String.fromCharCode(92);\n var q = '"';\n var re = "['" + q + "]([^" + q + "']*?)" + b + ".(ogg|mp3|wav|webm)['" + q + "]";\n k(new RegExp(re, "gi"));\n div = div.nextSibling;\n }\n\n function k(c, e) {\n do {\n var d = c.exec(div.innerHTML);\n if (d) {\n var a = new Audio();\n if (a.canPlayType) {\n for (var i = -1; i < fe.length; i += 1) {\n if (i >= 0) d[2] = fe[i];\n if (a.canPlayType("audio/" + d[2])) break;\n }\n if (i < fe.length) {\n a.setAttribute("src", d[1] + "." + d[2]);\n a.interval = null;\n macros.playsound.soundtracks[d[1]] = a;\n } else console.log("Browser can't play '" + d[1] + "'");\n }\n }\n } while (d);\n }\n}());
[[All white.|gman 2]]
<<sparebreen>>\n\nCLANG! The gun hits the floor.\n\nCRASH! The wave hits the building.\n\nThe fucking G-Man is here. He fixes his eyes on you. "Let's get the score," he says. "<<getkills>>
<<set $killed = 0>><<set $spared = 0>><<stopallsound>>@@font-size: 2em;THE GRUB@@\n\n[[begin|intro1]]<<if $completed is true>>\n\n[[make things right|again1]]<<endif>>\n\n[[credits|Credits]]
<<set $deathtruth = true>>"Breen got fried," you say, flatly as you can. And then you launch into an explanation of what you did, how you overloaded the reactor... how the original Breen was engulfed by the initial detonation blast and how the ashy husk of his corpse was ejected off the top of the Citadel at (probably) several thousand miles per hour...\n\nThe Breen-grub just stares at you with eyes like saucers and a vacantly open mouth. Its eyebrows twitch up and down on its brow at seemingly-random, like a pair of confused caterpillars.\n\n"So <<revise thatshow "that's how">><<revision thatshow>><<becomes>>that's how<<endrevision>> it happened," you finish.<<revision thatshow>><<becomes>>\n\n[[The Breen-grub is silent.|deathtruth2]]<<endrevision>>
(function(){version.extensions.replaceMacrosCombined={major:1,minor:1,revision:7};var nullobj={handler:function(){}};function showVer(n,notrans){if(!n){return;}n.innerHTML="";\nnew Wikifier(n,n.tweecode);n.setAttribute("data-enabled","true");n.style.display="inline";n.classList.remove("revision-span-out");if(!notrans){n.classList.add("revision-span-in");\nif(n.timeout){clearTimeout(n.timeout);}n.timeout=setTimeout(function(){n.classList.remove("revision-span-in");n=null;},20);}}function hideVer(n,notrans){if(!n){return;\n}n.setAttribute("data-enabled","false");n.classList.remove("revision-span-in");if(n.timeout){clearTimeout(n.timeout);}if(!notrans){n.classList.add("revision-span-out");\nn.timeout=setTimeout(function(){if(n.getAttribute("data-enabled")=="false"){n.classList.remove("revision-span-out");n.style.display="none";n.innerHTML="";}n=null;\n},1000);}else{n.style.display="none";n.innerHTML="";n=null;}}function tagcontents(b,starttags,desttags,endtags,k){var l=0,c="",tg,a,i;function tagfound(i,e,endtag){for(var j=0;\nj<e.length;j++){if(a.indexOf("<<"+e[j]+(endtag?">>":""),i)==i){return e[j];}}}a=b.source.slice(k);for(i=0;i<a.length;i++){if(tg=tagfound(i,starttags)){l++;}else{if((tg=tagfound(i,desttags,true))&&l==0){b.nextMatch=k+i+tg.length+4;\nreturn[c,tg];}else{if(tg=tagfound(i,endtags,true)){l--;if(l<0){return null;}}}}c+=a.charAt(i);}return null;}var begintags=[];var endtags=[];function revisionSpanHandler(g,e,f,b){var k=b.source.indexOf(">>",b.matchStart)+2,vsns=[],vtype=e,flen=f.length,becomes,c,cn,m,h,vsn;\nfunction mkspan(vtype){h=insertElement(m,"span",null,"revision-span "+vtype);h.setAttribute("data-enabled",false);h.style.display="none";h.tweecode="";return h;}if(this.shorthand&&flen){while(f.length>0){vsns.push([f.shift(),(this.flavour=="insert"?"gains":"becomes")]);\n}}else{if(this.flavour=="insert"||(this.flavour=="continue"&&this.trigger=="time")){vsns.push(["","becomes"]);}}if(this.flavour=="continue"&&flen){b.nextMatch=k+b.source.slice(k).length;\nvsns.push([b.source.slice(k),vtype]);}else{becomes=["becomes","gains"];c=tagcontents(b,begintags,becomes.concat(endtags),endtags,k);if(c&&endtags.indexOf(c[1])==-1){while(c){vsns.push(c);\nc=tagcontents(b,begintags,becomes,endtags,b.nextMatch);}c=tagcontents(b,begintags,["end"+e],endtags,b.nextMatch);}if(!c){throwError(g,"can't find matching end"+e);\nreturn;}vsns.push(c);if(this.flavour=="continue"){k=b.nextMatch;b.nextMatch=k+b.source.slice(k).length;vsns.push([b.source.slice(k),""]);}}if(this.flavour=="remove"){vsns.push(["","becomes"]);\n}cn=0;m=insertElement(g,"span",null,e);m.setAttribute("data-flavour",this.flavour);h=mkspan("initial");vsn=vsns.shift();h.tweecode=vsn[0];showVer(h,true);while(vsns.length>0){if(vsn){vtype=vsn[1];\n}vsn=vsns.shift();h=mkspan(vtype);h.tweecode=vsn[0];}if(typeof this.setup=="function"){this.setup(m,g,f);}}function quantity(m){return(m.children.length-1)+(m.getAttribute("data-flavour")=="remove");\n}function revisionSetup(m,g,f){m.className+=" "+f[0].replace(" ","_");}function keySetup(m,g,f){var key=f[0];m.setEventListener("keydown",function l(e){var done=!revise("revise",m);\nif(done){m.removeEventListener("keydown",l);}});}function timeSetup(m,g,f){function cssTimeUnit(s){if(typeof s=="string"){if(s.slice(-2).toLowerCase()=="ms"){return Number(s.slice(0,-2))||0;\n}else{if(s.slice(-1).toLowerCase()=="s"){return Number(s.slice(0,-1))*1000||0;}}}throwError(g,s+" isn't a CSS time unit");return 0;}var tm=cssTimeUnit(f[0]);var s=state.history[0].passage.title;\nsetTimeout(function timefn(){if(state.history[0].passage.title==s){var done=!revise("revise",m);if(!done){setTimeout(timefn,tm);}}},tm);}function hoverSetup(m){var fn,noMouseEnter=(document.head.onmouseenter!==null),m1=m.children[0],m2=m.children[1],gains=m2.className.indexOf("gains")>-1;\nif(!m1||!m2){return;}m1.onmouseenter=function(e){var efp=document.elementFromPoint(e.clientX,e.clientY);while(efp&&efp!==this){efp=efp.parentNode;}if(!efp){return;\n}if(this.getAttribute("data-enabled")!="false"){revise("revise",this.parentNode);}};m2.onmouseleave=function(e){var efp=document.elementFromPoint(e.clientX,e.clientY);\nwhile(efp&&efp!==this){efp=efp.parentNode;}if(efp){return;}if(this.getAttribute("data-enabled")!="false"){revise("revert",this.parentNode);}};if(gains){m1.onmouseleave=m2.onmouseleave;\n}if(noMouseEnter){fn=function(n){return function(e){if(!event.relatedTarget||(event.relatedTarget!=this&&!(this.compareDocumentPosition(event.relatedTarget)&Node.DOCUMENT_POSITION_CONTAINED_BY))){this[n]();\n}};};m1.onmouseover=fn("onmouseenter");m2.onmouseout=fn("onmouseleave");if(gains){m1.onmouseout=m2.onmouseout;}}m=null;}function mouseSetup(m){var evt=(document.head.onmouseenter===null?"onmouseenter":"onmouseover");\nm[evt]=function(){var done=!revise("revise",this);if(done){this[evt]=null;}};m=null;}function linkSetup(m,g,f){var l=Wikifier.createInternalLink(),p=m.parentNode;\nl.className="internalLink replaceLink";p.insertBefore(l,m);l.insertBefore(m,null);l.onclick=function(){var p,done=false;if(m&&m.parentNode==this){done=!revise("revise",m);\nscrollWindowTo(m);}if(done){this.parentNode.insertBefore(m,this);this.parentNode.removeChild(this);}};l=null;}function visitedSetup(m,g,f){var i,done,shv=state.history[0].variables,os="once seen",d=(m.firstChild&&(this.flavour=="insert"?m.firstChild.nextSibling:m.firstChild).tweecode);\nshv[os]=shv[os]||{};if(d&&!shv[os].hasOwnProperty(d)){shv[os][d]=1;}else{for(i=shv[os][d];i>0&&!done;i--){done=!revise("revise",m,true);}if(shv[os].hasOwnProperty(d)){shv[os][d]+=1;\n}}}[{name:"insert",flavour:"insert",trigger:"link",setup:linkSetup},{name:"timedinsert",flavour:"insert",trigger:"time",setup:timeSetup},{name:"insertion",flavour:"insert",trigger:"revisemacro",setup:revisionSetup},{name:"later",flavour:"insert",trigger:"visited",setup:visitedSetup},{name:"keyinsert",flavour:"insert",trigger:"key",setup:keySetup},{name:"replace",flavour:"replace",trigger:"link",setup:linkSetup},{name:"timedreplace",flavour:"replace",trigger:"time",setup:timeSetup},{name:"mousereplace",flavour:"replace",trigger:"mouse",setup:mouseSetup},{name:"hoverreplace",flavour:"replace",trigger:"hover",setup:hoverSetup},{name:"revision",flavour:"replace",trigger:"revisemacro",setup:revisionSetup},{name:"keyreplace",flavour:"replace",trigger:"key",setup:keySetup},{name:"timedremove",flavour:"remove",trigger:"time",setup:timeSetup},{name:"mouseremove",flavour:"remove",trigger:"mouse",setup:mouseSetup},{name:"hoverremove",flavour:"remove",trigger:"hover",setup:hoverSetup},{name:"removal",flavour:"remove",trigger:"revisemacro",setup:revisionSetup},{name:"once",flavour:"remove",trigger:"visited",setup:visitedSetup},{name:"keyremove",flavour:"remove",trigger:"key",setup:keySetup},{name:"continue",flavour:"continue",trigger:"link",setup:linkSetup},{name:"timedcontinue",flavour:"continue",trigger:"time",setup:timeSetup},{name:"mousecontinue",flavour:"continue",trigger:"mouse",setup:mouseSetup},{name:"keycontinue",flavour:"continue",trigger:"key",setup:keySetup},{name:"cycle",flavour:"cycle",trigger:"revisemacro",setup:revisionSetup},{name:"mousecycle",flavour:"cycle",trigger:"mouse",setup:mouseSetup},{name:"timedcycle",flavour:"cycle",trigger:"time",setup:timeSetup},{name:"keycycle",flavour:"replace",trigger:"key",setup:keySetup}].forEach(function(e){e.handler=revisionSpanHandler;\ne.shorthand=(["link","mouse","hover"].indexOf(e.trigger)>-1);macros[e.name]=e;macros["end"+e.name]=nullobj;begintags.push(e.name);endtags.push("end"+e.name);});function insideDepartingSpan(elem){var r=elem.parentNode;\nwhile(!r.classList.contains("passage")){if(r.classList.contains("revision-span-out")){return true;}r=r.parentNode;}}function reviseAll(rt,rname){var rall=document.querySelectorAll(".passage [data-flavour]."+rname),ret=false;\nfor(var i=0;i<rall.length;i++){if(!insideDepartingSpan(rall[i])){ret=revise(rt,rall[i])||ret;}}return ret;}function revise(rt,r,notrans){var ind2,curr,next,ind=-1,rev=(rt=="revert"),rnd=(rt.indexOf("random")>-1),fl=r.getAttribute("data-flavour"),rc=r.childNodes,cyc=(fl=="cycle"),rcl=rc.length-1;\nfunction doToGainerSpans(n,fn){for(var k=n-1;k>=0;k--){if(rc[k+1].classList.contains("gains")){fn(rc[k],notrans);}else{break;}}}for(var k=0;k<=rcl;k++){if(rc[k].getAttribute("data-enabled")=="true"){ind=k;\n}}if(rev){ind-=1;}curr=(ind>=0?rc[ind]:(cyc?rc[rcl]:null));ind2=ind;if(rnd){ind2=(ind+(Math.floor(Math.random()*rcl)))%rcl;}next=((ind2<rcl)?rc[ind2+1]:(cyc?rc[0]:null));\nvar docurr=(rev?showVer:hideVer);var donext=(rev?hideVer:showVer);var currfn=function(){if(!(next&&next.classList.contains("gains"))||rnd){docurr(curr,notrans);doToGainerSpans(ind,docurr,notrans);\n}};var nextfn=function(){donext(next,notrans);if(rnd){doToGainerSpans(ind2+1,donext,notrans);}};if(!rev){currfn();nextfn();}else{nextfn();currfn();}return(cyc?true:(rev?(ind>0):(ind2<rcl-1)));\n}macros.revert=macros.revise=macros.randomise=macros.randomize={handler:function(a,b,c){var l,rev,rname;function disableLink(l){l.style.display="none";}function enableLink(l){l.style.display="inline";\n}function updateLink(l){if(l.className.indexOf("random")>-1){enableLink(l);return;}var rall=document.querySelectorAll(".passage [data-flavour]."+rname),cannext,canprev,i,ind,r,fl;\nfor(i=0;i<rall.length;i++){r=rall[i],fl=r.getAttribute("data-flavour");if(insideDepartingSpan(r)){continue;}if(fl=="cycle"){cannext=canprev=true;}else{if(r.firstChild.getAttribute("data-enabled")==!1+""){canprev=true;\n}if(r.lastChild.getAttribute("data-enabled")==!1+""){cannext=true;}}}var can=(l.classList.contains("revert")?canprev:cannext);(can?enableLink:disableLink)(l);}function toggleText(w){w.classList.toggle(rl+"Enabled");\nw.classList.toggle(rl+"Disabled");w.style.display=((w.style.display=="none")?"inline":"none");}var rl="reviseLink";if(c.length<2){throwError(a,b+" macro needs 2 parameters");\nreturn;}rname=c.shift().replace(" ","_");l=Wikifier.createInternalLink(a,null);l.className="internalLink "+rl+" "+rl+"_"+rname+" "+b;var v="";var end=false;var out=false;\nif(c.length>1&&c[0][0]=="$"){v=c[0].slice(1);c.shift();}switch(c[c.length-1]){case"end":end=true;c.pop();break;case"out":out=true;c.pop();break;}var h=state.history[0].variables;\nfor(var i=0;i<c.length;i++){var on=(i==Math.max(c.indexOf(h[v]),0));var d=insertElement(null,"span",null,rl+((on)?"En":"Dis")+"abled");if(on){h[v]=c[i];l.setAttribute("data-cycle",i);\n}else{d.style.display="none";}insertText(d,c[i]);l.appendChild(d);}l.onclick=function(){reviseAll(b,rname);var t=this.childNodes,u=this.getAttribute("data-cycle")-0,m=t.length,n,lall,i;\nif((end||out)&&u>=m-(end?2:1)){if(end){n=this.removeChild(t[u+1]||t[u]);n.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,this);}else{this.parentNode.removeChild(this);\nreturn;}}else{toggleText(t[u]);u=(u+1)%m;if(v){h[v]=c[u];}toggleText(t[u]);this.setAttribute("data-cycle",u);}lall=document.getElementsByClassName(rl+"_"+rname);\nfor(i=0;i<lall.length;i++){updateLink(lall[i]);}};disableLink(l);setTimeout((function(l){return function(){updateLink(l);};}(l)),1);l=null;}};macros.mouserevise=macros.hoverrevise={handler:function(a,b,c,d){var endtags=["end"+b],evt=(window.onmouseenter===null?"onmouseenter":"onmouseover"),t=tagcontents(d,[b],endtags,endtags,d.source.indexOf(">>",d.matchStart)+2);\nif(t){var rname=c[0].replace(" ","_"),h=insertElement(a,"span",null,"hoverrevise hoverrevise_"+rname),f=function(){var done=!reviseAll("revise",rname);if(b!="hoverrevise"&&done){this[evt]=null;\n}};new Wikifier(h,t[0]);if(b=="hoverrevise"){h.onmouseover=f;h.onmouseout=function(){reviseAll("revert",rname);};}else{h[evt]=f;}h=null;}}};macros.instantrevise={handler:function(a,b,c,d){reviseAll("revise",c[0].replace(" ","_"));\n}};macros.endmouserevise=nullobj;macros.endhoverrevise=nullobj;}());
<<set $completed = true>><<remember $completed>>THE END\n\nCREDITS\n[[Laura Michet|http://lauramichet.com/]] - design, writing, and code\nBennett Sala - data wrangler/server code\n\n[[back|begin]]
In the vestibule, Alyx is tearing apart a cabinet full of Combine gear, looking for guns. She barely spares you a glance.\n\n"He have anything else to tell you?" she asks.\n\n[["No,"]] you say.
Oh, god, it's him.\n\nIt's fucking <<revise breenwhat "Doctor Breen.">><<revision breenwhat>><<becomes>>Doctor Breen.<<endrevision>><<revision breenwhat>><<becomes>>\n\nHe's a lumpen flesh-mass with a human face pasted on the front, like something drawn in a bathroom stall in hell. The sausage of his body is eight feet high at his hairy-bristled top and has <<revise mechanical "mechanical whatsits">><<revision mechanical>><<becomes>><<revise mechanical2 "mechanical whatsits">><<revision mechanical2>><<becomes>><<revise mechanical3 "mechanical whatsits">><<revision mechanical3>><<becomes>>mechanical whatsits<<endrevision>><<endrevision>><<endrevision>> draped all over it--\n\n<<revision mechanical3>><<revision mechanical2>><<revision mechanical>><<becomes>>//--whirring machine like a far-future respirator but it's drawing power from a car battery--//<<endrevision>><<becomes>>//--oozing ports in his flank coupled to colonostomy bags filled with pale green slime--//<<endrevision>><<becomes>>[[--shining metal staples holding the top of his forehead to the sheer side of his swollen fucking grub body--|breen1]]<<endrevision>><<endrevision>>
try {\n\tversion.extensions['getkills'] = {\n\t\tmajor:1, minor:0, revision:0\n};\n\tmacros['getkills'] = {\n\thandler: function(place, macroName, params, parser) {\n\n var numberKilled;\n\n function getBreenCounter(callback) {\n var xhr = new XMLHttpRequest();\n xhr.addEventListener("readystatechange", function () {\n if (this.readyState === 4) {\n var parsed = JSON.parse(this.responseText);\n callback(parsed);\n //console.log(this.responseText);\n }\n });\n xhr.open("GET", "http://54.203.93.132/v1/grubs");\n xhr.send(null);\n }\n\n getBreenCounter(function(counters){\n new Wikifier(place, "All of you together have killed him " + counters.killed + " times.\s" [[Huh.|gmanend]]");\n new Wikifier(place, "<<set $killed = " + counters.killed + ">>");\n });\n\n}\n\t};\n} catch(e) {\n\tthrowError(place,"serveevent Setup Error: "+e.message);\n}\n
"That's bullshit," you say. "You're just-- you're just really depressed or something."\n\n"I would say I'm an offense to nature, but nature doesn't matter and neither do I. Kill me," it says.\n\nAnd when you hesitate: [["Come over here|secret1]] and I'll give you a good reason to kill me."
<<set $didkilled = false>><<sparebreen>>\n\n"GET BACK HERE," shouts the grub. "SHOOT ME, YOU COWARD!"\n\nYou <<replace "turn away.">>turn away.\n\nThe Breen-grub is still howling at you as you exit [[into the hall.|into the atrium.]]<<endreplace>>
<<if $sound is false>><<else>><<randomizehiss>><<endif>>We are testing the breengrub kill feature.\n\n[[Kill breengrub|killhim]]\n[[Spare breengrub|sparehim]]
"Are these your guys? Do they do what you say?" Alyx asks, pointing at the soldiers.\n\n"Yes. No. Well, sometimes." A note of fear in the grub's voice. "I think they're errors, too."\n\n"Then you tell //them// to shoot you."\n\nThe grub's face <<replace "contorts.">>contorts. "What do you think I've been //doing// for the past year?" it bellows. "You don't think I've been //asking??"//\n\n"Well, [[I won't shoot you,"|breen9]] Alyx says.<<endreplace>>
Her refusal strikes you as odd because //you are very very certain that Alyx has shot someone in the near future, or will shoot someone in the recent past. Someone you// know.// She's going to shoot someone and it's a bad idea, she shouldn't do it--//\n\n"I won't shoot you," she repeats. "I'm not granting you that mercy."\n\nThere's a <<revise rumble "rumble">><<revision rumble>><<becomes>>rumble<<endrevision>> down below.<<revision rumble>><<becomes>> A soft blurring of people and things. Soot stains crawl up the walls and then recede. <<revise anothergust "Another gust">><<revision anothergust>><<becomes>>Another gust<<endrevision>> of displaced time. <<revision anothergust>><<becomes>>\n\n//--you are very very certain that Alyx is going to kill someone you know and she// [[probably shouldn't--|breen10]]<<endrevision>><<endrevision>>
After <<revise confusion1 "many confused hours">><<revision confusion1>><<becomes>><<revise confusion2 "many confused hours">><<revision confusion2>><<becomes>><<revise confusion3 "many confused hours">><<revision confusion3>><<becomes>>many confused hours<<endrevision>><<endrevision>><<endrevision>> outdoors--\n\n<<revision confusion3>><<revision confusion2>><<revision confusion1>><<becomes>>//--stumbling hand-in-hand through a maelstrom where the buffeting gusts of temporal-displacement wind mix with Antarctica's local weather--//<<endrevision>><<becomes>>//--you and Alyx periodically firing your strange alien guns into the air to make hand-warmers from their long, cruel barrels--//<<endrevision>><<becomes>>//--when the guns were empty, the disembodied upper torso of a gibbering soldier in slow pursuit as you laboriously tried every locked door on the periphery of the radio station, his arms windmilling through the soft upper layer of snow--//\n\n[[you find a building with a sturdy door.|intro2]]<<endrevision>>
Alyx grabs you by the shoulders. "I need you to stand up and start acting like an adult," she says, and her eyes are wild. "I <<revise needyou "need you">><<revision needyou>><<becomes>>need you<<endrevision>> to--<<revision needyou>><<becomes>>\n\n//Out of the corner of your eye, you can see that the Breen-grub is having a quivering meltdown of his own. The soldiers are doing something to him with mops??//\n\n"--act normal, okay? Act normal! What's the matter with you lately, huh? Gordon? Fucking say something, okay? Tell me you got <<revise yourshit "your shit">><<revision yourshit>><<becomes>>your shit<<endrevision>> together??"<<revision yourshit>><<becomes>>\n\n//The tiny man-face on the front of the grub body vomits a pool of goop onto the floor. It's like someone's turned on a firehose. You hear the whole pppbbbb-b-b-b-bttttttttsplash--//\n\n"Gordon!" Alyx shouts.\n\n[["W-w-we killed him,"|breen3]] you whine.<<endrevision>><<endrevision>>
"HOW??" screams the grub.\n\nAlyx turns and stares. "What?" she shouts back.\n\nYou force your eyes to travel all the way across the grimy stretch of floor and look directly at <<replace "the slimy-chinned grub wearing Doctor Breen's papery face.">>the slimy-chinned grub wearing Doctor Breen's papery face.\n\n[["HOW DID YOU KILL ME??"|breen4]] it howls.<<endreplace>>
Alyx is <<revise shaking "shaking you.">><<revision shaking>><<becomes>>shaking you.<<endrevision>> "Hey! //Hey!!"//<<revision shaking>><<becomes>>\n\nYou're sitting on your ass against the far wall, struggling to breathe. Alyx is giving you that withering look. Behind her you can see the quivering mass of the grub, but every time you look <<replace "directly at it--">>directly at it--\n\nYou start choking again. Alyx <<revise slaps "slaps">><<revision slaps>><<becomes>>slaps<<endrevision>> you across the face.<<revision slaps>><<becomes>>\n\n"Get yourself together," she says. "He's some fucked experiment. //Hey! Stop it!// Get yourself [[the fuck together!"|breen2]]<<endrevision>><<endreplace>><<endrevision>>
<<set $sound = false>><<soundsettings>>
"I think you should <<revise kill "kill">><<revision kill>><<becomes>>kill<<endrevision>> me," the grub says.<<revision kill>><<becomes>>\n\nAlyx just laughs.\n\n<<if $deathtruth is true>>"I think you two should shoot me with a gun," it blurts. "Suits you, Doctor Freeman. Murdered me once already. Just take one of those guns and //shoot me right in the forehead."//<<else>>"It's a wretched existence," the grub snaps. "I cannot sleep. I get very //hot// at night, even in this cold. Everything is filth."<<endif>>\n\nThe soldiers seem [[a little worried.|breen8]] They trade smooth-faced, eyeless glances.<<endrevision>>
"We exploded the reactor and it killed you," Alyx says.\n\n"WHAT reactor??" demands the grub. Its eyes are rolling. The soldiers are rubbing its heaving sides with damp mops and stroking it with careful hands.\n\nYou realize Alyx is staring at you. Your turn to talk. <<replace "Uh...">>Uh...\n\nYou could [[share the gory details.|deathtruth]] Or you [[could not--|deathlie]]<<endreplace>>
Alyx shakes her arm free from your hard-clamped grip. "We're leaving," she snaps. "This is bullshit. You're some lab experiment."\n\nThe floor <<revise rumblesa "rumbles">><<revision rumblesa>><<becomes>>rumbles<<endrevision>> again.<<revision rumblesa>><<becomes>>\n\n//You notice that everyone is leaving a warm mushy trail of themselves backwards in time and space, a blurred figure you can follow with your eye. And when she turns her face toward you--//\n\nShe's gonna kill someone from the old days. She's gonna kill Doctor Kleiner, or Mossman, or Barney, or someone. "You're <<revise gonnak "gonna kill someone,">><<revision gonnak>><<becomes>>gonna kill someone,<<endrevision>> I think," you say, weakly. <<revision gonnak>><<becomes>>\n\n"Well, [[not this fucker,"|breen11]] she snaps.<<endrevision>><<endrevision>>
"Yeah, I know," you say. But she just turns on her heel and <<replace "walks out of the room.">>walks out of the room.\n\nThe soldiers <<replace "don't stop her.">>don't stop her.\n\nThe grub glares at you. "You should kill me, then," it says. "At the very fucking least, Doctor Freeman. [[You should kill me."|breen12]]<<endreplace>><<endreplace>>
<<if $deathtruth is true>>"You've had practice. You blew me up. You said it yourself. Turned me to ash and scattered me to the horizon."<<else>>"I know you're hiding something," he says. //"Forgot// what happened? You had a part in my death before, I'm sure. Get back into practice."<<endif>>\n\nYou stand. A soldier approaches. He puts <<revise apistol "a pistol">><<revision apistol>><<becomes>>a pistol<<endrevision>> in your hand.<<revision apistol>><<becomes>>\n\n"Just pull the trigger! How many other times have you done it? Whole legions laid to waste. So many bullets. No tool of death in the universe seems to be beyond your merciless cunning." The grub laughs. "This charade of my eternal life has gone on long enough."\n\n"But I thought... I thought you //loved// alien shit," you mumble. "I thought you //wanted// to be [[something else."|breen13]]<<endrevision>>
"Listen," the grub says. "I've seen other worlds, now, and they're nothing special. Just our familiar brute consumption... on, on a //galactic// scale, with more gears and tentacles. There's nothing special about a race that conquers worlds, and there's nothing special about a human fleshsack gobbling up its dinner."\n\nYou can't tear your eyes off him. It's like a theme park animatronic. Strange unseen technologies operating the puppet of a face.\n\n[["Do you think any flesh matters?|disagree]] No, [[there's nothing sacred about any type of life.|agree]] Accidents in hydrocarbon."
<<set $hiss1 = "hiss1.mp3">>\n<<set $hiss2 = "hiss2.mp3">>\n<<set $hiss3 = "hiss3.mp3">>\n<<set $sound = true>>
<<set $sound = true>><<soundsettings>>
AUDIO SOURCES\n[[VisualPony @ Freesound|https://freesound.org/people/VisualPony/]] - Hiss sound\n[[Reitanna Seishin @ Freesound|http://freesound.org/people/Reitanna/]] - Hiss sound\n[[Syrvive @ Freesound|http://freesound.org/people/syrvive/]] - Growling Hiss
You wend your way deep into the building, and the chattering voice echoes off stained and crumbling walls. The Combine have a weary, spartan way of maintaining even their oldest facilities, but there's none of that clean decay here. <<revise refuse "Heaps of refuse">><<revision refuse>><<becomes>>Heaps of refuse<<endrevision>> line the halls.<<revision refuse>><<becomes>>\n\n//<<revision vagabond>><<revise vagabond "Vagabond soldiers">> lurk in the trash, too. Smooth pale gengineered faces. Long anemic fingers playing with the roaches.<<becomes>>That <<revise symbol "strange symbol">><<revision symbol>><<becomes>>strange symbol<<endrevision>> daubed on their threadbare vests.<<endrevision>>//<<revision symbol>><<becomes>>\n\n"The Citadel," Alyx mutters, pointing at the drawing. "It's a drawing of the Citadel." Her eyes are [[wild and strange.|intro5]]<<endrevision>><<endrevision>>
There is something wrong with her and there is something wrong with you. <<replace "There is something off about your memory.">>Oh, there is //something off about the way your memory has been working. Something huge and horrible that almost happened in the recent past, almost happened in the future, keeps almost happening every minute you're here. Something you're circling toward, like an ant drowning in bathwater as it orbits round the drain.//\n\n<<revision alyxdid>>//<<revise alyxdid "Something Alyx did--">>//<<becomes>>She grabs your arm. The soldiers have halted before <<replace "an enormous door.">>an enormous door.\n\nOne soldier knocks out: [[shave and a haircut.|intro6]]<<endreplace>><<endrevision>><<endreplace>>
Over the intercom, an eerie, meaty imitation of a voice you hear in nightmares responds:\n\n[["Well, come on in."|breenstart]]
In the vestibule, Alyx is tearing apart a cabinet full of Combine gear, looking for guns. She barely spares you a glance.\n\n"We gotta get going," she says. "We gotta get out of here. Fucker's gonna change his mind."\n\n"Okay," you mutter. <<replace "Okay. Fine.">>Okay. Fine.\n\nAlyx doesn't find any guns. Cursing, she opens the front door and looks out across the [[wind-whipped expanse]] of iced-up, snowed-over lake.<<endreplace>>
try {\n\tversion.extensions['getspares'] = {\n\t\tmajor:1, minor:0, revision:0\n};\n\tmacros['getspares'] = {\n\thandler: function(place, macroName, params, parser) {\n\n var numberSpared;\n\n function getBreenCounter(callback) {\n var xhr = new XMLHttpRequest();\n xhr.addEventListener("readystatechange", function () {\n if (this.readyState === 4) {\n var parsed = JSON.parse(this.responseText);\n callback(parsed);\n //console.log(this.responseText);\n }\n });\n xhr.open("GET", "http://54.203.93.132/v1/grubs");\n xhr.send(null);\n }\n\n getBreenCounter(function(counters){\n new Wikifier(place, "Unfortunately, you have also spared him " + counters.spared + " times, Doctor Freeman.\s" [[Well.|gmanend2]]");\n new Wikifier(place, "<<set $spared = " + counters.spared + ">>");\n });\n\n}\n\t};\n} catch(e) {\n\tthrowError(place,"serveevent Setup Error: "+e.message);\n}\n
No one stands guard <<replace "outside--">>outside--\n\n--but in the fucking vestibule, three <<revise soldiers1 "maskless soldiers">><<revision soldiers1>><<becomes>><<revise soldiers2 "maskless soldiers">><<revision soldiers2>><<becomes>>maskless soldiers<<endrevision>><<endrevision>> press submachine guns against your chins and relieve you of your useless weapons.<<revision soldiers1>><<becomes>>\n\n<<revision soldiers2>>//Their faces are smooth and glistening and plump, like egg yolks. Their puckered mouths struggle to suck down the icy air that blows in around you.//<<becomes>>//There is a symbol on their shoulders that you [[do not recognize.|intro3]]//<<endrevision>><<endrevision>><<endreplace>>
They cannot speak without the helmets, so one of them wedges that apparatus on and <<revise chin "pulls it down">><<revision chin>><<becomes>>pulls it down<<endrevision>> over his chin.<<revision chin>><<becomes>>\n\nIt starts to emit a staticky croak of familiar language. <<replace "Freeze!">>Hold it. It. It.<<becomes>>Zzzk//Freeze!!//\n\nIt's on the fritz; bad, old hardware. <<revise alyxstare "Alyx">><<revision alyxstare>><<becomes>>Alyx<<endrevision>> raises her eyebrows.<<revision alyxstare>><<becomes>>\n\nYou shake your head. You cannot fight your way out of this one. Better to meekly follow these soldiers and [[hope for the best.|intro4]]<<endrevision>><<endreplace>><<endrevision>>
You're staggering and crying and wiping the sludge from your face while it drips down the back of your suit and the Breen-grub is shouting, unhinging its jaw for each of these angry words while slime still burbles and gutters in its throat:\n\n<<revision hand>>"KILL ME, DOCTOR FREEMAN! //KILL ME!"//<<becomes>>"YOU PATHETIC MURDERER, YOU SCUM, KILL ME, YOU PIECE OF SHIT!"<<endrevision>> \n\n<<revision allover>><<revision hand>>There's <<revise hand "a gun in your hand--">><<becomes>>You lift it, drop it, retch, void the watery contents of your stomach <<revise allover "all over the floor--">><<endrevision>><<becomes>>And you decide then whether to [[shoot him|killhim]] or [[not--|sparehim]]<<endrevision>>
This game uses sound extensively. <<if $sound is true>>Sound is currently on.<<else>>Sound is currently off-- consider turning it on for the full experience!<<endif>>\n\n<<if $sound is true>>[[Turn sound off?|soundoff]]<<else>>[[Turn sound on?|soundon]]<<endif>>\n\n[[Return to start|Start]]
"Okay," you say. "Okay. But life needs to defend itself--"\n\n"No," the grub says. "No, it doesn't. Kill me."\n\nAnd when you hesitate: [["Come over here|secret1]] and I'll give you a good reason to kill me."