::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 v2 */ !function(){"use strict";if("undefined"==typeof version||"undefined"==typeof version.title||"SugarCube"!==version.title||"undefined"==typeof version.major||version.major<2||"undefined"==typeof version.minor||version.minor<19)throw new Error("<> macro requires SugarCube 2.19.0 or greater, aborting load");Macro.add("bugreport",{fence:["[spoiler][code]","[/code][/spoiler]"],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;i0&&Story.has(this.args[0])?Story.get(this.args[0]).processText():"",last=State.length-1,passages=[],source=unescape(window.location),srcMatch=void 0;null!==(srcMatch=/\/([^\/]+)$/.exec(source))&&(source=srcMatch[1]);for(var i=0;i<=last;++i)passages.push('"'+State.index(i).title+'"');passages=passages.join(", ");var varsPre=serializeVariables(State.index(0).variables,State.index(last).variables),varsPost=serializeVariables(State.index(last).variables,State.variables),$dialog=jQuery(Dialog.setup("Bug Report","bugreport"));$dialog.append((info?'
':"")+'
Bug report: [Select]
'),info&&new Wikifier($dialog.find("#bugreport-info"),info);var $data=jQuery($dialog.find("#bugreport-data > code").get(0));$data.text(this.self.fence[0]+"\n"+("SOURCE: "+source+"\n\n")+("PASSAGES:\n"+passages+"\n\n")+("VARIABLES (PRE-EXECUTION):\n"+(varsPre?varsPre+"\n":"")+"\n")+("VARIABLES (POST-EXECUTION):\n"+(varsPost?varsPost+"\n":""))+(""+this.self.fence[1])),$dialog.find("#bugreport-data-select").ariaClick(function(selectData){return function(){$data.focus(),selectData($data.get(0))}}(this.self.selectData)),Dialog.open()},selectData:function(el){var getSelection=window.getSelection||document.getSelection;if(getSelection){var sel=getSelection();if(sel.setBaseAndExtent)sel.setBaseAndExtent(el,0,el,el.childNodes.length);else{var rng=document.createRange();rng.selectNodeContents(el),sel.removeAllRanges(),sel.addRange(rng)}}else if(document.selection){var _rng=document.body.createTextRange();_rng.moveToElementText(el),_rng.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.
<
> <
> <>