123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- ::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);
- }());
- /*! <<cyclinglink>> 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("<<cyclinglink>> 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)
- })
- }
- }
- }
- }();
- /*! <<cyclinglinka>> 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("<<cyclinglink>> 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)
- })
- }
- }
- }
- }();
- /*! <<cyclinglinkd>> 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("<<cyclinglink>> 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;
- }
- /*! <<bugreport>> 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("<<bugreport>> 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;i<klen;++i){var key=keys[i],diffP=diff[key];if(diffP===Diff.Op.Delete)delete render[key];else if(Array.isArray(diffP))switch(diffP[0]){case Diff.Op.SpliceArray:try{render.splice(diffP[1],1+(diffP[2]-diffP[1]))}catch(ex){}break;case Diff.Op.Copy:render[key]=clone(diffP[1]);break;case Diff.Op.CopyDate:render[key]=new Date(diffP[1])}else{var recurse=renderDiff(diffP,render[key]);0!==Object.keys(recurse).length&&(render[key]=recurse)}}return render}var varList=[],diff=renderDiff(Diff.diff(varObj,diffObj));for(var key in diff){var sName="$"+(key.search(/[^\w]/)===-1?key:'"'+key+'"');varList.push(sName+"="+JSON.stringify(diff[key]))}return doSort&&("function"==typeof doSort?varList.sort(doSort):varList.sort()),0!==varList.length?varList.join(", "):""}var info=this.args.length>0&&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?'<div id="bugreport-info"></div>':"")+'<div><b>Bug report:</b> <a id="bugreport-data-select" class="link-internal macro-bugreport">[Select]</a></div><pre id="bugreport-data"><code tabindex="0"></code></pre>'),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()}}})}();
- /*! <<checkvars>> 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("<<checkvars>> 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="<h1>Story $variables (<code>State.variables</code>):</h1><p><em>No $variables currently set…</em></p>",void UI.open();dialog.innerHTML="<h1>Story $variables (<code>State.variables</code>):</h1><table><thead><tr><th>Name</th><th>Value</th></tr></thead><tbody></tbody></table>"+(/applewebkit|chrome/.test(Browser.userAgent)?"":'<div class="scroll-pad"> </div>');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<names.length;i++){var tr=document.createElement("tr"),tdName=document.createElement("td"),tdValue=document.createElement("td");tdName.textContent="$"+names[i],tdValue.textContent=toString(sv[names[i]]),tr.appendChild(tdName),tr.appendChild(tdValue),tbody.appendChild(tr)}UI.open()}})}();
- ::StoryInit <1304,233>
- <<set
- //Clothing
- $current_top = 't-shirt'
- $current_bottom = 'jeans'
- $current_genitals = 'penis'
- $current_bust = 'AA'
-
- //rewards/promises
- $reward = "nothing"
- //karmic actions
- $times_spied = 0
- $lies = 0
- $girls_know_you_spied = false
- //how much people like you, 0 for neutral.
- $nat_disposition = 0
- $jess_disposition = 0
- $sally_disposition = 0
-
- //long-term tracking
- $keep_the_bikini = 'no agreement' //or new, or destroy
- $bottom_style = "vagina" //or girlcock, or ken doll
- $nat_offlimits = false
- $heather_bikini_options = 'custom_bikini'
- $tournament_bikini = 'custom_bikini';
- $heather_bikini_options = 'custom'
-
- $eyes_closed = false
- $nat_present = false
- $mood = ''
-
- $boy_name = '#ERROR haven\'t set $boy_name yet'
- $girl_name = 'Amanda'
- $girl_names = [
- 'Nikki',
- 'Bailey',
- 'Serena',
- 'Ashley',
- 'Brittany',
- 'Becca',
- 'Sabrina',
- 'Karla',
- 'Maria',
- 'Margot',
- 'Vanessa',
- 'Kate',
- 'Amanda',
- ]
- >>
- ::StoryCaption <1445,226>
- <a href="https://www.tfgamessite.com/index.php?module=viewgame&id=1291">Rate and Discuss this game on IGDB</a>
- <a data-passage="License"><<=Story.get('cc0_image').text>></a>
- 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]]
- <<click "Create Bug Report">><<bugreport>><</click>>
- <<click "Checkvars (for debugging)">><<checkvars>><</click>>
- ::PassageHeader [nobr] <1166,232>
- <<set
- _old_state = State.peek(1);
- _old_vars = _old_state && _old_state.variables;
- _girls = ['nat', 'jess', 'sally'];
- _clothing_slots = ['top', 'bottom']
- >>
- <<for _i to 0; _i lt _girls.length; _i++>>
- <<set
- _g = _girls[_i];
- _gd = _g + '_disposition';
- _old_d = _old_vars && _old_vars[_gd];
- _cur_d = variables()[_gd];
- >>
- <<if _old_d gt _cur_d >>
- @@.flashed-message; <<=_g.toUpperFirst()>> didn't like that.@@
- <<elseif _old_d lt _cur_d >>
- @@.flashed-message; <<=_g.toUpperFirst()>> appreciates that.@@
- <</if>>
- <</for>>
- <<silently>>The following will go away.<</silently>>
- <<if _old_vars && _old_vars['current_top'] != $current_top>>
- <<if $current_top == 'topless'>>
- @@.flashed-message; You are now topless.@@
- <<else>>
- @@.flashed-message; You are now wearing: $current_top.@@
- <</if>>
- <</if>>
- <<if _old_vars && _old_vars['current_bottom'] != $current_bottom>>
- <<if $current_bottom != 'naked'>>
- @@.flashed-message;You are now naked
- <<else>>
- @@.flashed-message;You are now wearing $current_bottom.@@
- <</if>>
- <</if>>
- <<if _old_vars && _old_vars['current_genitals'] != $current_genitals>>
- @@.flashed-message;You now have a $current_genitals.@@
- <</if>>
- <<if _old_vars && _old_vars['current_bust'] != $current_bust>>
- @@.flashed-message;You now have $current_bust cup breasts.@@
- <</if>>
- ::knowledge [nobr] <1590,406>
- <<set
- _knowledge = {
- "bikini-magical": "the bikini is magical",
- "sally-enchanted-bikini": "Sally enchanted the bikini(s)",
- "bikini-busty": "the bikini top makes you busty",
- "bikini-clones": "each bikini top clones a particular person",
- "tournament-beach-volleyball": "the \"tournament\" is a beach volleyball tournament",
- "tournament-busty": "the tournament has a minimum bust size, so your sister and her friends are going to be wearing magic bikinis too",
- "what-bottoms-do": "the bikini bottoms do on bottom much like the top: they\'ll turn you into a woman completely",
- "bikini-heather": "your bikini turns you into Jessica\'s friend Heather",
- "bikini-feminizes": "the bikini feminizes it\'s wearer",
- "tournament-girls-only": "the beach volleyball tournament is for girl\'s only"
- };
- >>
- <<set _k_keys = Object.keys(_knowledge) >>
- <<for _i to 0; _i lt _k_keys.length; _i++>>
- <<set
- _k = 'know-' + _k_keys[_i];
- _kd = _knowledge[_k_keys[_i]];
- >>
- <<if visitedTags(_k)>>
- You know that _kd.<br>
- <</if>>
- <</for>>
- <<back>>
|