::StoryJS [script] //install favicon ;(function () { var favicon = document.createElement("link"); favicon.rel = "icon"; favicon.type = "image/png"; favicon.href = Story.get('bikini_favicon').text; document.head.appendChild(favicon); }()); /*! <> macro for SugarCube 2.x */ ! function() { "use strict"; if ("undefined" == typeof version || "undefined" == typeof version.title || "SugarCube" !== version.title || "undefined" == typeof version.major || version.major < 2) throw new Error("<> macro requires SugarCube 2.0 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 = "none" === w.style.display ? "inline" : "none" } var rl = "cyclingLink"; switch (c[c.length - 1]) { case "end": var end = !0; c.pop(); break; case "out": var out = !0; c.pop() } var v = null; c.length && "$" === c[0][0] && (v = c[0].slice(1), c.shift()); var h = State.variables; if (!out || !v || "" !== h[v]) { 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 === (v ? Math.max(c.indexOf(h[v]), 0) : 0), d = insertElement(null, "span", null, "cyclingLinkInit cyclingLink" + (on ? "En" : "Dis") + "abled"); on ? (v && (h[v] = c[i]), l.setAttribute("data-cycle", i)) : d.style.display = "none", insertText(d, c[i]), on && end && i === c.length - 1 ? l.parentNode.replaceChild(d, l) : l.appendChild(d) } jQuery(l).ariaClick(function() { var t = this.childNodes, u = this.getAttribute("data-cycle") - 0, m = t.length; if (toggleText(t[u]), u += 1, out && u === m ? v && (h[v] = "") : (u %= m, v && (h[v] = c[u])), (end || out) && u === m - (end ? 1 : 0)) { if (!end) return void this.parentNode.removeChild(this); var n = this.removeChild(t[u]); return n.className = rl + "End", n.style.display = "inline", void this.parentNode.replaceChild(n, this) } toggleText(t[u]), this.setAttribute("data-cycle", u) }) } } } }(); /*! <> macro for SugarCube 2.x */ ! function() { "use strict"; if ("undefined" == typeof version || "undefined" == typeof version.title || "SugarCube" !== version.title || "undefined" == typeof version.major || version.major < 2) throw new Error("<> macro requires SugarCube 2.0 or greater, aborting load"); version.extensions.cyclinglinkMacro = { major: 3, minor: 3, revision: 2 }, macros.cyclinglinka = { 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 = "none" === w.style.display ? "inline" : "none" } var rl = "cyclingLink"; switch (c[c.length - 1]) { case "end": var end = !0; c.pop(); break; case "out": var out = !0; c.pop() } var v = null; c.length && "$" === c[0][0] && (v = c[0].slice(1), c.shift()); c = c[0] var h = State.variables; if (!out || !v || "" !== h[v]) { 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 === (v ? Math.max(c.indexOf(h[v]), 0) : 0), d = insertElement(null, "span", null, "cyclingLinkInit cyclingLink" + (on ? "En" : "Dis") + "abled"); on ? (v && (h[v] = c[i]), l.setAttribute("data-cycle", i)) : d.style.display = "none", insertText(d, c[i]), on && end && i === c.length - 1 ? l.parentNode.replaceChild(d, l) : l.appendChild(d) } jQuery(l).ariaClick(function() { var t = this.childNodes, u = this.getAttribute("data-cycle") - 0, m = t.length; if (toggleText(t[u]), u += 1, out && u === m ? v && (h[v] = "") : (u %= m, v && (h[v] = c[u])), (end || out) && u === m - (end ? 1 : 0)) { if (!end) return void this.parentNode.removeChild(this); var n = this.removeChild(t[u]); return n.className = rl + "End", n.style.display = "inline", void this.parentNode.replaceChild(n, this) } toggleText(t[u]), this.setAttribute("data-cycle", u) }) } } } }(); /*! <> macro for SugarCube 2.x */ ! function() { "use strict"; if ("undefined" == typeof version || "undefined" == typeof version.title || "SugarCube" !== version.title || "undefined" == typeof version.major || version.major < 2) throw new Error("<> macro requires SugarCube 2.0 or greater, aborting load"); version.extensions.cyclinglinkMacro = { major: 3, minor: 3, revision: 2 }, macros.cyclinglinkd = { 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 = "none" === w.style.display ? "inline" : "none" } var rl = "cyclingLink"; switch (c[c.length - 1]) { case "end": var end = !0; c.pop(); break; case "out": var out = !0; c.pop() } var v = null; c.length && "$" === c[0][0] && (v = c[0].slice(1), c.shift()); var ks = Object.keys(c[0]); c = Object.values(c[0]) var h = State.variables; if (!out || !v || "" !== h[v]) { 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 === (v ? Math.max(ks.indexOf(h[v]), 0) : 0), d = insertElement(null, "span", null, "cyclingLinkInit cyclingLink" + (on ? "En" : "Dis") + "abled"); on ? (v && (h[v] = ks[i]), l.setAttribute("data-cycle", i)) : d.style.display = "none", insertText(d, c[i]), on && end && i === c.length - 1 ? l.parentNode.replaceChild(d, l) : l.appendChild(d) } jQuery(l).ariaClick(function() { var t = this.childNodes, u = this.getAttribute("data-cycle") - 0, m = t.length; if (toggleText(t[u]), u += 1, out && u === m ? v && (h[v] = "") : (u %= m, v && (h[v] = ks[u])), (end || out) && u === m - (end ? 1 : 0)) { if (!end) return void this.parentNode.removeChild(this); var n = this.removeChild(t[u]); return n.className = rl + "End", n.style.display = "inline", void this.parentNode.replaceChild(n, this) } toggleText(t[u]), this.setAttribute("data-cycle", u) }) } } } }(); /* from http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html */ window.myutils = {}; window.myutils.isEqual = function isEqual(a, b) { // Create arrays of property names var aProps = Object.getOwnPropertyNames(a); var bProps = Object.getOwnPropertyNames(b); // If number of properties is different, // objects are not equivalent if (aProps.length != bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i]; // If values of same property are not equal, // objects are not equivalent if (typeof a[propName] === 'object'){ if (!window.myutils.isEqual(a[propName], b[propName])){ return false; } }else if(a[propName] !== b[propName]) { return false; } } // If we made it this far, objects // are considered equivalent return true; } /*! <> macro for SugarCube 2.x */ !function(){"use strict";if("undefined"==typeof version||"undefined"==typeof version.title||"SugarCube"!==version.title||"undefined"==typeof version.major||version.major<2)throw new Error("<> macro requires SugarCube 2.0 or greater, aborting load");Macro.add("bugreport",{handler:function(){function serializeVariables(varObj,diffObj,doSort){function renderDiff(diff,orig){for(var keys=Object.keys(diff||{}),render=orig?clone(orig):{},i=0,klen=keys.length;klen>i;i++){var p=keys[i],diffP=diff[p];if(diffP===Util.DiffOp.Delete)delete render[p];else if(Array.isArray(diffP))switch(diffP[0]){case Util.DiffOp.SpliceArray:try{render.splice(diffP[1],1+(diffP[2]-diffP[1]))}catch(e){}break;case Util.DiffOp.Copy:render[p]=clone(diffP[1]);break;case Util.DiffOp.CopyDate:render[p]=new Date(diffP[1])}else{var recurse=renderDiff(diffP,render[p]);0!==Object.keys(recurse).length&&(render[p]=recurse)}}return render}var varList=[],diff=renderDiff(Util.diff(varObj,diffObj));for(var p in diff){var sName="$"+(-1===p.search(/[^\w]/)?p:'"'+p+'"');varList.push(sName+"="+JSON.stringify(diff[p]))}return doSort&&("function"==typeof doSort?varList.sort(doSort):varList.sort()),0!==varList.length?varList.join(", "):""}var srcMatch,passages,varsPre,varsPost,dialog,dataEl,info=null!=this.args[0]&&Story.has(this.args[0])?Story.get(this.args[0]):null,last=State.length-1,source=unescape(window.location);null!==(srcMatch=/\/([^\/]+)$/.exec(source))&&(source=srcMatch[1]),passages=[];for(var i=0;last>=i;i++)passages.push('"'+State.index(i).title+'"');passages=passages.join(", "),varsPre=serializeVariables(State.index(0).variables,State.index(last).variables),varsPost=serializeVariables(State.index(last).variables,State.variables),dialog=UI.setup("Bug Report","bugreport"),dialog.innerHTML=(null!==info?'
':"")+'
Bug report: [Select]
'+(/applewebkit|chrome/.test(Browser.userAgent)?"":'
 
'),dataEl=dialog.querySelector("#bugreport-data"),null!==info&&new Wikifier(dialog.querySelector("#bugreport-info"),info.processText()),addAccessibleClickHandler("#bugreport-data-select",function(self){return function(){jQuery(dataEl).focus(),self.selectData(dataEl)}}(this.self)),insertText(dataEl,"[spoiler][code]"),insertElement(dataEl,"br"),insertText(dataEl,"SOURCE: "+source),insertElement(dataEl,"br"),insertElement(dataEl,"br"),insertText(dataEl,"PASSAGES:"),insertElement(dataEl,"br"),insertText(dataEl,passages),insertElement(dataEl,"br"),insertElement(dataEl,"br"),insertText(dataEl,"VARIABLES (PRE-EXECUTION):"),insertElement(dataEl,"br"),varsPre&&(insertText(dataEl,varsPre),insertElement(dataEl,"br")),insertElement(dataEl,"br"),insertText(dataEl,"VARIABLES (POST-EXECUTION):"),insertElement(dataEl,"br"),varsPost&&(insertText(dataEl,varsPost),insertElement(dataEl,"br")),insertText(dataEl,"[/code][/spoiler]"),UI.open()},selectData:function(e){if(window.getSelection){var s=window.getSelection();if(s.setBaseAndExtent)s.setBaseAndExtent(e,0,e,e.innerText.length-1);else{window.opera&&"
"===e.innerHTML.substring(e.innerHTML.length-4)&&(e.innerHTML+=" ");var r=document.createRange();r.selectNodeContents(e),s.removeAllRanges(),s.addRange(r)}}else if(document.getSelection){var s=document.getSelection(),r=document.createRange();r.selectNodeContents(e),s.removeAllRanges(),s.addRange(r)}else if(document.selection){var r=document.body.createTextRange();r.moveToElementText(e),r.select()}}})}(); /*! <> macro for SugarCube 2.x */ !function(){"use strict";if("undefined"==typeof version||"undefined"==typeof version.title||"SugarCube"!==version.title||"undefined"==typeof version.major||version.major<2)throw new Error("<> macro requires SugarCube 2.0 or greater, aborting load");Macro.add("checkvars",{handler:function(){function toString(value,indent){var baseType=typeof value;switch(baseType){case"number":return isNaN(value)?"NaN":isFinite(value)?String(value):"Infinity";case"string":return JSON.stringify(value);case"function":return"(function)";default:if("object"!==baseType||null==value)return String(value);var objType=Object.prototype.toString.call(value);if("[object Date]"===objType)return'(object: Date, value: "'+value.toISOString()+'")';if("[object RegExp]"===objType)return"(object: RegExp, value: "+value.toString()+")";var opener,closer,result=[],indentText="  ";return indent||(indent=""),("[object Set]"===objType||value instanceof Set)&&(value=Array.from(value)),Array.isArray(value)?(opener="[\n",closer="\n"+indent+"]",value.forEach(function(p,i){result.push(indent+indentText+i+" ⇒ "+toString(value[i],indent+indentText))}),Object.keys(value).forEach(function(p){/^\d+$/.test(p)||result.push(indent+indentText+toString(p)+" ⇒ "+toString(value[p],indent+indentText))})):"[object Map]"===objType||value instanceof Map?(opener="{\n",closer="\n"+indent+"}",Array.from(value).map(function(kv){result.push(indent+indentText+toString(kv[0],indent+indentText)+" ⇒ "+toString(kv[1],indent+indentText))})):(opener="{\n",closer="\n"+indent+"}",Object.keys(value).forEach(function(p){result.push(indent+indentText+toString(p)+" ⇒ "+toString(value[p],indent+indentText))})),opener+result.join(",\n")+closer}}var dialog,sv=State.variables,names=Object.keys(sv);if(dialog=UI.setup("Story $variables","checkvars"),0===names.length)return dialog.innerHTML="

Story $variables (State.variables):

No $variables currently set…

",void UI.open();dialog.innerHTML="

Story $variables (State.variables):

NameValue
"+(/applewebkit|chrome/.test(Browser.userAgent)?"":'
 
');var tbody=dialog.querySelector("tbody");names.sort(function(a,b){return Util.isNumeric(a)&&Util.isNumeric(b)?Number(a)-Number(b):a.localeCompare(b)});for(var i=0;i <> ::StoryCaption <1445,226> Rate and Discuss this game on IGDB <<=Story.get('cc0_image').text>> Disposition: Jessica (your sister): $jess_disposition Natalie: $nat_disposition Sally: $sally_disposition Karmic Actions times_spied=$times_spied times_lied=$lies ::StoryMenu <1593,233> [[Knowledge->knowledge]] <><><> <><><> ::PassageHeader [nobr] <1166,232> <> <> <> <> @@.flashed-message; <<=_g.toUpperFirst()>> didn't like that.@@ <> @@.flashed-message; <<=_g.toUpperFirst()>> appreciates that.@@ <> <> <>The following will go away.<> <> <> @@.flashed-message; You are now topless.@@ <> @@.flashed-message; You are now wearing: $current_top.@@ <> <> <> <> @@.flashed-message;You are now naked <> @@.flashed-message;You are now wearing $current_bottom.@@ <> <> <> @@.flashed-message;You now have a $current_genitals.@@ <> <> @@.flashed-message;You now have $current_bust cup breasts.@@ <> ::knowledge [nobr] <1590,406> <> <> <> <> <> You know that _kd.
<
> <
> <>