From 18f9f6647e3017fd2b3c10e8bf974bd392d8a2ea Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Sun, 3 Feb 2019 22:44:32 -0500 Subject: [PATCH 01/44] Added Goathias and Mech --- presets.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/presets.js b/presets.js index 75b649d..09f8927 100644 --- a/presets.js +++ b/presets.js @@ -1,3 +1,5 @@ let presets = [ - {"version":1,"name":"Fen","brutality":"2","oralVore":true,"analVore":true,"analVoreToStomach":true,"hasTail":true,"tailType":"twisted","baseTailLength":2,"baseTailDiameter":0.4} + {"version":1,"name":"Fen","brutality":"2","oralVore":true,"analVore":true,"analVoreToStomach":true,"hasTail":true,"tailType":"twisted","baseTailLength":2,"baseTailDiameter":0.4}, + {"version":1,"name":"Mech","baseHeight":3.7,"baseMass":500,"basePawLength":0.8,"basePawWidth":0.5,"baseHandLength":0.4,"baseHandWidth":0.2,"baseAssArea":1,"species":"Dragon","brutality":"2","victimsHuman":true,"victimsMilitary":true,"victimsMacros":true,"oralVore":true,"oralDigestTime":5,"analVore":true,"baseAnalVoreDiameter":0.4,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"tailType":"meaty","baseTailLength":2.5,"baseTailDiameter":0.6,"maleParts":true,"baseDickLength":0.9,"baseDickDiameter":0.2,"dickType":"hefty","baseBallDiameter":0.19,"baseCumVolume":2,"cockVoreEnabled":true,"cockDigestTime":5,"basePissProduction":0.001,"baseScatDigestFactor":0.3,"scatStorageScale":1.5,"scatScaleWithSize":true,"magicEnabled":true}, + {"version":1,"name":"Goathias","scale":3,"species":"Goat","footType":"hoof","difficulty":"1","brutality":"3","victimsHuman":true,"victimsMilitary":true,"oralVore":true,"vomitEnabled":true,"analVore":true,"arousalEnabled":true,"maleParts":true,"cockVoreEnabled":true,"cumScaleWithSize":true,"maleMuskEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"milkScaleWithSize":true,"stenchEnabled":true,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"pissEnabled":true,"bladderVore":true,"pissScaleWithSize":true,"scatEnabled":true,"scatScaleWithSize":true,"breathEnabled":true,"breathFoul":true,"droolEnabled":true,"magicEnabled":true} ] From f257ad4df0e6ed746927d6bbc4c0173b0d12c653 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:43:15 -0400 Subject: [PATCH 02/44] More Descriptive text, more text ramdomness Added soleDesc which is used to describe the bottoms of feet. removed two cases of redundant cock text, added foot size to look around text, added random options for dickDesc. Made look around text change if strolling, added more size based varients for look around text. Added vol passthrough to male orgasm function. Added text varients for growth --- game.js | 138 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 115 insertions(+), 23 deletions(-) diff --git a/game.js b/game.js index 9237f70..4cbd008 100644 --- a/game.js +++ b/game.js @@ -234,6 +234,86 @@ let macro = return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; }, + "soleNoShoeDesc": function(plural=false,capital=false) { + let result = ""; + + if (!this.footSockWorn) { + return this.soleOnlyDesc(plural,capital); + } else if (this.footSockWorn) { + switch(this.footSock) { + case "sock": + result = "socked " + this.soleOnlyDesc(plural,false); + } + } + + return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; + }, + + "soleOnlyDesc": function(plural=false,capital=false) { + let result = ""; + + switch(this.footType) { + case "paw": + result = plural ? "pads" : "pads"; + break; + case "hoof": + result = plural ? pickString("frogs","soles"):pickString("frog","sole"); + break; + case "foot": + result = plural ? "soles" : "sole"; + break; + case "avian": + result = plural ? "pads" : "pads"; + break; + } + return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; + }, + + "soleDesc": function(plural=false,capital=false,possessive=false) { + let result = ""; + if (!this.footWear) { + return this.soleOnlyDesc(plural,capital); + } + if (!this.footSockWorn && !this.footShoeWorn) { + return this.soleOnlyDesc(plural,capital); + } else if (this.footShoeWorn) { + switch(this.footShoe) { + case "shoe": + result = plural ? "heels" : "heel"; + break; + case "boot": + result = plural ? "heels" : "heel"; + break; + case "trainer": + result = plural ? "heels" : "heel"; + break; + case "sandal": + result = plural ? "heels" : "heel"; + break; + case "heel": + return plural ? "soles" : "sole"; + break; + case "croc": + return plural ? "heels" : "heel"; + break; + } + } else if (this.footSockWorn) { + switch(this.footSock) { + case "sock": + result = "socked " + this.soleOnlyDesc(plural,false); + break; + case "stocking": + result = "stocking-wrapped " + this.soleOnlyDesc(plural, false); + break; + } + } + + if(possessive) { + result = "your " + result; + } + return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; + }, + "shoeDesc": function(plural,capital) { let result = ""; switch(this.footShoe) { @@ -1558,9 +1638,9 @@ let macro = } if (this.maleParts) { if (this.hasSheath && this.arousal < 75) { - line = "Your " + this.describeDick + " cock is hidden away in your bulging sheath, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; + line = "Your " + this.describeDick + " is hidden away in your bulging sheath, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; } else { - line = "Your " + this.describeDick + " cock hangs from your hips, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; + line = "Your " + this.describeDick + " hangs from your hips, with two " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + "-wide balls hanging beneath."; } result.push(line); result.push(macro.balls.description); @@ -1599,7 +1679,7 @@ let macro = result.push(this.pouch.description); } - line = "Your two " + this.footDesc(true) + " shake the earth."; + line = "Your two " + length(macro.pawLength, unit, true) + " by " + length(macro.pawWidth, unit, true) + " " + this.footDesc(true) + " shake the earth."; if (this.footShoeWorn && this.shoe.container.count > 0) { line += " Within " + (this.shoe.container.count > 1 ? "are" : "is") + " " + this.shoe.container.describeSimple(verbose || flat); @@ -1651,10 +1731,7 @@ let macro = } } - let descDickArray = ["cock", "shaft", "rod"]; - let randomDescDick = descDickArray[(Math.random() * descDickArray.length) | 0]; - - return length(this.dickLength, unit, true) + " long " + state + " " + this.dickType + " " + randomDescDick; + return length(this.dickLength, unit, true) + " long " + state + " " + this.dickType + " " + pickString("cock", "shaft", "rod", "member", "dick"); }, get describeVagina() { @@ -1690,13 +1767,26 @@ function look() if (macro.height > 1e12) line2 = "You're pretty much everywhere at once."; else if (macro.height > 1e6) - line2 = "You're standing...on pretty much everything at once."; + line2 = "You're " + (strolling ? "strolling" : "standing") + "...on pretty much everything at once."; else switch(biome) { - case "rural": line2 = "You're standing amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break; - case "suburb": line2 = "You're striding through the winding roads of a suburb."; break; - case "city": line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; - case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; + case "rural": line2 = "You're " + (strolling ? "strolling" : "standing") + " amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break; + case "suburb": line2 = "You're " + (strolling ? "striding" : "standing") + " through the winding roads of a suburb."; break; + case "city": + if (macro.height < 6) { + line2 = "You are " + (strolling ? "Strolling" : "Standing") + " in the street of a city. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; + } else if (macro.height < 24) { + line2 = "Your broad frame fills the street of the city you are terrorizing. Your presence has caused a pileup of vehicles trying to escape."; break; + } else if (macro.height < 100){ + line2 = "You are too large for the city streets you are " + (strolling ? "strolling through." : "standing in.") + " Your hulking frame scrapes against building after building, leaving a clear indicator of your path. Gridlock is starting to set in, with people honking and trying to drive away on the sidewalks."; break; + } else if (macro.height < 500){ + line2 = "You are " + (strolling ? "strolling through" : "looming over") + " a bustling city. Your mammoth frame is on par with the few nearby skyscrapers, You forge your own path, leaving a swath of demolished buildings. Panic has fully gripped the city; the streets are filled with vehicles, all immobile."; break; + } else if (macro.height < 2500){ + line2 = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the couple of remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc + ". Traffic is gridlocked as far as you can see, and farther." ; break; + } else { + line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; + } + case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; break; } desc = desc.concat([newline,line2,newline]); @@ -2945,7 +3035,7 @@ function male_orgasm(vol, active=true) let area = Math.pow(vol, 2/3); let prey = getPrey(biome, area); - let line = describe("male-orgasm", prey, macro, verbose, flat).replace("$VOLUME",volume(vol,unit,true)); + let line = describe("male-orgasm", prey, macro, verbose, flat, vol).replace("$VOLUME",volume(vol,unit,true)); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -4271,7 +4361,8 @@ function grow(factor=1, simpleCalc=true){ let heightDelta = macro.height - oldHeight; let massDelta = macro.mass - oldMass; - update(["Power surges through you as you grow " + length(heightDelta, unit) + " taller and gain " + mass(massDelta, unit) + " of mass.",newline]); + update([pickString("Power surges through you","Your body surges upward","Your muscles fight for space","Energy flows into you","You feel your body expand","Your surroundings appear to shink","Your muscles tense","You almost lose your balance","A warm sensation fills you","You feel \ + a buzz of power") + " as you grow " + length(heightDelta, unit) + " taller and gain " + mass(massDelta, unit) + " of mass.",newline]); } function grow_paws(factor, simpleCalc=true){ @@ -4290,7 +4381,8 @@ function grow_paws(factor, simpleCalc=true){ let areaDelta = macro.pawArea - oldArea; - update(["Power surges through you as your " + macro.footDesc(true) + " grow, gaining " + area(areaDelta, unit, false) + " of area.",newline]); + update([(pickString("Power surges through you","Energy flows into you","You feel your " + macro.footDesc(true) + " expand","Your muscles tense","A warm sensation fills you","You feel a buzz of power")) + " as your \ + " + macro.footOnlyDesc(true) + pickString(" grow,"," push the ground apart,"," sink deeper into the soil,") + " gaining " + area(areaDelta, unit, false) + " of area.",newline]); } function grow_tail(factor, simpleCalc=true) { @@ -4310,7 +4402,7 @@ function grow_tail(factor, simpleCalc=true) { let lengthDelta = macro.tailLength - oldLength; let massDelta = macro.tailMass - oldMass; - update(["Power surges through you as your " + macro.tailType + " tail grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass.",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel your tail twitch","Your muscles tense","Your balance shifts","A warm sensation fills you","You feel a buzz of power") + " as your " + macro.tailType + " tail grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass.",newline]); } function grow_dick(factor, simpleCalc=true) { @@ -4330,7 +4422,7 @@ function grow_dick(factor, simpleCalc=true) { let lengthDelta = macro.dickLength - oldLength; let massDelta = macro.dickMass - oldMass; - update(["Power surges through you as your " + macro.dickType + " cock grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass.",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel your cock throb","Your muscles tense","You feel your loins buzz with energy","A warm sensation fills you","You feel a buzz of power") + " as your " + macro.dickType + " cock grows " + length(lengthDelta, unit, false) + " longer and gains " + mass(massDelta, unit, false) + " of mass.",newline]); } function grow_balls(factor, simpleCalc=true) { @@ -4350,7 +4442,7 @@ function grow_balls(factor, simpleCalc=true) { let diameterDelta = macro.ballDiameter - oldDiameter; let massDelta = macro.ballMass - oldMass; - update(["Power surges through you as your balls swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece.",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel an unfamiliar weight in your sack","You sack pushes your thighs further apart","Your muscles tense","You feel your loins buzz with energy","You feel a buzz of power","A warm sensation fills you") + " as your balls swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece.",newline]); } function grow_breasts(factor, simpleCalc=true) { @@ -4370,7 +4462,7 @@ function grow_breasts(factor, simpleCalc=true) { let diameterDelta = macro.breastDiameter - oldDiameter; let massDelta = macro.breastMass - oldMass; - update(["Power surges through you as your breasts swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece.",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel an unfamilliar weight on your chest","Your balance shifts","Your muscles tense","You feel a buzz of power","A warm sensation fills you") + " as your breasts swell by " + length(diameterDelta, unit, false) + ", gaining " + mass(massDelta, unit, false) + " of mass apiece.",newline]); } function grow_vagina(factor, simpleCalc=true) { @@ -4388,7 +4480,7 @@ function grow_vagina(factor, simpleCalc=true) { let lengthDelta = macro.vaginaLength - oldLength; - update(["Power surges through you as your moist slit expands by by " + length(lengthDelta, unit, false) + ".",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel your loins buzz with energy","Your muscles tense","You feel a buzz of power","A warm sensation fills you") + " as your moist slit expands by " + length(lengthDelta, unit, false) + ".",newline]); } function grow_womb(factor, simpleCalc=true) { @@ -4406,7 +4498,7 @@ function grow_womb(factor, simpleCalc=true) { let volumeDelta = macro.wombVolume - oldVolume; - update(["Power surges through you as your womb grows larger, gaining " + volume(volumeDelta, unit, false) + " of capacity.",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel your loins buzz with energy","You feel your muscles tense","You feel a buzz of power","A warm sensation fills you") + " as your womb grows larger, gaining " + volume(volumeDelta, unit, false) + " of capacity.",newline]); } function grow_ass(factor, simpleCalc=true) { @@ -4429,7 +4521,7 @@ function grow_ass(factor, simpleCalc=true) { let diameterDelta = Math.pow(macro.assArea,1/2) - oldDiameter; - update(["Power surges through you as your ass swells by " + length(diameterDelta, unit, false) + ".",newline]); + update([pickString("Power surges through you","Energy flows into you","You feel your rear fill with power","You feel your rear plump out","You feel your rear expand","Your muscles tense","Your balance shifts","You feel a buzz of power","A warm sensation fills you") + " as your ass swells by " + length(diameterDelta, unit, false) + ".",newline]); } function grow_wings(factor, simpleCalc=true){ @@ -4444,7 +4536,7 @@ function grow_wings(factor, simpleCalc=true){ let lengthDelta = macro.wingLength - oldLength; - update(["Power surges through you as your " + macro.wingDesc(true) + " grow, gaining " + length(2 * lengthDelta, unit, false) + " of wingspan.",newline]); + update([pickString("Power surges through you","Energy flows into you","Your back muscles fight for space","Your muscles tense","A crackeling fills the air","Your balance shifts","You feel a buzz of power","A warm sensation fills you") + " as your " + macro.wingDesc(true) + " grow, gaining " + length(2 * lengthDelta, unit, false) + " of wingspan.",newline]); } function resetSettings() { From ce6379306519d7df8de69d48fd5308314da592a5 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:44:03 -0400 Subject: [PATCH 03/44] Reduced military presence in weighting Lowered the weights of military, as they were showing up exclusivly in some cases. --- game.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/game.js b/game.js index 4cbd008..00bc292 100644 --- a/game.js +++ b/game.js @@ -1995,21 +1995,21 @@ function getWeights(region, area) { weights["Artillery"] = 0.06; weights["Helicopter"] = 0.05, weights["Squad"]= .04; - weights["Platoon"]= .4, - weights["Company"]= .5, - weights["Battalion"]= .6, - weights["Brigade"]= .7; + weights["Platoon"]= .2, + weights["Company"]= .3, + weights["Battalion"]= .4, + weights["Brigade"]= .5; } else if (macro.height < 5000){ weights["Tank"] = 0.0002; weights["Artillery"] = 0.001; weights["Squad"]= .0001; - weights["Platoon"]= .005, - weights["Company"]= .01, - weights["Battalion"]= .02, - weights["Brigade"]= .03; - weights["Division"]= .02, - weights["Tank Division"]= .01, - weights["Army"]= .01; + weights["Platoon"]= .0005, + weights["Company"]= .001, + weights["Battalion"]= .002, + weights["Brigade"]= .003; + weights["Division"]= .002, + weights["Tank Division"]= .001, + weights["Army"]= .001; } else { weights["Division"]= .02, weights["Tank Division"]= .01, From a7ca1dec32800f56461511eb68a42bccf80c69af Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:45:01 -0400 Subject: [PATCH 04/44] Adjusted Approx mass fixed duplicate of mass numbers in approx mass, made rounding simplier on the masses as well --- units.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/units.js b/units.js index 60a5b63..f502b39 100644 --- a/units.js +++ b/units.js @@ -215,22 +215,22 @@ function approxMass(kg, singular=false) { let mass = round(kg/5.2e10,2); return mass + (singular || mass == 1 ? " Great Wall of China" : " Great Wall Of Chinas"); } else if (kg < 5e21) { - let mass = round(kg/1.5373768e15,3); - return mass + (singular || mass == 1 ? " New York City" : mass + " New York Cities"); + let mass = round(kg/1.5e15,2); + return mass + (singular || mass == 1 ? " New York City" : " New York Cities"); //this figure includes a lot of underlying bedrock, just the city itself is 1.13587210581190e11 but I needed a good figure to fit in this spot } else if (kg < 6e23) { - let mass = round(kg/4.6121304e20,3); - return mass +(singular || mass == 1 ? " Australia" : mass + " Australias"); - //this is a napkin math number based on the land area of Australia, 25km of height and rough density of rock + let mass = round(kg/4.6e20,2); + return mass + (singular || mass == 1 ? " Australia" : " Australias"); + //this is a napkin math number based on the land area of Australia, 25km of height, and rough density of rock } else if (kg < 2e27) { - let mass = round(kg/5.972e24,4); - return mass + (singular || mass == 1 ? " Earth" : mass + " Earths"); + let mass = round(kg/6e24,2); + return mass + (singular || mass == 1 ? " Earth" :" Earths"); } else if (kg < 1.4e39) { - let mass = round(kg/1.989e30,4); - return mass + (singular || mass == 1 ? " Sun" : mass + " Suns"); + let mass = round(kg/2e30,2); + return mass + (singular || mass == 1 ? " Sun" :" Suns"); } else { - let mass = round(kg/1.3923e42,4); - return mass + (singular || mass == 1 ? " Milky Way" : mass + " Milky Ways"); + let mass = round(kg/1.4e42,2); + return mass + (singular || mass == 1 ? " Milky Way" :" Milky Ways"); } } From 3d628b151133e71aa550e69b168f224aef465816 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:46:09 -0400 Subject: [PATCH 05/44] Update recursive-macro.js remvoed duplicate inside on parking garages, and akward comma on tanks and helicopters --- recursive-macro.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recursive-macro.js b/recursive-macro.js index 0326788..6aba238 100644 --- a/recursive-macro.js +++ b/recursive-macro.js @@ -1139,7 +1139,7 @@ function ParkingGarage(count = 1) { this.describe = function(verbose = true) { if (verbose) { - return (this.count == 1 ? "a parking garage" : this.count + " parking garages") + " with " + describe_all(this.contents, verbose) + " inside"; + return (this.count == 1 ? "a parking garage" : this.count + " parking garages") + " with " + describe_all(this.contents, verbose); } else { return (this.count == 1 ? "a parking garage" : this.count + " parking garages"); } @@ -1322,7 +1322,7 @@ function Tank(count = 1) { this.describe = function(verbose = true) { if (verbose) { - return (this.count == 1 ? "a tank" : this.count + " tanks") + " with " + describe_all(this.contents, verbose) + " trapped inside."; + return (this.count == 1 ? "a tank" : this.count + " tanks") + " with " + describe_all(this.contents, verbose) + " trapped inside"; } else { return (this.count == 1 ? "a tank" : this.count + " tanks"); } @@ -1338,7 +1338,7 @@ function Artillery(count = 1) { this.describe = function(verbose = true) { if (verbose) { - return (this.count == 1 ? "an artillery unit" : this.count + " artillery units") + " with " + describe_all(this.contents, verbose) + " trapped inside."; + return (this.count == 1 ? "an artillery unit" : this.count + " artillery units") + " with " + describe_all(this.contents, verbose) + " trapped inside"; } else { return (this.count == 1 ? "an artillery unit" : this.count + " artillery units"); } @@ -1354,7 +1354,7 @@ function Helicopter(count = 1) { this.describe = function(verbose = true) { if (verbose) { - return (this.count == 1 ? "a helicopter" : this.count + " helicopters") + " with " + describe_all(this.contents, verbose) + " riding inside."; + return (this.count == 1 ? "a helicopter" : this.count + " helicopters") + " with " + describe_all(this.contents, verbose) + " riding inside"; } else { return (this.count == 1 ? "a helicopter" : this.count + " helicopters"); } From 579da1843b230c8ce47487918fbad5b912f26335 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:52:52 -0400 Subject: [PATCH 06/44] Backbone upgrade for recursive desc Added hasAtLeast function to increase rule flexibility on test functions. added an extra1 passthrough to describe function to increase rule flexibility on test functions Added pickString, a function that returns a random array element for text variation. --- recursive-desc.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index 9f6526d..b230887 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -71,6 +71,13 @@ function hasLessThan(container, thing, amount) { return false; } +function hasAtleast(container, thing, amount) { //this function does not trigger in situations where you have a single object(..., 1 [thing], ...) nested inside of a larger group. If you have a case where that can feasibly happen it is reccomended to put a parent ofject of the one you want as an and condition. + if (container.contents.hasOwnProperty(thing)) + if (container.contents[thing].count >= amount) + return true; + return false; +} + function hasExactly(container, thing, amount) { if (!container.contents.hasOwnProperty(thing) && amount == 0) return true; @@ -110,11 +117,11 @@ function nothingLarger(container, thing) { return true; } -function describe(action, container, macro, verbose=true, flat=false) { +function describe(action, container, macro, verbose=true, flat=false, extra1=0) { var options = []; for (var i = 0; i < rules[action].length; i++) { - if(rules[action][i].test(container,macro)) { + if(rules[action][i].test(container, macro, extra1)) { options.push(rules[action][i].desc); } } @@ -125,10 +132,10 @@ function describe(action, container, macro, verbose=true, flat=false) { if (options.length > 0 && Math.random() > (1 / (2 + rules[action].length))) { let choice = Math.floor(Math.random() * options.length); - return options[choice](container, macro, verbose, flat); + return options[choice](container, macro, verbose, flat, extra1); } else { - return getDefault(action)(container, macro, verbose, flat); + return getDefault(action)(container, macro, verbose, flat, extra1); } } @@ -136,6 +143,11 @@ function describeVictim(action, macro) { return getDefaultVictim(action)(macro); } +function pickString(...array){ + var strings = array; + var pick = strings[~~(Math.random() * strings.length)]; + return pick; +} // DEFAULTS function defaultEat(container, macro, verbose, flat) { From 88ed862f14c533bbab7af12bdc49dfce51a05cba Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 16 Mar 2019 19:56:29 -0400 Subject: [PATCH 07/44] More Text for actions 1 fixed eating macro and stomping parking garage to work with pickString added mroe size based stomping variations, added more cockvore sized based variations, added more size based interactions for male orgasms --- recursive-desc.js | 815 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 805 insertions(+), 10 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index b230887..504ddb0 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -1954,8 +1954,8 @@ rules["eat"].push({ nothingLarger(container, "Macro"); }, "desc": function(container, macro, verbose, flat) { - return "You spot a smaller macro " + ("staring up at you in awe"||"terrorizing the area"||"running from you"||"that is unaware of your presence") + " and decide it will make a suitable meal. You grab them and stuff them into your " + macro.jawDesc(true) + ". As you slurp\ - them down, you feel them " + ("catch in your throat for a brief moment before being swallowed"||"grab at your tounge for purchase before going down your throat"||"breifly struggle, then go limp"||"pound on the indside of your throat") + ". "; + return "You spot a smaller macro " + pickString("staring up at you in awe", "terrorizing the area", "running from you", "that is unaware of your presence") + " and decide it will make a suitable meal. You grab them and stuff them into your " + macro.jawDesc(true) + ". As you slurp\ + them down, you feel them " + pickString("catch in your throat for a brief moment before being swallowed.", "grab at your tounge for purchase before going down your throat.","briefly struggle, then go limp.","pound on the inside of your throat."); } }); @@ -2019,7 +2019,7 @@ rules["chew"].push({ return hasExactly(container, "Car", 1); }, "desc": function(container, macro, verbose, flat) { - return "You lean down and open your " + macro.jawDesc(true) + " wide, catching "+ container.describe(verbose) + ". Holding onto the car with only your " + macro.teethDesc(true) + ", you tilt your head back, opening wider \ + return "You lean down and open your " + macro.jawDesc(true) + " wide, catching " + container.describe(verbose) + ". Holding onto the car with only your " + macro.teethDesc(true) + ", you tilt your head back, opening wider \ to let the vehicle fall further your mouth, Once the car settles, you start slowly closing your jaw, feeling glass shatter, metal grind, and tires burst as those trapped inside try to escape. Every time your chew you feel your \ " + macro.teethDesc(true) + " " + macro.biteDesc(false) + " the vehicle into a smaller and smaller lump. After you are satisfied, you tilt your head back and swallow the debries in a single fluid gulp."; } @@ -2103,11 +2103,381 @@ rules["stomp"].push({ return hasExactly(container, "Parking Garage", 1) && nothingLarger(container, "Parking Garage"); }, "desc": function(container, macro, verbose, flat) { - return ("You bring your " + macro.footDesc() + " down on "||"You kick your " + macro.footDesc() + " through ") + container.describe(verbose) +" collapsing the structure and setting off car alarms. As the alarms blare, you reposition your " + macro.footDesc() + + return (pickString("You bring your " + macro.footDesc() + " down on ", "You kick your " + macro.footDesc() + " through ")) + container.describe(verbose) +", collapsing the structure and setting off car alarms. As the alarms blare, you reposition your " + macro.footDesc() + " over the structure, and slam it down; silencing the alarms, and completely demolishing the building."; } }); +//paw area between 5 and 50 + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 50 && + macro.pawArea > 5 && + isNonFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " makes contact with the ground, you feel a shock travel up your powerful leg, and see the ground deform beneath it."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 50 && + macro.pawArea > 5 && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " makes contact with the ground, you feel a shock travel up your powerful leg, and see the ground deform beneath it. \ + Your " + macro.footDesc() + "print is filled with rubble and those unluckly enough to be in your path."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 50 && + macro.pawArea > 5 && + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " makes contact with the ground, you feel a shock travel up your powerful leg, and see the ground deform beneath it. \ + Your " + macro.footDesc() + "print is filled with rubble and the mangled corpses of those unluckly enough to be in your path."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 50 && + macro.pawArea > 5 && + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You slowly bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " makes contact with your prey, you feel those beneath you struggle to overcome \ + the weight bearing down on them, before being completely crushed. You shift a little more of your weight on your outstretched " + macro.footDesc() + " and see blood spray from between your " + macro.toeDesc(true) + ". Lifting your " + macro.footDesc() + " off the \ + ground to examine your " + macro.footDesc() + "print, you see that it is filled with blood, debris, and the mangled corpses of those unluckly enough to be in your path."; + } +}); + +//Stomping Macro + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Macro", 1) && + nothingLarger(container, "Macro") && + isNonFatal(macro); + }, + "desc": function(container, macro, verbose, flat) { + return "You spot a smaller macro " + pickString("staring up at you in awe", "terrorizing the area", "running from you", "that is unaware of your presence") + pickString(" and decide to show it real power"," and decide it will will be suitable prey."," and decide to show it what being a macro really means.") + " \ + You slam your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " into it's comparatively tiny frame, which sends it into the side of a nearby building. As it attempts to pick itself up, you place your massive " + macro.footDesc() + " on its back, and slam the \ + smaller macro back into the dirt."; + } +}); + + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Macro", 1) && + nothingLarger(container, "Macro") && + isFatal(macro); + }, + "desc": function(container, macro, verbose, flat) { + return "You spot a smaller macro " + pickString("staring up at you in awe", "terrorizing the area", "running from you", "that is unaware of your presence") + pickString(" and decide to show it real power"," and decide it will will be suitable prey."," and decide to show it what being a macro really means.") + "\ + You slam your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " into it's comparatively tiny frame, which sends it into the side of a nearby building. As it attempts to pick itself up, you place your massive " + macro.footDesc() + " on its back, and slam the \ + smaller macro into the dirt where it perishes."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Macro", 1) && + nothingLarger(container, "Macro") && + isGory(macro); + }, + "desc": function(container, macro, verbose, flat) { + return "You spot a smaller macro " + pickString("staring up at you in awe", "terrorizing the area", "running from you", "that is unaware of your presence") + pickString(" and decide to show it real power"," and decide it will will be suitable prey."," and decide to show it what being a macro really means.") + " \ + You slam your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " into it's comparatively tiny frame; cracking bones and dashing it against the side of a nearby building. As it attempts to pick itself up, you place your massive " + macro.footDesc() + " on its \ + back, and slam the smaller macro into the dirt. Shifting your weight forward, you feel it struggle beneath your " + macro.toeDesc(true) + " and watch as blood soaks into the ground."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Macro", 1) && + nothingLarger(container, "Macro") && + isSadistic(macro); + }, + "desc": function(container, macro, verbose, flat) { + return "You spot a smaller macro " + pickString("staring up at you in awe", "terrorizing the area", "running from you", "that is unaware of your presence") + pickString(" and decide to show it real power"," and decide it will will be suitable prey."," and decide to show it what being a macro really means.") + " \ + You slam your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " into it's comparatively tiny frame; cracking bones and dashing it against the side of a nearby building. As it attempts to drag itself away, you place your massive " + macro.footDesc() + " \ + on its back, and slam the smaller macro into the dirt. Shifting your weight forward, you feel it struggle beneath your " + macro.toeDesc(true) + " and watch as blood soaks into the ground. You hold your stance as you feel it's struggles weaken and fade away. Just as it seems it \ + can struggle no more, you place your entire weight of " + mass(macro.mass, unit) + " on it, and pop it's " + mass(80000, unit, true) + " body like a grape."; + } +}); + +//paw area over 1000 + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1000 && + macro.pawArea > 50 && + isNonFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " impacts its target, you feel its weight sink into the ground. After you lift \ + your " + macro.soleDesc() + ", you notice it has left a deep, clear indent in the ground."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1000 && + macro.pawArea > 50 && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " impacts its target, you feel its weight sink into the ground. After you lift \ + your " + macro.soleDesc() + ", a deep indent full of rubble is revealed."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1000 && + macro.pawArea > 50 && + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " impacts its target, you feel its weight sink through buildings and into the \ + ground. After you lift your " + macro.soleDesc() + ", a deep indent full of rubble and mangled corpses is revealed."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1000 && + macro.pawArea > 50 && + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You bring your " + length(macro.pawWidth, unit, true) + " wide " + macro.footDesc() + " " + macro.footDesc() + " down on " + container.describe(verbose) + ". As your " + macro.footDesc() + " impacts its target, you feel its weight sink through buildings and into the \ + ground. After you lift your " + macro.soleDesc() + ", a deep indent full of blood-smeared rubble is revealed. Bone fragments and rebar stick out of the mess, tangled into a mold of your " + macro.footDesc() + "."; + } +}); + +//paw area less than 1e7 + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e7 && + macro.pawArea > 1000 + isNonFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ + Once you have lifted your " + macro.footDesc() + ", you notice it has left a " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " crater in the ground."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e7 && + macro.pawArea > 1000 + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ + With a back and forth twist, you drive your " + macro.toeDesc() + " deep into the soil. Once you have lifted your " + macro.footDesc() + ", you notice it has left a " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " \ + rubble-lined crater in the ground."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e7 && + macro.pawArea > 1000 + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ + With a back and forth twist, you drive your " + macro.toeDesc() + " deep into the soil. Once you have lifted your " + macro.footDesc() + ", you notice it has left a " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " \ + rubble-lined crater in the ground. At the center of the crater, a pond of blood and liquified prey is filling, fed by the crater and your dripping " + macro.soleDesc() + "."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e7 && + macro.pawArea > 1000 + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ + With a back and forth twist, your " + macro.toeDesc(true) + " knock over and pulverize buildings, driving them deep into the soil. Once you have lifted your " + macro.footDesc() + ", you notice it has left a " + length(macro.pawLength, unit, true) + " \ + by "+ length(macro.pawWidth, unit, true) + " rubble-lined crater in the ground. At the center of the crater, a pond of blood and liquified prey is filling, fed by the crater and your dripping " + macro.soleDesc() + "."; + } +}); + +//paw area less than 1e11 + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e11 && + macro.pawArea > 1e7 && + !hasAtleast(container, "Planet", 1) && //this is to prevent these interactions from running on planets that have been shrunk + isNonFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " casts a shadow over the landscape. You lazily bring it down on "+ container.describe(verbose) + ". You feel it make contact, and cloud of dust spreads around the area. As the dust settles, you can see the clear outline of \ + your " + macro.toeDesc(true) + "preserved in newly formed hills and valleys. Surrounding your " + macro.footDesc() + "print is a jagged mound of cracked stone; forming the wall of the " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " wide \ + dust-filled crater you created."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e11 && + macro.pawArea > 1e7 && + !hasAtleast(container, "Planet", 1) && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " casts a shadow over the landscape. You lazily bring it down on "+ container.describe(verbose) + ". You feel it make contact, and cloud of dust spreads around the area. As the dust settles, you can see the clear outline of your " + macro.toeDesc(true) + "\ + preserved in newly formed hills and valleys. Surrounding your " + macro.footDesc() + "print is a jagged mound of cracked stone and twisted steel; forming the wall of the " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " wide debris-filled crater you created."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e11 && + macro.pawArea > 1e7 && + !hasAtleast(container, "Planet", 1) && + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " casts a shadow over the landscape. You lazily bring it down on "+ container.describe(verbose) + ". You feel it make contact, and cloud of dust spreads around the area. As the dust settles, you can see the clear outline of your " + macro.toeDesc(true) + "\ + preserved in debris strewn hills and valleys. Surrounding your " + macro.footDesc() + "print is a jagged mound of cracked stone and twisted steel; forming the wall of the " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " wide gore-filled crater you created. \ + The basin of the crater lined with with a smooth steel, glass, and bone aggregate. Steam rises from the mix as it cools and hardens"; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return macro.pawArea <= 1e11 && + macro.pawArea > 1e7 && + !hasAtleast(container, "Planet", 1) && + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " casts a shadow over the landscape. You lazily bring it down on "+ container.describe(verbose) + ". As you lower your leg, you feel it catch the tops of the taller skycrapers first, collapsing them with no effort. As they fall, you \ + crush more and more buildings until you feel your " + macro.footDesc() + " smash into the ground. You settle into the landscape and cloud of dust spreads around the area. As the dust settles, you can see the clear outline of your " + macro.toeDesc(true) + "preserved in debris strewn \ + hills and valleys. Surrounding your " + macro.footDesc() + "print is a jagged mound of cracked stone and twisted steel; forming the wall of the " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " wide gore-filled crater you created. The basin of the crater \ + lined with with a smooth steel, glass, and bone aggregate. Steam rises from the mix as it cools and hardens"; + } +}); + +//paw area less than 2e14 + +rules["stomp"].push({ + "test": function(container, macro) { + return (macro.pawArea < 2e14 || + hasAtleast(container, "Continent", 1)) && + macro.pawArea > 1e11 && + !hasAtleast(container, "Planet", 1) && + isNonFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " turns day to night as you bring it down on "+ container.describe(verbose) + ". You feel it sink deep into the ground and watch as a visible shockwave extends outwards, knocking over everything in its path. Your " + macro.footDesc() + "\ + continues sinking into the bedrock until only your enoumous calf is above where the ground was moments before. Two distict, concentric craters have formed below you. The inner one is a " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " image \ + of your "+ macro.footDesc() + " surrounded by irregular mountains that barely peek over the rim of the outer " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " across crater. Once you remove your " + macro.footDesc() + " from its molded print, you notice that \ + the bottom of the smaller crater is filled with deep ravines."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return (macro.pawArea < 2e14 || + hasAtleast(container, "Continent", 1)) && + macro.pawArea > 1e11 && + !hasAtleast(container, "Planet", 1) && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " turns day to night as you bring it down on "+ container.describe(verbose) + ". You feel it sink deep into the ground and watch as a visible shockwave extends outwards, knocking over everything in its path. Your " + macro.footDesc() + "\ + continues sinking into the bedrock until only your enoumous blood-soaked calf is above where the ground was moments before. Two distict, concentric craters have formed below you. The inner one is a " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " image \ + of your "+ macro.footDesc() + " surrounded by irregular mountains of of broken concrete and steel that barely peek over the rim of the outer " + length((Math.pow(macro.pawArea/Math.PI, .5)* 3), unit, true) + " across crater. Once you remove your " + macro.footDesc() + " from its \ + molded print, you notice that the bottom of the smaller crater is filled with ravines that reach all the way to the mantle. With time, a supervolcano will form here."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return (macro.pawArea < 2e14 || + hasAtleast(container, "Continent", 1)) && + macro.pawArea > 1e11 && + !hasAtleast(container, "Planet", 1) && + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " turns day to night as you bring it down on "+ container.describe(verbose) + ". You feel it sink deep into the ground and watch as a visible shockwave extends outwards, knocking over everything in its path. The shrapnel riding behind the \ + shocwave rips thorugh the area, painting it in red. Your " + macro.footDesc() + " continues sinking into the bedrock until only your enoumous blood-soaked calf is above where the ground was moments before. Two distict, concentric craters have formed below you. The inner one is a \ + " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " image of your "+ macro.footDesc() + " surrounded by irregular mountains composed of broken concrete and steel that barely peek over the rim of the outer \ + " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " across crater. Once you remove your " + macro.footDesc() + " from its molded print, you notice that the bottom of the smaller crater is filled with ravines that reach all the way to the mantle. The lava \ + seeping upwards begins melting the steel, glass, concrete, and bone fragments that surround it."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return (macro.pawArea < 2e14 || + hasAtleast(container, "Continent", 1)) && + macro.pawArea > 1e11 && + !hasAtleast(container, "Planet", 1) && + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "Your massive " + macro.footDesc() + " turns day to night as you bring it down on "+ container.describe(verbose) + ". You feel it sink deep into the ground and watch as a visible shockwave extends outwards, knocking over everything in its path. The shrapnel riding behind the \ + shockave rips thorugh the area, painting it in red. Your " + macro.footDesc() + "continues sinking into the bedrock until only your enoumous blood-soaked calf is above where the ground was moments before. Two distict, concentric craters have formed below you. The inner one is a \ + " + length(macro.pawLength, unit, true) + " by "+ length(macro.pawWidth, unit, true) + " image of your "+ macro.footDesc() + " surrounded by irregular mountains of of broken concrete and steel that barely peek over the rim of the outer \ + " + length((Math.pow(macro.pawArea/Math.PI, .5)* 2.5), unit, true) + " across crater. Once you remove your " + macro.footDesc() + " from its molded print, you notice that the bottom of the smaller crater is filled with ravines that reach all the way to the mantle. The lava \ + seeping upwards begins melting the steel, glass, concrete, and bone fragments that surround it. The simple act of slamming your " + macro.footDesc() + " down has created a " + (1e7 <= (Math.pow(macro.pawArea/Math.PI, .5)* 4) ? "planet-wide":length((Math.pow(macro.pawArea/Math.PI, .5)* 4), unit, true) + " wide") + " \ + wasteland."; + } +}); + +// stomping a planet + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You place your two unbelievably large " + macro.footDesc(true) + " around "+ container.describe(verbose) + " and begin to squeeze it between your " + length(macro.pawWidth, unit, true) + " wide " + macro.toeDesc(true) + ". As you apply pressure, the captive globe \ + begins to bulge outward at the middle, and firmly press against its prison. Continuing to crush it, you feel the continents deform and magma begin to flow over the surface, fighting with and evaporating the oceans. As the last of the water drys up, the atmosphere thins and \ + spreads over your form, cooling the lava against the hard vacuum of space. Left with a crushed rocky orb between your " + macro.footDesc() + ", you start slowly increasing the pressure on the planet, and feel as it goes from a rough sphere to a rapidly crumbling pancake. The \ + remaining rock grinds away to dust as you massage your mighty " + macro.soleDesc(true) + " against each other."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isGory(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You place your two unbelievably large " + macro.footDesc(true) + " around "+ container.describe(verbose) + ". As your " + macro.soleDesc(true) + " spread across the surface of the planet, the civilization beneath breaks apart and lubricates the land.\ + You shift your " + macro.footDesc() + " for better grip and begin to squeeze the planet between your " + length(macro.pawWidth, unit, true) + " wide " + macro.toeDesc(true) + ". As you apply pressure, the captive globe begins to bulge outward at the middle, \ + and press up against its prison. Continuing to crush it, you feel the continents deform and magma begin to flow over the surface. The surface warms beneath you, as the dwindling oceans fill with cooling stone. As the last of the water drys up, the atmosphere thins \ + and spreads over your form, cooling the remaining lava against the hard vacuum of space. Left with a crushed rocky orb between your " + macro.footDesc() + ", you start slowly increasing the pressure on the planet, and feel as it goes from a rough sphere to a rapidly \ + crumbling pancake. The remaining rock grinds away to dust as you massage your mighty " + macro.soleDesc(true) + " against each other."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isSadistic(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You place your two unbelievably large " + macro.footDesc(true) + " around "+ container.describe(verbose) + ". As your " + macro.soleDesc(true) + " spread across the surface of the planet, the civilization beneath breaks apart and lubricates the land.\ + You shift your " + macro.footDesc() + " for better grip and begin to squeeze the planet between your " + length(macro.pawWidth, unit, true) + " wide " + macro.toeDesc(true) + ". As you apply pressure, the captive globe begins to bulge outward at the middle, \ + and press up against its prison. Continuing to crush it, you feel the continents deform and magma begin to flow over the surface. The planet burns and dies below you, as the dwindling oceans fill with cooling stone. As the last of the water drys up, the atmosphere thins \ + and spreads over your form, cooling the remaining lava against the hard vacuum of space. Left with a crushed rocky orb between your " + macro.footDesc() + ", you start slowly increasing the pressure on the planet, and feel as it goes from a rough sphere to a rapidly \ + crumbling pancake. The remaining rock grinds away to dust as you massage your mighty " + macro.soleDesc(true) + " against each other."; + } +}); + +rules["stomp"].push({ + "test": function(container, macro) { + return (hasAtleast(container, "Star", 1) || + hasAtleast(container, "Solar System", 1)) && + isFatal(macro); + }, "desc": function(container, macro, verbose, flat) { + return "You place your two " + length(macro.pawLength, unit, true) + " long " + macro.footDesc(true) + " around " + container.describe(verbose) + " and begin to squeeze " + (container.count > 1 ? "them" : "it") + " between your " + length(macro.pawWidth, unit, true) + " wide \ + " + macro.toeDesc(true) + ". The crushing gravity your " + macro.footDesc(true) + " generate is enough to vaporize your prey before your " + macro.toeDesc(true) + " even touch each other. As they come together, the energy crushes the remaining dust with enough pressure to form \ + new elements. Eventually nothing remains but the bottom of your " + macro.footDesc(true) + "."; + } +}); // ANAL VORE @@ -2173,6 +2543,133 @@ rules["anal-vore"].push({ } }); +//Cock Vore + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 1000 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You snatch " + container.describe(verbose) + " from the ground and shove them inside your " + macro.describeDick + ". With a sluurp you pull them deep into your shaft. You watch as the bulge in your manhood \ + gets pulled closer to your body by powerful clenches, until it vanishes into your " + pickString("throbbing","churning","eager","awaiting","heavy") + " balls."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 50000 && + macro.dickMass > 1000 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You pluck " + container.describe(verbose) + " from the ground and shove them against the head of your " + length(macro.dickDiameter, unit, true) + " wide " + macro.describeDick + ". They struggle to escape your grasp, while your cockslit \ + opens and devours them with a sluuurP. You watch as the squirming bulge in your manhood travels down your shaft until it vanishes into your " + pickString("throbbing","churning","eager","awaiting","heavy") + " balls."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 5000000 && + macro.dickMass > 50000 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "Your gigantic fingers reach down and grab " + container.describe(verbose) + ". Holding them in your iron grip, you raise them to your awaitng " + macro.describeDick + ". As they struggle to escape, your cockslit opens wide and envelops your prey. Once it has swallowed everything, it clamps down and pulls those unfortunate enough to be in your shaft deep inside,\ + packing down its meal with muffled snAps and CRRUnCHes. Enventually your prey reaches the base of your cock, and everything left gets shoved into your " + pickString("throbbing","churning","eager","awaiting","heavy") + " balls with a final mighty clench."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 1e9 && + macro.dickMass > 5000000 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You lay the " + length(macro.dickDiameter, unit, true) + " wide tip of your cock on the ground and thrust forward, filling your cock with " + container.describe(verbose) + ". The tip of your member bulges with its cargo. As you slowly clench to drag your prey into your bulging dick, the sensation of them rubbing against the inside of your cock causes you to release a glob of precum that lubricates your stretched passage. \ + After several more powerful clenches, you feel the bulge pass the halfway mark of your " + macro.describeDick + ". The speed of the bulge picks up, as the entirery of your captive prey has been thoughly lubricated. You feel them slide through your utethra, and shudder with anticipation as they approach your \ + " + pickString("throbbing","churning","eager","awaiting","heavy","mammoth") + " balls. Finally your meal reaches your body, and drops into your cum factories."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 1e14 && + macro.dickMass > 1e9 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You lay the " + length(macro.dickDiameter, unit, true) + " wide tip of your cock on the ground and grind it along the earth, ripping up the terrain and giving all in your path nowhere to go; except into your " + macro.describeDick + ". The colossal tip of your member bulges with " + container.describe(verbose) + ". As you slowly clench your mighty rod, you feel your prey shift and slide along the inside of your cum channel. \ + After a few more moments of pure pleasure, you feel the bulge pass the halfway mark of your tool. The speed of the bulge picks up, as the entirery of your captive prey has been compacted and lubricated by their journey. With every pull, a shudder of ecstasy goes up your spine, until those inside your cock finally reach their ultimate destination, \ + your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return macro.dickMass <= 1e19 && + macro.dickMass > 1e14 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the terrain and begin using your mammoth dick muscles to create a mighty wind, pulling in the surrounding landscape, ripping up the terrain and pulling it within your " + macro.describeDick + ". The colossal slit at the tip of your staff opens wide as buildings, trees, and everything else gets sucked inside\ + . You feel the prey sliding down your cock rub against your utethra as they pass through. You can even see some of the larger buildings as small, quick moving bulges within your manhood. After several minutes of sucking, your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls are filled by " + container.describe(verbose) + ". As you shift you cock off the ground, you \ + the satisfying weight of your prey bounce and jiggle within your sack."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return (macro.dickMass <= 1e23 || + nothingLarger(container, "Continent")) && + macro.dickMass > 1e19 && + container.count > 0; + + }, "desc": function(container, macro, verbose, flat) { + return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the planet and begin using your enourmous dick muscles to create a gigantic vacuum, pulling in the surrounding landscape, ripping up huge chunks of the terrain and pulling them inside your " + macro.describeDick + ". The ginormous gaping slit at the tip of your colossal dick opens wide as cities, rivers, lakes, and mountains vanish into your depths. \ + A steady stream of steady unbroken friction rubs against the inside of your mammoth tool, almost causing you to black out from pleasure. As your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls fill, you start slowing down your enormous contractions, until you have " + container.describe(verbose) + " captive within your stretched sack."; + } +}); + + +rules["cock-vore"].push({ + "test": function(container, macro) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + macro.dickGirth <= 2.5e14; + + }, "desc": function(container, macro, verbose, flat) { + return "You shove your " + length(macro.dickDiameter, unit, true) + " wide throbbing cockhead against the planet as your greedy slit stretches wide. The globe shudders and begins to slowly enters your stretched hole. As you get closer and closer to covering an entire hemisphere with \ + your " + macro.describeDick + ", you feel the pressure rise. Shoving the planet inside your cock takes more and more effort, until with a final shove, you feel your tip of your dick pass the center of the sphere, and hold it snug. You stop to squeeze your shaft, and feel how far it has been stretched outward.\ + You begin flexing your cock to bring the world fully inside your enourmous prick, and after a few more gulps, light ceases to fall on Earth. You help your cock along with its planetary feast by grabbing it and slowly pulling down the shaft, lodging the planet deeper, and deeper, and deeper within you.\ + After what seems like a lifetime of pleasure, the world finally reaches the base of your thick cock, and squeezes down into your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls. You reach down and touch your sack, feeling it digest " + container.describe(verbose) + "."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + macro.dickGirth > 2.5e14; + + }, "desc": function(container, macro, verbose, flat) { + return "You shove your " + length(macro.dickDiameter, unit, true) + " wide throbbing cockhead against the planet as your greedy slit stretches wide to envelop it. You feel it slowly enter your gaping hole and after a few massive clences of your " + macro.describeDick + ", light ceases to fall on Earth. \ + You run your fingers down you shaft, feeling the bulge, and massaging it along. The slurping of your cock pulls it toward your abdomen until it eventually runs out of length, and is squeezed down into your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls. You reach down and touch your sack, feeling it digest " + container.describe(verbose) + "."; + } +}); + +rules["cock-vore"].push({ + "test": function(container, macro) { + return hasAtleast(container, "Star", 1) || + hasAtleast(container, "Solar System", 1) + + }, "desc": function(container, macro, verbose, flat) { + return "You open your cumslit wide and let gravity fill your " + length(macro.dickDiameter, unit, true) + " wide throbbing cockhead with " + container.describe(verbose) + ". The tip of your cock closes and begins clenching to pull your prey deeper. \ + You run your fingers down your " + macro.describeDick + ", feeling it work its meal deeper within your shaft, and massaging it ensure everything inside continues towards your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls. \ + As your cock finishes its work, you feel the passage to your balls stretch wide, fill, and them empty as your balls fill, and begin the process of digestion."; + } +}); //Ball Smother //Balls weigh 1,000kg or less @@ -2461,8 +2958,6 @@ initial impact subsides you feel your enormous balls shift away from each other } }); -//cause night to fall over - //Balls Weigh 1e20 kg or less rules["ball-smother"].push({ @@ -2597,8 +3092,9 @@ rules["ball-smother"].push({ isGory(macro); }, "desc": function(container, macro, verbose, flat) { - return "The gravitational pull of your " + mass(macro.ballMass, unit, true) + " balls draw " + container.describe(verbose) + " into your sack, obliterating " + (container.count == 1 ? "it" : "them") + " with your " + length(macro.ballDiameter, unit, true) + " wide balls. The gravity each of your orbs tearing " + (container.count == 1 ? "it" : "them") + " asunder. The many fragments of the collision \ -expand outward before being pulled back against your groin. The debris spread across your sack, flattening and grinding until nothing remains but your colossal manhood."; + return "The gravitational pull of your " + mass(macro.ballMass, unit, true) + " balls draw " + container.describe(verbose) + " into your sack, obliterating " + (container.count == 1 ? "it" : "them") + " with \ + your " + length(macro.ballDiameter, unit, true) + " wide balls. The gravity each of your orbs tearing " + (container.count == 1 ? "it" : "them") + " asunder. The many fragments of the collision \ + expand outward before being pulled back against your groin. The debris spread across your sack, flattening and grinding until nothing remains but your colossal manhood."; } }); @@ -2609,7 +3105,306 @@ rules["ball-smother"].push({ isSadistic(macro); }, "desc": function(container, macro, verbose, flat) { - return "The gravitational pull of your " + mass(macro.ballMass, unit, true) + " balls draw " + container.describe(verbose) + " into your sack, decimating " + (container.count == 1 ? "it" : "them") + " with your " + length(macro.ballDiameter, unit, true) + " wide balls. The gravity each of your orbs ripping and tearing " + (container.count == 1 ? "it" : "them") + " asunder. The many fragments of the collision \ -expand outward before being pulled back against your groin. The debris spread across your sack, flattening and grinding until nothing remains but your colossal manhood."; + return "The gravitational pull of your " + mass(macro.ballMass, unit, true) + " balls draw " + container.describe(verbose) + " into your sack, decimating " + (container.count == 1 ? "it" : "them") + " with \ + your " + length(macro.ballDiameter, unit, true) + " wide balls. The gravity each of your orbs ripping and tearing " + (container.count == 1 ? "it" : "them") + " asunder. The many fragments of the collision \ + expand outward before being pulled back against your groin. The debris spread across your sack, flattening and grinding until nothing remains but your colossal manhood."; + } +}); + +//male orgasm + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " erupts, shoving " + container.describe(verbose) + " them into a wall and drowning them in a $VOLUME-torrent of cum."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " erupts, shoving " + container.describe(verbose) + " them into a wall; pinning them in place and suffocating them in a $VOLUME-torrent of cum."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " erupts, shoving " + container.describe(verbose) + " them into a wall; pinning them in place with a $VOLUME-torrent of cum. As they gasp for breath, your cum fills their lungs and stomach. \ +Their form falls lifeless on the ground once your cumshot has ended."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " convulses as it sprays $VOLUMEs of cum over " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " convulses as it sprays $VOLUMEs of cum over " + container.describe(verbose) + ", shoving your prey against a nearby building. As your stream tapers off, you see that none of your prey could withstand the pressure of your cumshot."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " convulses as it sprays $VOLUMEs of cum over " + container.describe(verbose) + ", shoving your prey against a nearby building. As your stream tapers off, you see that none of your prey could withstand the pressure of your \ + cumshot. The rubble and hardening cum covering the wall holds your victims in place against the structure."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " convulses as it sprays $VOLUMEs of cum over " + container.describe(verbose) + ", crushing your prey against a nearby building. As your stream tapers off, you see that none of your prey could withstand the pressure of your \ + cumshot. The rubble and red-dyed cum covering the wall holds your victims in place against the structure."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 500 && + spurtVolume > 50 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " twitches wildy as it sprays $VOLUMEs of cum into the air. A powerful white stream of musky fluid smashes into " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 500 && + spurtVolume > 50 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " twitches wildy as it sprays $VOLUMEs of cum into the air. A powerful white stream of musky fluid smashes into " + container.describe(verbose) + ", crushing and downing them at the same time."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 500 && + spurtVolume > 50 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " twitches wildy as it sprays $VOLUMEs of cum into the air. A powerful white stream of musky fluid smashes into " + container.describe(verbose) + ", compacting and mangling everything in its path. As your cumshot ends, \ + a thick stream of pink frothing fluids pours into nearby sewer drains, filling and clogging them."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 500 && + spurtVolume > 50 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " twitches wildy as it sprays $VOLUME of cum into the air. A powerful white stream of musky fluid smashes into " + container.describe(verbose) + ", compacting and mangling everything in its path. The sheer pressure propelling \ + your cum severs limbs and crumples steel. As your cumshot ends, a thick stream of pink frothing fluids pours into nearby sewer drains, filling and clogging them."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5000 && + spurtVolume > 500 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.ballDiameter + " balls bounce and your " + macro.describeDick + "begins to twitch uncontrollably. Moments later a $VOLUME shower of jism is lobbed into the air. The rain of cum flows into the street and carries away " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5000 && + spurtVolume > 500 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls bounce and your " + macro.describeDick + " begins to twitch uncontrollably. Moments later a $VOLUME shower of jism is lobbed into the air. The rain of cum flows into the street and carries away " + container.describe(verbose) + ".\ + Limbs and rubble float away on the jizz, vanishing into the storm drains and down the street."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5000 && + spurtVolume > 500 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls bounce and your " + macro.describeDick + " begins to twitch uncontrollably. Moments later a $VOLUME shower of jism is lobbed into the air. The rain of cum flows into the street and carries away " + container.describe(verbose) + ".\ + The torrent of jizz seeps away; leaving behind rubble and corpses."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5000 && + spurtVolume > 500 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls bounce and your " + macro.describeDick + " begins to twitch uncontrollably. Moments later a $VOLUME shower of jism is lobbed into the air. The rain of cum flows into the street and carries away " + container.describe(verbose) + ".\ + The torrent of jizz and blood seeps away; leaving behind rubble and corpses."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 5000 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls clench while your " + macro.describeDick + " bobs and spurts thick ropes of semen. $VOLUMEs of your splooge flood the area, enveloping " + container.describe(verbose) + "."; } }); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 5000 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls clench while your " + macro.describeDick + " bobs and spurts thick ropes of semen. $VOLUMEs of your splooge flood the area, enveloping " + container.describe(verbose) + " in a suffocating \ + wave of jizz."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 5000 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls clench while your " + macro.describeDick + " bobs and spurts thick ropes of semen. $VOLUMEs of your splooge flood the area, enveloping " + container.describe(verbose) + " in a suffocating \ + wave of jizz. The debris filled river of cum rages down the street, revealing more twisted steel and corpses with every building it brushes past."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 5000 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + length(macro.ballDiameter, unit, true) + " wide balls clench while your " + macro.describeDick + " bobs and spurts thick ropes of semen. $VOLUMEs of your splooge flood the area, enveloping " + container.describe(verbose) + " in a suffocating \ + wave of jizz. The debris filled river of cum and gore rages down the street, revealing more twisted steel and corpses with every building it brushes past."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum covers " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum smashes apart " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum smashes apart " + container.describe(verbose) + " as \ + it flies through air. Those caught in its path are smashed to pieces and dragged away the intense currents. The sheer volume of fluid overwelmes the sewers; you see cum spew from manholes and strom drains for several blocks."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum smashes apart " + container.describe(verbose) + " as \ + it flies through air. Those caught in its path are smashed to pieces and dragged away the intense currents. The sheer volume of fluid overwelmes the sewers; you see cum, gore, glass, and steel spew from manholes and strom drains for several blocks."; + } +}); + +//--------TODO LIST----- + +//cum for skyscraper cum for single macro + +//precum + +//musk + +//boobs + +//waste + +//reduce military presence + +//more interactions for donning/doffing shoes + +//smaller approx units + +//home planet rules + +//moon, dead planet, dwarf planet, asteroid, gas giant + +//stomping interactions based on different footwear + +//commerical vehicles + +//more objects on city/town continent scale(maybe countries) + +//make unit prefrencerance a saved value \ No newline at end of file From a27cc7dc60c1ea744f1361731d9723c77df2185e Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sun, 17 Mar 2019 22:18:39 -0400 Subject: [PATCH 08/44] Text additions 2 removed duplicate shaft after describeDick, fixed passthrough to "desc" in recursive-desc, added missing && operatores in some stomp text Improved some cockvore text added a bunch more male-orgasm test --- recursive-desc.js | 332 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 311 insertions(+), 21 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index 504ddb0..f280b3d 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -132,10 +132,10 @@ function describe(action, container, macro, verbose=true, flat=false, extra1=0) if (options.length > 0 && Math.random() > (1 / (2 + rules[action].length))) { let choice = Math.floor(Math.random() * options.length); - return options[choice](container, macro, verbose, flat, extra1); + return options[choice](container, macro, extra1); } else { - return getDefault(action)(container, macro, verbose, flat, extra1); + return getDefault(action)(container, macro, extra1); } } @@ -582,9 +582,9 @@ function defaultGrind(container, macro, verbose, flat) { var end = macro.arousalEnabled ? " to fuel your lust." : "."; var desc = container.count > 0 ? container.describe(verbose) + mid + end : "the ground."; if (macro.maleParts && macro.femaleParts) { - return "You grind your " + macro.describeDick + " cock and " + macro.describeVagina + " slit against " + desc; + return "You grind your " + macro.describeDick + " and " + macro.describeVagina + " slit against " + desc; } else if (macro.maleParts && !macro.femaleParts) { - return "You grind your " + macro.describeDick + " shaft against " + desc; + return "You grind your " + macro.describeDick + " against " + desc; } else if (!macro.maleParts && macro.femaleParts) { return "You grind your " + macro.describeVagina + " slit against " + desc; } else { @@ -2261,7 +2261,7 @@ rules["stomp"].push({ rules["stomp"].push({ "test": function(container, macro) { return macro.pawArea <= 1e7 && - macro.pawArea > 1000 + macro.pawArea > 1000 && isNonFatal(macro); }, "desc": function(container, macro, verbose, flat) { return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ @@ -2272,7 +2272,7 @@ rules["stomp"].push({ rules["stomp"].push({ "test": function(container, macro) { return macro.pawArea <= 1e7 && - macro.pawArea > 1000 + macro.pawArea > 1000 && isFatal(macro); }, "desc": function(container, macro, verbose, flat) { return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ @@ -2284,7 +2284,7 @@ rules["stomp"].push({ rules["stomp"].push({ "test": function(container, macro) { return macro.pawArea <= 1e7 && - macro.pawArea > 1000 + macro.pawArea > 1000 && isGory(macro); }, "desc": function(container, macro, verbose, flat) { return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ @@ -2296,7 +2296,7 @@ rules["stomp"].push({ rules["stomp"].push({ "test": function(container, macro) { return macro.pawArea <= 1e7 && - macro.pawArea > 1000 + macro.pawArea > 1000 && isSadistic(macro); }, "desc": function(container, macro, verbose, flat) { return "You lift your your colossal " + macro.footDesc() + " up and over " + container.describe(verbose) + ". With a sudden swiftness, you SLAM it down. Your " + macro.footDesc() + " shakes the ground and releases an audible BOOOOM.\ @@ -2613,9 +2613,9 @@ rules["cock-vore"].push({ container.count > 0; }, "desc": function(container, macro, verbose, flat) { - return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the terrain and begin using your mammoth dick muscles to create a mighty wind, pulling in the surrounding landscape, ripping up the terrain and pulling it within your " + macro.describeDick + ". The colossal slit at the tip of your staff opens wide as buildings, trees, and everything else gets sucked inside\ - . You feel the prey sliding down your cock rub against your utethra as they pass through. You can even see some of the larger buildings as small, quick moving bulges within your manhood. After several minutes of sucking, your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls are filled by " + container.describe(verbose) + ". As you shift you cock off the ground, you \ - the satisfying weight of your prey bounce and jiggle within your sack."; + return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the terrain and begin using your mammoth dick muscles to create a mighty wind, pulling in the surrounding landscape, ripping up the terrain and pulling it within your " + macro.describeDick + ". The colossal slit at the tip of your staff opens wide as buildings, trees, and everything else gets sucked inside.\ + You feel the prey sliding down your cock rub against your utethra as they pass through. You can even see some of the larger buildings as small, quick moving bulges within your manhood. After several minutes of sucking, your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls are filled by " + container.describe(verbose) + ". As you shift you cock off the ground, you \ + the satisfying weight of your prey bounce and jiggle within your sack."; } }); @@ -2627,8 +2627,8 @@ rules["cock-vore"].push({ container.count > 0; }, "desc": function(container, macro, verbose, flat) { - return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the planet and begin using your enourmous dick muscles to create a gigantic vacuum, pulling in the surrounding landscape, ripping up huge chunks of the terrain and pulling them inside your " + macro.describeDick + ". The ginormous gaping slit at the tip of your colossal dick opens wide as cities, rivers, lakes, and mountains vanish into your depths. \ - A steady stream of steady unbroken friction rubs against the inside of your mammoth tool, almost causing you to black out from pleasure. As your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls fill, you start slowing down your enormous contractions, until you have " + container.describe(verbose) + " captive within your stretched sack."; + return "You lay your " + length(macro.dickDiameter, unit, true) + " across member on the planet and begin using your enourmous dick muscles to vacuum in the surrounding landscape, ripping up huge chunks of the terrain and pulling them inside your " + macro.describeDick + ". The ginormous gaping slit at the tip of your colossal dick opens wide as cities, rivers, lakes, and mountains vanish into your depths. \ + A steady stream of unbroken friction rubs against the inside of your mammoth tool, almost causing you to black out from pleasure. As your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls fill, you start slowing down your enormous contractions, until you have " + container.describe(verbose) + " captive within your stretched sack."; } }); @@ -2640,7 +2640,7 @@ rules["cock-vore"].push({ macro.dickGirth <= 2.5e14; }, "desc": function(container, macro, verbose, flat) { - return "You shove your " + length(macro.dickDiameter, unit, true) + " wide throbbing cockhead against the planet as your greedy slit stretches wide. The globe shudders and begins to slowly enters your stretched hole. As you get closer and closer to covering an entire hemisphere with \ + return "You shove your " + length(macro.dickDiameter, unit, true) + " wide throbbing cockhead against the planet as your greedy slit stretches wide. The globe shudders and begins to slowly enter your stretched hole. As you get closer and closer to covering an entire hemisphere with \ your " + macro.describeDick + ", you feel the pressure rise. Shoving the planet inside your cock takes more and more effort, until with a final shove, you feel your tip of your dick pass the center of the sphere, and hold it snug. You stop to squeeze your shaft, and feel how far it has been stretched outward.\ You begin flexing your cock to bring the world fully inside your enourmous prick, and after a few more gulps, light ceases to fall on Earth. You help your cock along with its planetary feast by grabbing it and slowly pulling down the shaft, lodging the planet deeper, and deeper, and deeper within you.\ After what seems like a lifetime of pleasure, the world finally reaches the base of your thick cock, and squeezes down into your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls. You reach down and touch your sack, feeling it digest " + container.describe(verbose) + "."; @@ -3147,6 +3147,8 @@ Their form falls lifeless on the ground once your cumshot has ended."; } }); +//more than 5 and less than 50 + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 50 && @@ -3193,6 +3195,8 @@ rules["male-orgasm"].push({ } }); +//less than 5e2 + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 500 && @@ -3239,6 +3243,8 @@ rules["male-orgasm"].push({ } }); +//less than 5e3 + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 5000 && @@ -3286,6 +3292,8 @@ rules["male-orgasm"].push({ } }); +//less than 1e6 + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 1e6 && @@ -3333,6 +3341,8 @@ rules["male-orgasm"].push({ } }); +//less than 1e9 + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 1e9 && @@ -3363,7 +3373,7 @@ rules["male-orgasm"].push({ }, "desc": function(container, macro, spurtVolume) { return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum smashes apart " + container.describe(verbose) + " as \ - it flies through air. Those caught in its path are smashed to pieces and dragged away the intense currents. The sheer volume of fluid overwelmes the sewers; you see cum spew from manholes and strom drains for several blocks."; + it flies through air. Those caught in its path are smashed to pieces and dragged away by the intense current. The sheer volume of fluid overwelmes the sewers; you see cum spew from manholes and strom drains for several blocks."; } }); @@ -3375,13 +3385,291 @@ rules["male-orgasm"].push({ }, "desc": function(container, macro, spurtVolume) { return "You're cumming! Your " + macro.describeDick + " swells while your cumslit spews a massive unbroken river of semen. The twitching of your gargantuan cock sends your load in all directions. The mighty spurt of cum smashes apart " + container.describe(verbose) + " as \ - it flies through air. Those caught in its path are smashed to pieces and dragged away the intense currents. The sheer volume of fluid overwelmes the sewers; you see cum, gore, glass, and steel spew from manholes and strom drains for several blocks."; + it flies through air. Those caught in its path are smashed to pieces and dragged away by the intense current. The sheer volume of fluid overwelmes the sewers; you see cum, gore, glass, and steel spew from manholes and strom drains for several blocks."; } }); -//--------TODO LIST----- +//less than 1e12 + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " throbs as it fires $VOLUMEs of jizz into the sky. An enoumous sea of cum crashes out of the sky and onto " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " throbs as it fires $VOLUMEs of jizz into the sky. An enoumous sea of cum crashes out of the sky and splashes over " + container.describe(verbose) + " with more ferocity than the flood from a broken dam. \ + After the massive barrage lands, its viscously sloshes down the natural contours of the land, dragging trees and buildings deep into a nearby valley. The sheer volume of dirt and detritus that it picks up darkens the fluid into an opaque tide of frothing brown."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " throbs as it fires $VOLUMEs of jizz into the sky. An enoumous sea of cum crashes out of the sky and splashes over " + container.describe(verbose) + " with more ferocity than the flood from a broken dam. \ + After the massive barrage lands, its viscously sloshes down the natural contours of the land, dragging trees, people, animals, and buildings deep into a nearby valley. The sheer volume of dirt and detritus that it picks up darkens the fluid into an opaque tide of \ + frothing brown. You watch as the sticky mess flows away from you, leaving only the foundations of buildings and rocks in its bed."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " throbs as it fires $VOLUMEs of jizz into the sky. An enoumous sea of cum crashes out of the sky and splashes over " + container.describe(verbose) + " with more ferocity than the flood from a broken dam. \ + After the massive barrage lands, its viscously sloshes down the natural contours of the land, dragging trees, people, animals, and buildings deep into a nearby valley. The sheer volume of dirt and detritus that it picks up darkens the fluid into an opaque tide of \ + frothing brown. You watch as the sticky mess flows away from you, leaving only the foundations of buildings and rocks in its bed. The retreating semen also reveals the mangeled and drowned corpses of your victims."; + } +}); + +//less than 1e16 + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e16 && + spurtVolume > 1e12 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " jerks upawrds as it spews $VOLUMEs of semen in a wide arc that clips a nearby cloud. A white tsunami envelopes " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e16 && + spurtVolume > 1e12 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " jerks upawrds as it spews $VOLUMEs of semen in a wide arc that clips a nearby cloud. A white tsunami wipes out " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e16 && + spurtVolume > 1e12 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " jerks upawrds as it spews $VOLUMEs of semen in a wide arc that clips a nearby cloud. A white tsunami wipes out " + container.describe(verbose) + ". As the mighty wave crashes through city grids, it \ + moves with surprising speed, catching up to and destroying fleeing vehicles."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e16 && + spurtVolume > 1e12 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " jerks upawrds as it spews $VOLUMEs of semen in a wide arc that anniliates a flock of birds. A white tsunami wipes out " + container.describe(verbose) + ". As the mighty wave crashes through city grids, it \ + moves with surprising speed, catching up to and destroying fleeing vehicles. Your cum smashes dams, bridges, and erodes the land as it travels, cutting a deep channel the local rivers begin flowing into."; + } +}); + +//less than 5e19 + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e19 && + spurtVolume > 1e16 && + !hasAtleast(container, "Planet", 1) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " launches $VOLUMEs of frothing load into the atmosphere. As the ocean of cum lands, it washes over " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e19 && + spurtVolume > 1e16 && + !hasAtleast(container, "Planet", 1) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " launches $VOLUMEs of frothing load into the atmosphere. As the ocean of cum roars across the plaent, it smashes through " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e19 && + spurtVolume > 1e16 && + !!hasAtleast(container,"Planet", 1) && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " launches $VOLUMEs of frothing load into the atmosphere. As the ocean of cum roars across the plaent, it smashes through " + container.describe(verbose) + ". Everything your semen rolls across \ + is basted to smithereens as it carves a deep chasm. The destroyed buildings and people it swept along are deposited at the sides of the chasm, forming an unstable wall of gore and rubble."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e19 && + spurtVolume > 1e16 && + !hasAtleast(container,"Planet", 1) && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " launches $VOLUMEs of frothing load into the atmosphere. As the ocean of cum roars across the plaent, it smashes through " + container.describe(verbose) + ". Everything your semen rolls across \ + is basted to smithereens as it carves a deep gore lined chasm that extends from where it landed to the ocean. As it hits the ocean the resulting wave reverses the tide, dashes ships, and turns the water into an inhabitable murky soup. The destroyed \ + buildings and people it swept along are deposited at the bottom of the bay."; + } +}); + +//less than 1e25 + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e25 && + spurtVolume > 5e19 && + !hasAtleast(container,"Planet", 1) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! You open your " + macro.jawDesc(true) + " wide; letting out an earth-shattering roar while $VOLUMEs of cum explode out of your " + macro.describeDick + ". The colossal load sprays down on" + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e25 && + spurtVolume > 5e19 && + !hasAtleast(container,"Planet", 1) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! You open your " + macro.jawDesc(true) + " wide; letting out an earth-shattering roar while $VOLUMEs of cum explode out of your " + macro.describeDick + ". The colossal load punches through " + container.describe(verbose) + " without \ + even slowing down. Runing out of land to wash over, it sloshes to an ocean, sending huge waves of cum and seawater hundereds of feet into the sky."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e25 && + spurtVolume > 5e19 && + !hasAtleast(container,"Planet", 1) && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! You open your " + macro.jawDesc(true) + " wide; letting out an earth-shattering roar while $VOLUMEs of cum explode out of your " + macro.describeDick + ". The colossal load punches through " + container.describe(verbose) + " without \ + even slowing down. Runing out of land to wash over, it sloshes to an ocean, sending huge waves of cum and seawater hundereds of feet into the sky. As the thick goopy mix settles down, the increased volume causes tsunamis and floods over the entire globe."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e25 && + spurtVolume > 5e19 && + !hasAtleast(container,"Planet", 1) && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! You open your " + macro.jawDesc(true) + " wide; letting out an earth-shattering roar while $VOLUMEs of cum explode out of your " + macro.describeDick + ". The colossal load punches through " + container.describe(verbose) + " without \ + even slowing down. Runing out of land to wash over, it sloshes to an ocean, sending huge waves of cum and seawater hundereds of feet into the sky. Every ship sailing on that ocean is overwhelmed by the force and capsizes. As the thick goopy mix \ + settles down, the increased volume causes tsunamis and floods over the entire globe. The sticky white surface is coveved by dead marine life; schools of bloated tuna, giant squid, sharks, and whales."; + } +}); + +//cum envelops planet + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your reach down and aim your " + macro.describeDick + " at a nearby planet. $VOLUMEs of semen are flung into space, where they contact and completly cover " + container.describe(verbose) + "."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your reach down and aim your " + macro.describeDick + " at a nearby planet. $VOLUMEs of semen wash over " + container.describe(verbose) + ". The once green globe is now a sloshing white ocean of sticky cum."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your reach down and aim your " + macro.describeDick + " at a nearby planet. $VOLUMEs of semen wash over " + container.describe(verbose) + ". When your seed splashes over the surface, it instantly crushes and \ + wipes away an entire civilization. The once green globe is now a sloshing white ocean of sticky cum."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasExactly(container, "Planet", 1) && + hasOnly(container, ["Planet"]) && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your reach down and aim your " + macro.describeDick + " at a nearby planet. $VOLUMEs of semen wash over " + container.describe(verbose) + ". Your seed crashes into the center of the globe and creads outward, \ + slowly enveloping the world. As it spreads through the oceans and continents in a " + length((Math.pow(spurtVolume, 1/3)*.5), unit, true) + " high wave, it instantly crushes and wipes away an entire civilization. The once green globe \ + is now a sloshing white ocean of sticky cum."; + } +}); -//cum for skyscraper cum for single macro +//cum larger than planet + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return (hasAtleast(container, "Star", 1) || + hasAtleast(container, "Solar System", 1)) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " expells a $VOLUME cumshot into deep space. As it floats away, the gravity it generates pulls " + container.describe(verbose) + " inside of the sticky fluid."; + } +}); + +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return (hasAtleast(container, "Star", 1) || + hasAtleast(container, "Solar System", 1)) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " expells a $VOLUME cumshot into deep space. As it floats away, the gravity it generates traps " + container.describe(verbose) + " inside of the sticky fluid forever."; + } +}); + + +//--------TODO LIST----- //precum @@ -3391,8 +3679,6 @@ rules["male-orgasm"].push({ //waste -//reduce military presence - //more interactions for donning/doffing shoes //smaller approx units @@ -3407,4 +3693,8 @@ rules["male-orgasm"].push({ //more objects on city/town continent scale(maybe countries) -//make unit prefrencerance a saved value \ No newline at end of file +//clean up growth with make/break sphere, circle, rect, and cube + +//make unit prefrencerance a saved value + +//cum for skyscraper : cum for single macro \ No newline at end of file From b12b326e7d10006e974a05a34e034941e04bf4d3 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sun, 17 Mar 2019 23:57:10 -0400 Subject: [PATCH 09/44] Precum backbone changes changed precum volume text to singular and added a single level of precum descriptive text. also added nonfatal orgasm option for sinlge person --- game.js | 2 +- recursive-desc.js | 70 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/game.js b/game.js index 00bc292..a9bcdab 100644 --- a/game.js +++ b/game.js @@ -2993,7 +2993,7 @@ function male_spurt(vol, active=true) let area = Math.pow(vol, 2/3); let prey = getPrey(biome, area); - let line = describe("male-spurt", prey, macro, verbose, flat).replace("$VOLUME",volume(vol,unit,false)); + let line = describe("male-spurt", prey, macro, verbose, flat, vol).replace("$VOLUME",volume(vol,unit,true)); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); diff --git a/recursive-desc.js b/recursive-desc.js index f280b3d..bb77a39 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -539,11 +539,11 @@ function defaultBallSmother(container, macro, verbose, flat) { function defaultMaleSpurt(container, macro, verbose, flat) { if (container.count == 0) - return "Your " + macro.describeDick + " spews $VOLUME of bitter precum."; + return "Your " + macro.describeDick + " spews $VOLUMEs of bitter precum."; else if (isFatal(macro)) - return "Your " + macro.describeDick + " spurts out bitter precum, drowning " + container.describe(verbose) + " in $VOLUME of slick musky fluid."; + return "Your " + macro.describeDick + " spurts out bitter precum, drowning " + container.describe(verbose) + " in $VOLUMEs of slick musky fluid."; else - return "Your " + macro.describeDick + " spurts precum, splooging " + container.describe(verbose) + " in $VOLUME of slick musky fluid."; + return "Your " + macro.describeDick + " spurts precum, splooging " + container.describe(verbose) + " in $VOLUMEs of slick musky fluid."; } function defaultMaleOrgasm(container, macro, verbose, flat) { @@ -3113,6 +3113,17 @@ rules["ball-smother"].push({ //male orgasm +rules["male-orgasm"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You're cumming! Your " + macro.describeDick + " erupts, hosing down " + container.describe(verbose) + " with $VOLUME of your seed."; + } +}); + rules["male-orgasm"].push({ "test": function(container, macro, spurtVolume) { return hasOnly(container, ["Person"]) && @@ -3668,10 +3679,59 @@ rules["male-orgasm"].push({ } }); +//precum-male +//contians a person + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum sprays from your " + macro.describeDick + ". The musky stream covers " + container.describe(verbose) + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum leaks from your " + macro.describeDick + ". The musky stream covers " + container.describe(verbose) + ", drowing them."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum leaks from your " + macro.describeDick + ". The musky stream falls over the shoulders of " + container.describe(verbose) + ", knocking them unconsious. They fall face down in the puddle and slowly drown in your pre."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "You grab " + container.describe(verbose) + " and hold their face against your " + length(macro.dickDiameter,unit, true) + " wide cockhead. $VOLUMEs of precum leaks from your " + macro.describeDick + " and down their streched throat. The musky \ + discarge fills their lungs and stomach, until your precum runs out of room and begins to leak out of your victim's nose and eyeballs. You drop your toy, watching them fall to the ground and try to cough up the suffocating fluid. Pre pours from their \ + mouth, while they slump over and die."; + } +}); + //--------TODO LIST----- -//precum +//precum "male-spurt" //musk @@ -3697,4 +3757,4 @@ rules["male-orgasm"].push({ //make unit prefrencerance a saved value -//cum for skyscraper : cum for single macro \ No newline at end of file +//cum text for skyscraper : cum text for single macro \ No newline at end of file From 88db41b7d0c86ea3de05392a28c79d72c2a37996 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Mon, 18 Mar 2019 20:59:29 -0400 Subject: [PATCH 10/44] Small Text additioin 3 fixed duplicate a in chewing text, added some more precum text. --- recursive-desc.js | 52 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index bb77a39..92e2ef1 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -1996,7 +1996,7 @@ rules["chew"].push({ isGory(macro) && macro.height < 5; }, "desc": function(container, macro, verbose, flat) { - return "You tackle a " + container.describe(verbose) + " and dig into your meal, powerful " + macro.jawDesc(true) + " ripping them to shreds in seconds. You wolf down great mouthfuls \ + return "You tackle " + container.describe(verbose) + " and dig into your meal, powerful " + macro.jawDesc(true) + " ripping them to shreds in seconds. You wolf down great mouthfuls \ of meat, consuming them in a terrifying frenzy that ends with naught but bones lying on the ground."; } }); @@ -2008,7 +2008,7 @@ rules["chew"].push({ isGory(macro) && macro.height >= 5; }, "desc": function(container, macro, verbose, flat) { - return "You snatch up a " + container.describe(verbose) + ", then stuff their lower body into the guillotine that is your ravenous maw - slicing off their legs with \ + return "You snatch up " + container.describe(verbose) + ", then stuff their lower body into the guillotine that is your ravenous maw - slicing off their legs with \ a single disgusting crunch, then finishing them off with another ravenous bite that obliterates their torso. Their bleeding head falls from your lips, only to be \ caught between two fingers and popped back in to be crunched between molars and swallowed."; } @@ -3728,6 +3728,54 @@ rules["male-spurt"].push({ } }); +//more than 5 and less than 50 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes over " + container.describe(verbose) + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes down the street and \ + pours into an nearby stromdrain."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 50 && + spurtVolume > 5 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ + " + pickSting("intestines","gore","organs") + " down the street and into an nearby stromdrain."; + } +}); + //--------TODO LIST----- From 5e376c740bc5c66a00c77ebfda790d6fa837b07d Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Tue, 19 Mar 2019 00:59:24 -0400 Subject: [PATCH 11/44] Text Addtion 4(precum) More precum text additions --- recursive-desc.js | 87 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index 92e2ef1..7e77e78 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -3737,7 +3737,7 @@ rules["male-spurt"].push({ isNonFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes over " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes over " + container.describe(verbose) + "."; } }); @@ -3748,7 +3748,7 @@ rules["male-spurt"].push({ isFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + "."; } }); @@ -3759,8 +3759,8 @@ rules["male-spurt"].push({ isGory(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes down the street and \ - pours into an nearby stromdrain."; + return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes down the street and \ + pours into a nearby stromdrain."; } }); @@ -3771,11 +3771,84 @@ rules["male-spurt"].push({ isSadistic(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + macro.dickDiameter() + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ - " + pickSting("intestines","gore","organs") + " down the street and into an nearby stromdrain."; + return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ + " + pickSting("intestines","gore","organs") + " down the street and into a nearby stromdrain."; } }); +//less than 5e2 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e2 && + spurtVolume > 50 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum flow out of your urethra, soaking " + container.describe(verbose) + " and filling the air with your musk."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e2 && + spurtVolume > 50 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e2 && + spurtVolume > 50 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden sweLl of the fluid. Their floating \ + corpses dyeing the fluid a dark red."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 5e2 && + spurtVolume > 50 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden sweLl of the fluid. Their floating \ + corpses slowly break apart; dyeing the fluid a dark red."; + } +}); + +//less than 1e4 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e4 && + spurtVolume > 5e2 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.describeDick + " spews $VOLUMEs of precum, dousing " + container.describe(verbose) + " with your emmisions."; + } +}); + +//less than 1e6 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 1e4 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + "."; + } +}); //--------TODO LIST----- @@ -3785,7 +3858,7 @@ rules["male-spurt"].push({ //boobs -//waste +//waste "marking territory" //more interactions for donning/doffing shoes From 5c8557ae561626d75b0c6118828e380e2b610b35 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Tue, 19 Mar 2019 01:00:52 -0400 Subject: [PATCH 12/44] Text addition 5(precum) more precum text --- recursive-desc.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index 7e77e78..a5fcf00 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -3737,7 +3737,7 @@ rules["male-spurt"].push({ isNonFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes over " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes over " + container.describe(verbose) + "."; } }); @@ -3748,7 +3748,7 @@ rules["male-spurt"].push({ isFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + "."; } }); @@ -3759,7 +3759,7 @@ rules["male-spurt"].push({ isGory(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes down the street and \ + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes down the street and \ pours into a nearby stromdrain."; } }); @@ -3771,8 +3771,8 @@ rules["male-spurt"].push({ isSadistic(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + "wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ - " + pickSting("intestines","gore","organs") + " down the street and into a nearby stromdrain."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ + " + pickSting("intestines","gore","organs") + " down the street and into a nearby stormdrain."; } }); @@ -3807,8 +3807,8 @@ rules["male-spurt"].push({ isGory(macro); }, "desc": function(container, macro, spurtVolume) { - return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden sweLl of the fluid. Their floating \ - corpses dyeing the fluid a dark red."; + return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden swell of the fluid. Their floating \ + corpses dye the fluid a dark red."; } }); @@ -3819,7 +3819,7 @@ rules["male-spurt"].push({ isSadistic(macro); }, "desc": function(container, macro, spurtVolume) { - return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden sweLl of the fluid. Their floating \ + return "$VOLUMEs of precum flow out of your urethra, trapping " + container.describe(verbose) + " within a pond of your pre-ejaculate. Those unlucky enough to be in the way are crushed by the sudden swell of the fluid. Their floating \ corpses slowly break apart; dyeing the fluid a dark red."; } }); From 85721c00cad876815157ff24dcdc41c3d61fcbe2 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Wed, 20 Mar 2019 01:05:20 -0400 Subject: [PATCH 13/44] text addition 6(precum) Added precum text up to 1e6 volume --- recursive-desc.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/recursive-desc.js b/recursive-desc.js index a5fcf00..388e8b6 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -3837,6 +3837,39 @@ rules["male-spurt"].push({ } }); +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e4 && + spurtVolume > 5e2 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.describeDick + " spews $VOLUMEs of precum, smothering " + container.describe(verbose) + " with your emmisions."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e4 && + spurtVolume > 5e2 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.describeDick + " spews $VOLUMEs of precum, smothering " + container.describe(verbose) + " with your emmisions. The slick fluid doesn't instanstly kill your prey; they attmept to crawl out of it while gasping and choking."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e4 && + spurtVolume > 5e2 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + macro.describeDick + " spews $VOLUMEs of precum, smothering " + container.describe(verbose) + " with your emmisions. The slick fluid ozzes over your prey, soaking and shoving them into the mud. \ + You watch as they gasp and choke inside their liquid prison; unsucessefully attempting to crawl out."; + } +}); //less than 1e6 rules["male-spurt"].push({ @@ -3850,6 +3883,53 @@ rules["male-spurt"].push({ } }); +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 1e4 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 1e4 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is obliterated."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 1e4 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e6 && + spurtVolume > 1e4 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses. A mix of pre-ejaculate, blood, and nuggest of flesh flow away from the area; a grisly warning that shows what happens to those in your way."; + } +}); + //--------TODO LIST----- //precum "male-spurt" @@ -3878,4 +3958,8 @@ rules["male-spurt"].push({ //make unit prefrencerance a saved value -//cum text for skyscraper : cum text for single macro \ No newline at end of file +//cum text for skyscraper : cum text for single macro + +//powerplants factories + +//anal vore test "ring seals to the ground and pulls in" usde weight of rear to pull in mroe mass \ No newline at end of file From f5a818f57213c5df97ca7eab949204924518ca57 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Thu, 15 Aug 2019 19:10:39 -0400 Subject: [PATCH 14/44] TypoFixes and makeSphere Fixed some typos and added the makeSphere and breakSphere functions --- recursive-desc.js | 69 ++++++++++++++++++++++++++++++++++++----------- units.js | 16 +++++++++++ 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index 388e8b6..ec07fc6 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -2588,7 +2588,7 @@ rules["cock-vore"].push({ }, "desc": function(container, macro, verbose, flat) { return "You lay the " + length(macro.dickDiameter, unit, true) + " wide tip of your cock on the ground and thrust forward, filling your cock with " + container.describe(verbose) + ". The tip of your member bulges with its cargo. As you slowly clench to drag your prey into your bulging dick, the sensation of them rubbing against the inside of your cock causes you to release a glob of precum that lubricates your stretched passage. \ - After several more powerful clenches, you feel the bulge pass the halfway mark of your " + macro.describeDick + ". The speed of the bulge picks up, as the entirery of your captive prey has been thoughly lubricated. You feel them slide through your utethra, and shudder with anticipation as they approach your \ + After several more powerful clenches, you feel the bulge pass the halfway mark of your " + macro.describeDick + ". The speed of the bulge picks up, as the entirety of your captive prey has been thoughly lubricated. You feel them slide through your utethra, and shudder with anticipation as they approach your \ " + pickString("throbbing","churning","eager","awaiting","heavy","mammoth") + " balls. Finally your meal reaches your body, and drops into your cum factories."; } }); @@ -2601,7 +2601,7 @@ rules["cock-vore"].push({ }, "desc": function(container, macro, verbose, flat) { return "You lay the " + length(macro.dickDiameter, unit, true) + " wide tip of your cock on the ground and grind it along the earth, ripping up the terrain and giving all in your path nowhere to go; except into your " + macro.describeDick + ". The colossal tip of your member bulges with " + container.describe(verbose) + ". As you slowly clench your mighty rod, you feel your prey shift and slide along the inside of your cum channel. \ - After a few more moments of pure pleasure, you feel the bulge pass the halfway mark of your tool. The speed of the bulge picks up, as the entirery of your captive prey has been compacted and lubricated by their journey. With every pull, a shudder of ecstasy goes up your spine, until those inside your cock finally reach their ultimate destination, \ + After a few more moments of pure pleasure, you feel the bulge pass the halfway mark of your tool. The speed of the bulge picks up, as the entirety of your captive prey has been compacted and lubricated by their journey. With every pull, a shudder of ecstasy goes up your spine, until those inside your cock finally reach their ultimate destination, \ your " + pickString("throbbing","churning","eager","awaiting","heavy", "mammoth") + " balls."; } }); @@ -3772,7 +3772,7 @@ rules["male-spurt"].push({ }, "desc": function(container, macro, spurtVolume) { return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead throbs, releasing $VOLUMEs of pre. The pungent glob spashes onto the street; crushing " + container.describe(verbose) + ". The bloodstained pool of precum washes broken glass and \ - " + pickSting("intestines","gore","organs") + " down the street and into a nearby stormdrain."; + " + pickString("intestines","gore","organs") + " down the street and into a nearby stormdrain."; } }); @@ -3870,6 +3870,7 @@ rules["male-spurt"].push({ You watch as they gasp and choke inside their liquid prison; unsucessefully attempting to crawl out."; } }); + //less than 1e6 rules["male-spurt"].push({ @@ -3879,7 +3880,7 @@ rules["male-spurt"].push({ isNonFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe() + "."; } }); @@ -3887,10 +3888,11 @@ rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 1e6 && spurtVolume > 1e4 && - isNonFatal(macro); + isFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + "."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe() + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is obliterated."; } }); @@ -3898,11 +3900,11 @@ rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 1e6 && spurtVolume > 1e4 && - isFatal(macro); + isGory(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ - pre ensures that the area where it lands is obliterated."; + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe() + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses."; } }); @@ -3910,23 +3912,60 @@ rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { return spurtVolume <= 1e6 && spurtVolume > 1e4 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe() + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses. A mix of pre-ejaculate, blood, and nuggest of flesh flow away from the area; a grisly warning that shows what happens to those in your way."; + } +}); + +//less than 1e9 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, slicking your " + macro.describeDick + " and raining on " + container.describe() + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, slicking your " + macro.describeDick + " and flooding out " + container.describe() + ". Each massive drop of your fluid creates a crater and resulting lake when they land,\ + saturating the area with the proof of your passion."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && isGory(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ - pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses."; + return "$VOLUMEs of pre sloshes out of your gaping cockslit, slicking your " + macro.describeDick + " and flooding out " + container.describe() + ". Each massive drop of your fluid crushes buildings, creating a crater and resulting lake \ + when they land, saturating the rubble with the signs of your passion."; } }); rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { - return spurtVolume <= 1e6 && - spurtVolume > 1e4 && + return spurtVolume <= 1e9 && + spurtVolume > 1e6 && isSadistic(macro); }, "desc": function(container, macro, spurtVolume) { - return "Your " + length(macro.dickDiameter, unit, true) + " wide cockhead bulges as it pushes out $VOLUMEs of precum, tossing the clear fluid over " + container.describe(verbose) + ". The speed and sheer mass of the falling \ - pre ensures that the area where it lands is converted to a musky mudpit filled with rubble and corpses. A mix of pre-ejaculate, blood, and nuggest of flesh flow away from the area; a grisly warning that shows what happens to those in your way."; + return "$VOLUMEs of pre sloshes out of your gaping cockslit, slicking your " + macro.describeDick + " and flooding out " + container.describe() + ". Each massive drop of your fluid crushes buildings and creats a crater when they land, \ + saturating the rubble with a lake of your passion. Those that narrowly escaped the initial splash flail about helplessly in the slick mud until they eventually tire out and suffocate."; } }); diff --git a/units.js b/units.js index f502b39..c3bb924 100644 --- a/units.js +++ b/units.js @@ -400,3 +400,19 @@ function approxVolume(m3, singular=false) { return volume + (singular || volume == 1 ? " Sun" : " Suns"); } } + + +function makeSphere(input=0, diameter=false) { + if (diameter = true) { + input = input/2; + } + return (4/3)*Math.PI*(Math.pow(input, 3)); +} + +function breakSphere(input=0, diameter=false) { + let output = math.pow((3*input)/(4*Math.PI), 1/3) + if (diameter=true) { + output = output*2; + } + return output; +} From ab7443f230470435535df5708a23d7609bc3df5b Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sat, 17 Aug 2019 13:46:45 -0400 Subject: [PATCH 15/44] Remove School Bus Removed the school bus option from bus and improved orginization of recursive-macro with comments --- recursive-macro.js | 77 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/recursive-macro.js b/recursive-macro.js index 6aba238..e7b9217 100644 --- a/recursive-macro.js +++ b/recursive-macro.js @@ -3,21 +3,28 @@ var things = { "Container": Container, + +//Creatures "Person": Person, "Human": Human, "Cow": Cow, + "Micro": Micro, + "Macro": Macro, +//Vehicles "Empty Car": EmptyCar, "Car": Car, "Bus": Bus, "Tram": Tram, + "Train": Train, + "Train Car": TrainCar, +//Buildings "House": House, "Business": Business, "Barn": Barn, "Small Skyscraper": SmallSkyscraper, "Large Skyscraper": LargeSkyscraper, - "Train": Train, - "Train Car": TrainCar, "Parking Garage": ParkingGarage, +//Places "Town": Town, "City": City, "Continent": Continent, @@ -28,12 +35,11 @@ var things = "Cluster": Cluster, "Universe": Universe, "Multiverse": Multiverse, +//Military "Soldier": Soldier, "Tank": Tank, "Artillery": Artillery, "Helicopter": Helicopter, - "Micro": Micro, - "Macro": Macro, "Squad": Squad, "Platoon": Platoon, "Company": Company, @@ -47,20 +53,26 @@ var things = var areas = { "Container": 0, +//Creatures "Person": 0.33, "Human": 0.33, "Cow": 2, + "Micro": 0.05, + "Macro": 100, +//Vehicles "Car": 4, "Bus": 12, "Tram": 20, + "Train": 40, + "Train Car": 20, +//Buildings "House": 150, "Business": 400, "Barn": 300, "Small Skyscraper": 1000, "Large Skyscraper": 2000, - "Train": 40, - "Train Car": 20, "Parking Garage": 750, +//Places "Town": 1e7, "City": 1e9, "Continent": 1.5e13, @@ -71,12 +83,11 @@ var areas = "Cluster": 2e49, "Universe": 7e53, "Multiverse": 5e56, +//Military "Soldier": 1, "Tank": 10, "Artillery": 12, "Helicopter": 8, - "Micro": 0.05, - "Macro": 100, "Squad": 20, "Platoon": 100, "Company": 500, @@ -90,20 +101,26 @@ var areas = var masses = { "Container": 0, +//Creatures "Person": 80, "Human": 80, "Cow": 300, + "Micro": 0.01, + "Macro": 80000, +//Vehicles "Car": 1000, "Bus": 5000, "Tram": 10000, + "Train": 50000, + "Train Car": 7500, +//Buildings "House": 10000, "Business": 50000, "Barn": 5000, "Small Skyscraper": 10000000, "Large Skyscraper": 80000000, - "Train": 50000, - "Train Car": 7500, "Parking Garage": 10000000, +//Places "Town": 1, "City": 1, "Continent": 1e21, @@ -114,12 +131,11 @@ var masses = "Cluster": 1, "Universe": 1, "Multiverse": 1, +//Military "Soldier": 80, "Tank": 5000, "Artillery": 7000, "Helicopter": 1500, - "Micro": 0.01, - "Macro": 80000, "Squad": 1, "Platoon": 100, "Company": 500, @@ -133,20 +149,26 @@ var masses = var clusters = { "Container": 0, +//Creatures "Person": 5, "Human": 5, "Cow": 15, + "Micro": 10, + "Macro": 0, +//Vehicles "Car": 3, "Bus": 1, "Tram": 1, + "Train": 2, + "Train Car": 1, +//Buildings "House": 5, "Business": 5, "Barn": 1, "Small Skyscraper": 2, "Large Skyscraper": 1, - "Train": 2, - "Train Car": 1, "Parking Garage": 1, +//Places "Town": 5, "City": 1, "Continent": 5, @@ -157,12 +179,11 @@ var clusters = "Cluster": 1, "Universe": 1, "Multiverse": 1, +//Military "Soldier": 0, "Tank": 0, "Artillery": 0, "Helicopter": 0, - "Micro": 10, - "Macro": 0, "Squad": 20, "Platoon": 2, "Company": 2, @@ -176,20 +197,26 @@ var clusters = var cluster_chances = { "Container": 0, +//Creatures "Person": 0.8, "Human": 0.8, "Cow": 0.5, + "Micro": 10, + "Macro": 0, +//Vehicles "Car": 0.5, "Bus": 0.25, "Tram": 0.2, + "Train": 0.1, + "Train Car": 0.05, +//Buildings "House": 0.5, "Business": .05, "Barn": 0.1, "Small Skyscraper": 0.25, "Large Skyscraper": 0.25, - "Train": 0.1, - "Train Car": 0.05, "Parking Garage": 0.1, +//Places "Town": 0.1, "City": 0.2, "Continent": 0.5, @@ -200,12 +227,11 @@ var cluster_chances = "Cluster": 1, "Universe": 1, "Multiverse": 1, +//Military "Soldier": 0, "Tank": 0, "Artillery": 0, "Helicopter": 0, - "Micro": 10, - "Macro": 0, "Squad": .05, "Platoon": .05, "Company": .1, @@ -219,20 +245,26 @@ var cluster_chances = var contents = { "Container": [], +//Creatures "Person": [], "Human": [], "Cow": [], + "Micro": [[]], + "Macro": [[]], +//Vehicles "Car": [["Person",1,4]], "Bus": [["Person",2,30]], "Tram": [["Person",10,50]], "Train": [["Person",1,4,"engine"],["Train Car",2,10]], "Train Car": [["Person",10,40]], +//Buildings "House": [["Person",0,8],["Empty Car",0,2]], "Business": [["Person",0,30],["Car",0,20]], "Barn": [["Person",0,2],["Cow",30,70]], "Small Skyscraper": [["Person",150,750],["Empty Car",10,50]], "Large Skyscraper": [["Person",500,1500],["Empty Car",20,100]], "Parking Garage": [["Person",10,200],["Empty Car",100,300],["Car",5,30]], +//Places "Town": [["Person",10000,100000],["House",5000,50000],["Empty Car",200,800],["Car",500,80000],["Bus",5,25],["Train",5,25],["Business",500,5000]], "City": [["Person",100000,1500000],["House",20000,200000],["Empty Car",10000,100000],["Car",7500,125000],["Bus",200,400],["Train",10,50],["Tram",25,100],["Small Skyscraper",50,300],["Large Skyscraper",10,75],["Parking Garage",5,10],["Business",2000,10000]], "Continent": [["Person",1000000,15000000],["House",2500,10000],["Car",25000,375000],["Train",50,500],["Town",500,1000],["City",50,250],["Business",250,1000]], @@ -243,12 +275,11 @@ var contents = "Cluster": [["Galaxy",200,5000]], "Universe": [["Cluster",1.5e9,2.5e9]], "Multiverse": [["Universe",100,1000]], +//Military "Soldier": [], "Tank": [["Soldier",3,5]], "Artillery": [["Soldier",4,6]], "Helicopter": [["Soldier",4,16]], - "Micro": [[]], - "Macro": [[]], //Alterante Army Structuring, may be used later //"Squad": [["Soldier",6,9]], // "Platoon": [["Squad",3,4]], @@ -861,7 +892,7 @@ function Bus(count = 1) { this.describeOne = function(verbose=true) { var adjective = random_desc(["rusty","brand-new","aging","modern"], (verbose ? 0.3 : 0)); var color = random_desc(["black","tan","gray"], (verbose ? 1 : 0)); - var type = random_desc(["bus","school bus","double-decker bus","articulating bus","open-top bus","sleeper bus","intercity bus"]); + var type = random_desc(["bus","double-decker bus","articulating bus","open-top bus","sleeper bus","intercity bus"]); return "a " + merge_desc([adjective,color,type]); }; From 455297eeace67867051b5ea5025137334f3b89d0 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sun, 1 Dec 2019 01:47:40 -0500 Subject: [PATCH 16/44] Text Additions 7(precum)+fixes Fixed some typos. Added more precum text --- recursive-desc.js | 59 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/recursive-desc.js b/recursive-desc.js index ec07fc6..9a5fc3a 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -3680,7 +3680,7 @@ rules["male-orgasm"].push({ }); //precum-male -//contians a person +//contains a person rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { @@ -3920,7 +3920,9 @@ rules["male-spurt"].push({ } }); -//less than 1e9 + + +//less than 1e12 rules["male-spurt"].push({ "test": function(container, macro, spurtVolume) { @@ -3929,7 +3931,7 @@ rules["male-spurt"].push({ isNonFatal(macro); }, "desc": function(container, macro, spurtVolume) { - return "$VOLUMEs of pre sloshes out of your gaping cockslit, slicking your " + macro.describeDick + " and raining on " + container.describe() + "."; + return "$VOLUMEs of pre rages out of your cavernous urethra, slicking your " + macro.describeDick + " and raining on " + container.describe() + "."; } }); @@ -3969,6 +3971,55 @@ rules["male-spurt"].push({ } }); +//less than 1e12 + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isNonFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, lubricating your " + macro.describeDick + " and splashing over " + container.describe() + "."; + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isFatal(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, lubricating your " + macro.describeDick + " and engulfing " + + container.describe() + ". Waves of your pre carve out new canyons and " + pickString("overwhelm a dam in the distance.","swell the rivers into a frothy tide.","form a lake of lust"); + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isGory(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, lubricating your " + macro.describeDick + " and engulfing " + + container.describe() + ". Waves of your pre carve out new canyons and " + pickString("overwhelm a dam, flooding a town with a soup of mud, pre, bodies, and rubble.","swell the rivers into a frothy tide that smashes boats and buildings apart.","turn a farming valley into a lake of of gore and lust"); + } +}); + +rules["male-spurt"].push({ + "test": function(container, macro, spurtVolume) { + return spurtVolume <= 1e12 && + spurtVolume > 1e9 && + isSadistic(macro); + + }, "desc": function(container, macro, spurtVolume) { + return "$VOLUMEs of pre sloshes out of your gaping cockslit, lubricating your " + macro.describeDick + " and engulfing " + + container.describe() + ". As your fluid flows across the land, small splashes of red along its edge mark bodies being pulverized."; + } +}); + //--------TODO LIST----- //precum "male-spurt" @@ -4001,4 +4052,4 @@ rules["male-spurt"].push({ //powerplants factories -//anal vore test "ring seals to the ground and pulls in" usde weight of rear to pull in mroe mass \ No newline at end of file +//anal vore test "ring seals to the ground and pulls in" usde weight of rear to pull in more mass \ No newline at end of file From 934aa28f8f34d1af400c8124b4df08a91a475448 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sun, 1 Dec 2019 01:49:20 -0500 Subject: [PATCH 17/44] Walk between Biomes Updated menu with toggle for walking between biomes added ability to walk from one biome to another added some text regarding biomes --- features.js | 13 ++++++++++--- game.js | 49 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/features.js b/features.js index e038fcb..a96df47 100644 --- a/features.js +++ b/features.js @@ -626,14 +626,15 @@ options = [ ] }, { - "name": "Difficulty", + "name": "Gameplay", "optional": false, "entries": [ - { + { "type": "radio", "id": "difficulty", "default": "0", + "tooltip": "Grow how you want, when you want.", "choices": [ { @@ -676,7 +677,13 @@ options = [ "tooltip": "If you're ten times bigger than normal, you gain ten times as much mass when digesting prey" } ] - } + }, + { + "name": "Walk to other locations", + "id": "changingBiomes", + "type": "checkbox", + "tooltip": "When checked, walking will sometimes change your location." + }, ] }, { diff --git a/game.js b/game.js index a9bcdab..7df032f 100644 --- a/game.js +++ b/game.js @@ -34,6 +34,10 @@ let autoVerbose = true; let biome = "city"; +let biomeSize = 3000; + +let position = 0; + let newline = " "; let victims = {}; @@ -431,7 +435,7 @@ let macro = return (this.tailCount > 1 ? "tails" : "tail"); }, get arousalDickFactor() { - //this scales the size of the dick based on arousal, and is not directly related to arousalFactor(muiltiplier on arousal you gain from actions) + //this scales the size of the dick based on arousal, and is not directly related to arousalFactor(multiplier on arousal you gain from actions) let factor = 1; if (!this.arousalEnabled || this.arousal < 25) { factor = 0.5; @@ -1758,10 +1762,31 @@ let macro = }, }; -function look() +function updateBiome() +{ + if(macro.height > 1e12){ //stops function from running once it stops being relevant + return + } + let strideSize = macro.height*.4; + position += strideSize; + + if (position > biomeSize){ + position=0; + biomeSize = ((Math.random()*4000)+1000); + let oldBiome = biome; + biome = pickString("rural","suburb","city","downtown"); + if (oldBiome == biome){} + else { + look(true); + } + } + //update(["Your position is " + position + ".",newline]); +} + +function look(onlyBiome=false) { - let desc = macro.description; + let desc = macro.description; let line2 = ""; if (macro.height > 1e12) @@ -1774,7 +1799,7 @@ function look() case "suburb": line2 = "You're " + (strolling ? "striding" : "standing") + " through the winding roads of a suburb."; break; case "city": if (macro.height < 6) { - line2 = "You are " + (strolling ? "Strolling" : "Standing") + " in the street of a city. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; + line2 = "You are " + (strolling ? "strolling" : "standing") + " in the street of a city. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; } else if (macro.height < 24) { line2 = "Your broad frame fills the street of the city you are terrorizing. Your presence has caused a pileup of vehicles trying to escape."; break; } else if (macro.height < 100){ @@ -1782,15 +1807,20 @@ function look() } else if (macro.height < 500){ line2 = "You are " + (strolling ? "strolling through" : "looming over") + " a bustling city. Your mammoth frame is on par with the few nearby skyscrapers, You forge your own path, leaving a swath of demolished buildings. Panic has fully gripped the city; the streets are filled with vehicles, all immobile."; break; } else if (macro.height < 2500){ - line2 = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the couple of remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc + ". Traffic is gridlocked as far as you can see, and farther." ; break; + line2 = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the couple of remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc(true) + ". Traffic is gridlocked as far as you can see, and farther." ; break; } else { line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; } case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; break; } - desc = desc.concat([newline,line2,newline]); - update(desc); + + if (onlyBiome == true){ + update([line2]); + } else { + desc = desc.concat([newline,line2,newline]); + update(desc); + } } function toggle_auto(e) @@ -2098,6 +2128,7 @@ function do_digestion(owner, organ, container, active=false) { } } + function digest_stomach() { digest_all(macro.stomach, true); } @@ -2254,6 +2285,8 @@ function stomp() update([sound,line,linesummary,newline]); + updateBiome(false); + macro.arouse(5); stomp_wedge(); @@ -5325,6 +5358,7 @@ function render_int_option(li, option) { render_number_option(li, option, "int"); } +//sets up style for "radio" in features.js function render_radio_option(options_div, option) { option.choices.forEach(function(choice) { let li = document.createElement("li"); @@ -5353,6 +5387,7 @@ function render_radio_option(options_div, option) { }); } +//sets up style for "checkbox" in features.js function render_checkbox_option(li, option) { let input = document.createElement("input"); From a14ff80c1c76937a4e18fb200968280a7a737dee Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Sun, 1 Dec 2019 19:00:39 -0500 Subject: [PATCH 18/44] Walk Speed Additions +Added Walk Speed To Menu(changes how long between footfalls) *Changed strolling to Enum +2 new modes of walking "jogging" and "running" that allow you to walk faster *Changed default time between steps while walking from 1500 to 2000. This allows for a slower pace if desired, with faster options now available. *updated URL in README to point to correct site --- README.md | 2 +- features.js | 7 ++++++ game.js | 68 ++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5e78354..b4244e2 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ Stroll is an 18+ macro/vore text game. Smash things, eat things, and do lewd things to things - then grow and do it all over again. -https://chemicalcrux.org/stroll/ +https://stroll.crux.sexy/ diff --git a/features.js b/features.js index a96df47..366361a 100644 --- a/features.js +++ b/features.js @@ -514,6 +514,13 @@ options = [ "default": "1", "tooltip": "You start out this many times larger than normal. A good way to build a macro character is to design them at normal size, then adjust the scale to get them to the right height." }, + { + "name": "Walk Speed", + "id": "walkSpeed", + "type": "float", + "default": "1", + "tooltip": "How quickly you move while walking, jogging, or running." + }, { "name": "Height", "id": "baseHeight", diff --git a/game.js b/game.js index 7df032f..8d764de 100644 --- a/game.js +++ b/game.js @@ -19,7 +19,13 @@ window.onerror = function(msg, source, lineno, colno, error) { let started = false; -let strolling = false; +const strollingEnum = { + Standing: 0, + Strolling: 1, + Jogging: 2, + Running: 4}; + +let strolling = strollingEnum.Standing; let unit = "metric"; @@ -47,6 +53,7 @@ let macro = "shrunkPrey": null, "fastDigestFactor": 1, "fastDigestTimer": null, + "walkSpeed": 1, "growthPoints": 0, @@ -1825,12 +1832,35 @@ function look(onlyBiome=false) function toggle_auto(e) { - strolling = !strolling; - e.target.innerText = "Status: " + (strolling ? "Strolling" : "Standing"); - if (strolling) - update(["You start walking.",newline]); - else - update(["You stop walking.",newline]); + switch(strolling) { //Changes how fast player is moving, if player is running, sets player back to standing + case strollingEnum.Standing: + strolling = strollingEnum.Strolling; + e.target.innerText = "Status: Strolling"; + update(["You start walking.",newline]); + break; + case strollingEnum.Strolling: + strolling = strollingEnum.Jogging; + e.target.innerText = "Status: Jogging"; + update(["You start jogging.",newline]); + break; + case strollingEnum.Jogging: + strolling = strollingEnum.Running; + e.target.innerText = "Status: Running"; + update(["You start running.",newline]); + break; + case strollingEnum.Running: + strolling = strollingEnum.Standing; + e.target.innerText = "Status: Standing"; + update(["You stop running..",newline]); + break; + } + // strolling = !strolling; + // e.target.innerText = "Status: " + (strolling ? "Strolling" : "Standing"); + //if (strolling) + // update(["You start walking.",newline]); + //else + // update(["You stop walking.",newline]); + //this is the old code where strolling is defined as true and false(strolling is now referencing an Enum) should probably be ripped out if this ever makes it onto the main Repo } function toggle_units(e) @@ -4284,8 +4314,28 @@ function stylePercentage(name, storage) { function pick_move() { - setTimeout(pick_move, 1500 * (1 + Math.log10(macro.scale))); - if (!strolling) { + let moving = false; + let walkSpeed = macro.walkSpeed; + let stepTime = 0; + switch(strolling){ + case strollingEnum.Standing: + moving = false; + break; + case strollingEnum.Strolling: + stepTime = (1* (1/walkSpeed) * 2000 * (1 + Math.log10(macro.scale))) + moving = true; + break; + case strollingEnum.Jogging: + stepTime = (1/2* (1/walkSpeed) * 2000 * (1 + Math.log10(macro.scale))) + moving = true; + break; + case strollingEnum.Running: + stepTime = (1/3* (1/walkSpeed) * 2000 * (1 + Math.log10(macro.scale))) + moving = true; + break; + }; + setTimeout(pick_move, stepTime); + if (!moving) { return; } From fae21180e80030b5e97dba19b8d4872ab2000f9f Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 4 Dec 2019 09:54:19 -0500 Subject: [PATCH 19/44] Version bump --- game.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.js b/game.js index 8d764de..0c2eaef 100644 --- a/game.js +++ b/game.js @@ -3,7 +3,7 @@ /*jshint browser: true*/ /*jshint devel: true*/ -let version = "v1.0.0"; +let version = "v1.0.1"; let errored = false; From ea4534320327e00f77110c234aee7684b41cd8a1 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 4 Dec 2019 13:29:33 -0500 Subject: [PATCH 20/44] Fix favicon and preview image --- stroll.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stroll.html b/stroll.html index 20bbc7d..375592b 100644 --- a/stroll.html +++ b/stroll.html @@ -17,8 +17,8 @@ - - + + From bd6ff0364f0c309792223332a723be0d0955c09f Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Wed, 4 Dec 2019 21:07:31 -0500 Subject: [PATCH 21/44] Fixed Spacing when entering new biome. look(true) now adds a newline after text. --- game.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.js b/game.js index 8d764de..3fdf470 100644 --- a/game.js +++ b/game.js @@ -1823,7 +1823,7 @@ function look(onlyBiome=false) if (onlyBiome == true){ - update([line2]); + update([line2,newline]); } else { desc = desc.concat([newline,line2,newline]); update(desc); From b0fb5c296ffb2abcb5e765c2faf3c14226ea4ee9 Mon Sep 17 00:00:00 2001 From: jsb5468 Date: Thu, 5 Dec 2019 21:51:15 -0500 Subject: [PATCH 22/44] Biome Rules Implementation *biome is now an Enum, see biomeEnum *moved biome and biomeEnum to after macro to avoid issue with defination before initilization *Added main menu options to allow you to control what biomes you walk to *Added Main Menu Option to allow you to turn off walking betweeen Bioms *Let player choose starting biome *Fixed link in stroll header *Changed flavortext for downtown to make it cleared if you are in city or downtown made line2 in look areaDesk as veriable name was nondescript *biomes now have weighted spawns --- features.js | 88 +++++++++++++++++++++-- game.js | 199 +++++++++++++++++++++++++++++++++++++++------------- stroll.html | 4 +- 3 files changed, 235 insertions(+), 56 deletions(-) diff --git a/features.js b/features.js index 366361a..1143b5f 100644 --- a/features.js +++ b/features.js @@ -686,10 +686,90 @@ options = [ ] }, { - "name": "Walk to other locations", - "id": "changingBiomes", - "type": "checkbox", - "tooltip": "When checked, walking will sometimes change your location." + "name": "Biomes", + "id": "biomes", + "type": "subcategory", + "entries": + [ + { + "name": "Walk to other locations", + "id": "changingBiomes", + "type": "checkbox", + "tooltip": "When checked, walking will sometimes change your location." + }, + { + "name":"Default Biome", + "type": "select", + "id": "defaultBiome", + "default": "City", + "tooltip": "Where you start, if you have \"Walk to other locations\" disabled, you will be stuck here.", + "choices": + [ + { + "name": "City", + "value": "City", + "tooltip": "The normal city enviroment you are used to.", + }, + { + "name": "Downtown", + "value": "Downtown", + "tooltip": "A dense city center.", + }, + { + "name": "Suburb", + "value": "Suburb", + "tooltip": "The perfect place to start a family, or eat one.", + }, + { + "name": "Rural", + "value": "Rural", + "tooltip": "Is that a cow?", + } + ] + }, + { + "name": "Available Biomes", + "id": "biomes", + "type": "subcategory", + "entries": + [ + { + "name": "City", + "id": "cityEnabled", + "type": "checkbox", + "default": true, + "tooltip": "The normal city enviroment you are used to.", + }, + { + "name": "Downtown", + "id": "downtownEnabled", + "type": "checkbox", + "default": true, + "tooltip": "A dense city center.", + }, + { + "name": "Suburb", + "id": "suburbEnabled", + "type": "checkbox", + "default": true, + "tooltip": "The perfect place to start a family, or eat one.", + }, + { + "name": "Rural", + "id": "ruralEnabled", + "type": "checkbox", + "default": true, + "tooltip": "Is that a cow?", + } + ] + }, + { + "name": "Scale growth with size", + "id": "growthScaleWithSize", + "type": "checkbox", + "tooltip": "If you're ten times bigger than normal, you gain ten times as much mass when digesting prey" + } + ] }, ] }, diff --git a/game.js b/game.js index 3fdf470..de43445 100644 --- a/game.js +++ b/game.js @@ -7,7 +7,7 @@ let version = "v1.0.0"; let errored = false; -window.onerror = function(msg, source, lineno, colno, error) { +window.onerror = function(msg, source, lineno, colno, error) { //opens a popup if the game encounters an error if (!errored) { errored = true; @@ -16,14 +16,14 @@ window.onerror = function(msg, source, lineno, colno, error) { console.log(navigator.userAgent); } }; - +//generates initial conditions and sets up variables let started = false; const strollingEnum = { Standing: 0, Strolling: 1, Jogging: 2, - Running: 4}; + Running: 3}; let strolling = strollingEnum.Standing; @@ -38,17 +38,13 @@ let text_verbosity = "verbose"; let autoVerbose = true; -let biome = "city"; - -let biomeSize = 3000; -let position = 0; let newline = " "; let victims = {}; -let macro = +let macro = //macro controls every customizable part of the players body { "shrunkPrey": null, "fastDigestFactor": 1, @@ -1769,63 +1765,144 @@ let macro = }, }; -function updateBiome() +// +//------END OF MACRO FUCTION----------------------------------------------------------------------------------------------- +// + +const biomeEnum = { + City: { + enabled: "cityEnabled", + biomeSize: [1000,5000], //[min,max] Note: this is the distance you will walk until getting to the end of the biome + biomeWeights: { //Weights determine if and how often you run into something while inside of a biome + "House": 0.1, + "Car": 0.07, + "Bus": 0.02, + "Business": 0.075, + "Parking Garage": 0.003, + "Small Skyscraper": 0.05, + "City": 0.00005 + }}, + Downtown: { + enabled: "downtownEnabled", + biomeSize: [1000,5000], //[min,max] Note: this is the distance you will walk until getting to the end of the biome + biomeWeights: { //Weights determine if and how often you run into something while inside of a biome + "Car": 0.1, + "Bus": 0.05, + "Business": 0.075, + "Parking Garage": 0.003, + "Small Skyscraper": 0.06, + "City": 0.00005 + }}, + Rural: { + enabled: "ruralEnabled", + biomeSize: [4000,8000], //[min,max] Note: this is the distance you will walk until getting to the end of the biome + biomeWeights: { //Weights determine if and how often you run into something while inside of a biome + "Cow": 0, + "House": 0.1, + "Barn": 0.08, + "Car": 0.1, + "Business": 0.075, + "Town": 0.00001 + }}, + Suburb: { + enabled: "suburbEnabled", + biomeSize: [2000,7000], //[min,max] Note: this is the distance you will walk until getting to the end of the biome + biomeWeights: { //Weights determine if and how often you run into something while inside of a biome + "House": 0.1, + "Car": 0.07, + "Bus": 0.01, + "Town": 0.00001 + }}}; + +let biome = biomeEnum.City; //starting biome(this will be overwritten by player selection as soon as game starts) +let biomeSize = 3000; // size of starting biome(this will be overwritten by player selection as soon as game starts) +let position = 0; //declares variable and starts player at 0 as they have not taken a step yet + + +function updateBiome(forceNew=false, specifyBiome)//handles stepping between biomes { - if(macro.height > 1e12){ //stops function from running once it stops being relevant + if(macro.height > 1e12 || macro.changingBiomes==false){ //stops function from running once it stops being relevant return } - let strideSize = macro.height*.4; - position += strideSize; + let strideSize = macro.height*.4; //adjust step size based on height + position += strideSize; //adds distance from step into total disance traveled through biome - if (position > biomeSize){ + if (position > biomeSize || forceNew==true){ //if player steps out of biome, generates a new one position=0; - biomeSize = ((Math.random()*4000)+1000); let oldBiome = biome; - biome = pickString("rural","suburb","city","downtown"); - if (oldBiome == biome){} - else { - look(true); + let biomeTemp = biome; //defines biomeTemp for latrer use, what it is set to does not matter + if (specifyBiome == undefined){ + biomeTemp = pickString(biomeEnum.City,biomeEnum.Suburb,biomeEnum.Rural,biomeEnum.Downtown); //if a biome is not force into this function, it picks a random biome + }else{ //otherwise it sets the new biome to the selected one + biomeTemp = specifyBiome;} + if (macro[(biomeTemp.enabled)] == false){ //checks that the biome selected is actually enabled and if it is not, reruns the function + updateBiome(true); //side effect of this order is that if the user selects an invalid biome + return; + } + biome = biomeTemp //if biome passes all checks to allow creation, sets it as biome player is in + generateBiome(); //assigns a size to new biome + + if (oldBiome !== biome){//only alerts player if the biome type actually changed + look(true); } } - //update(["Your position is " + position + ".",newline]); } -function look(onlyBiome=false) +function generateBiome(){ //creates the biome in accordance with its specific settings(only controls size now but needs to be a seperate function due to way game starts) + let offset = biome.biomeSize[0] //Math.random generates a random value from 0-1. biome.biomeSize denotes min and max size for each type of biome + let multiplier = (biome.biomeSize[1]-offset) //if Math.random generated 0, we need the min value, so min value becomes offset. if it is 1, we need + biomeSize = ((Math.random()*multiplier)+offset); // max value so we multiply 1 by the (maxvalue - minvalue)+minvalue to cap out at max value. + } + +function look(onlyBiome=false) //onlyBiome means don't include player description when looking at surroundings { - let desc = macro.description; - let line2 = ""; + let playerDesc = macro.description; + let areaDesc = ""; if (macro.height > 1e12) - line2 = "You're pretty much everywhere at once."; + areaDesc = "You're pretty much everywhere at once."; else if (macro.height > 1e6) - line2 = "You're " + (strolling ? "strolling" : "standing") + "...on pretty much everything at once."; + areaDesc = "You're " + (strolling ? "strolling" : "standing") + "...on pretty much everything at once."; else switch(biome) { - case "rural": line2 = "You're " + (strolling ? "strolling" : "standing") + " amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break; - case "suburb": line2 = "You're " + (strolling ? "striding" : "standing") + " through the winding roads of a suburb."; break; - case "city": + case biomeEnum.Rural: areaDesc = "You're " + (strolling ? "strolling" : "standing") + " amongst rural farmhouses and expansive ranches. Cattle are milling about at your feet."; break; + case biomeEnum.Suburb: areaDesc = "You're " + (strolling ? "striding" : "standing") + " through the winding roads of a suburb."; break; + case biomeEnum.City: + if (macro.height < 6) { + areaDesc = "You are " + (strolling ? "strolling" : "standing") + " in the street of a city. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; + } else if (macro.height < 24) { + areaDesc = "Your broad frame fills the street of the city you are terrorizing. Your presence has caused a pileup of vehicles trying to escape."; break; + } else if (macro.height < 100){ + areaDesc = "You are too large for the city streets you are " + (strolling ? "strolling through." : "standing in.") + " Your hulking frame scrapes against building after building, leaving a clear indicator of your path. Gridlock is starting to set in, with people honking and trying to drive away on the sidewalks."; break; + } else if (macro.height < 500){ + areaDesc = "You are " + (strolling ? "strolling through" : "looming over") + " a bustling city. Your mammoth frame is on par with the few nearby skyscrapers. You forge your own path, leaving a swath of demolished buildings. Panic has fully gripped the city; the streets are filled with vehicles, all immobile."; break; + } else if (macro.height < 2500){ + areaDesc = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the couple of remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc(true) + ". Traffic is gridlocked as far as you can see." ; break; + } else { + areaDesc = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; + } + case biomeEnum.Downtown: if (macro.height < 6) { - line2 = "You are " + (strolling ? "strolling" : "standing") + " in the street of a city. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; + areaDesc = "You are " + (strolling ? "strolling" : "standing") + " in packed downtown streets. Several " + (macro.victimsHuman ? "humans" : "people") + " have noticed your intimidating presence and are beginning to run."; break; } else if (macro.height < 24) { - line2 = "Your broad frame fills the street of the city you are terrorizing. Your presence has caused a pileup of vehicles trying to escape."; break; + areaDesc = "Your broad frame fills the street of the city center. Your presence has caused a pileup of vehicles trying to escape."; break; } else if (macro.height < 100){ - line2 = "You are too large for the city streets you are " + (strolling ? "strolling through." : "standing in.") + " Your hulking frame scrapes against building after building, leaving a clear indicator of your path. Gridlock is starting to set in, with people honking and trying to drive away on the sidewalks."; break; + areaDesc = "You are too large for the city streets you are " + (strolling ? "strolling through." : "standing in.") + " Your hulking frame scrapes against building after building, leaving a clear indicator of your path. Gridlock is starting to set in, with people honking and trying to drive away on the sidewalks."; break; } else if (macro.height < 500){ - line2 = "You are " + (strolling ? "strolling through" : "looming over") + " a bustling city. Your mammoth frame is on par with the few nearby skyscrapers, You forge your own path, leaving a swath of demolished buildings. Panic has fully gripped the city; the streets are filled with vehicles, all immobile."; break; + areaDesc = "You are " + (strolling ? "strolling through" : "looming over") + " a bustling city. Your mammoth frame is on par with the glittering skyscrapers that surround you. You forge your own path, leaving a swath of demolished buildings. Panic has fully gripped the city; the streets are filled with vehicles, all immobile."; break; } else if (macro.height < 2500){ - line2 = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the couple of remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc(true) + ". Traffic is gridlocked as far as you can see, and farther." ; break; + areaDesc = "You are " + (strolling ? "strolling over" : "looming over") + " a city in the midst of chaos. Your colossal bulk blots out the sky, and makes the remaining skyscrapers look small in comparison. You can clearly see the imprints of your " + macro.footDesc(true) + ". Traffic is gridlocked as far as you can see, and farther." ; break; } else { - line2 = "You're terrorizing the streets of a city. Heavy traffic, worsened by your rampage, is everywhere."; break; + areaDesc = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; break; } - case "downtown": line2 = "You're lurking amongst the skyscrapers of downtown. The streets are packed, and the buildings are practically begging you to knock them over."; break; } if (onlyBiome == true){ - update([line2,newline]); + update([areaDesc,newline]); } else { - desc = desc.concat([newline,line2,newline]); + let desc = playerDesc.concat([newline,areaDesc,newline]); update(desc); } } @@ -2026,20 +2103,25 @@ function getWeights(region, area) { "Continent": 0.5, }; } - else { - weights = { - "House": 0.1, - "Car": 0.07, - "Bus": 0.02, - "Business": 0.075, - "Parking Garage": 0.003, - "Small Skyscraper": 0.05, - "Town": 0.00001, - "City": 0.00005, - "Continent": 0.0005, - "Planet": 0.0001 - }; - + else{ + try{ + weights = region.biomeWeights + } + catch(err){ + weights = { + "House": 0.1, + "Car": 0.07, + "Bus": 0.02, + "Business": 0.075, + "Parking Garage": 0.003, + "Small Skyscraper": 0.05, + "Town": 0.00001, + "City": 0.00005, + "Continent": 0.0005, + "Planet": 0.0001 + }; + } + if (!macro.victimsNoPeople) { if (macro.victimsHuman) { weights["Human"] = 0.017; @@ -5096,6 +5178,23 @@ function startGame(e) { macro.init(); + switch(macro.defaultBiome) { //sets starting biome as defined by player + case "City": + biome = biomeEnum.City; + break; + case "Downtown": + biome = biomeEnum.Downtown; + break; + case "Suburb": + biome = biomeEnum.Suburb; + break; + case "Rural": + biome = biomeEnum.Rural; + break; + } + + generateBiome(); + update(warns); if (warns.length > 0) { diff --git a/stroll.html b/stroll.html index 20bbc7d..d66af6a 100644 --- a/stroll.html +++ b/stroll.html @@ -1,4 +1,4 @@ - + @@ -210,7 +210,7 @@

Welcome to Stroll

This game features 18+ content

-

Changelog - Discord

+

Changelog - Discord

Stroll is a text-based macro game. Stomp things, eat things, abuse things - then grow larger and do it all over again.

From a3df4adb607291e4af96379e6c368df7b8366e30 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Thu, 5 Dec 2019 22:12:19 -0500 Subject: [PATCH 23/44] Bring back all of the old presets --- presets.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/presets.js b/presets.js index 09f8927..ccd827a 100644 --- a/presets.js +++ b/presets.js @@ -1,5 +1,19 @@ let presets = [ {"version":1,"name":"Fen","brutality":"2","oralVore":true,"analVore":true,"analVoreToStomach":true,"hasTail":true,"tailType":"twisted","baseTailLength":2,"baseTailDiameter":0.4}, {"version":1,"name":"Mech","baseHeight":3.7,"baseMass":500,"basePawLength":0.8,"basePawWidth":0.5,"baseHandLength":0.4,"baseHandWidth":0.2,"baseAssArea":1,"species":"Dragon","brutality":"2","victimsHuman":true,"victimsMilitary":true,"victimsMacros":true,"oralVore":true,"oralDigestTime":5,"analVore":true,"baseAnalVoreDiameter":0.4,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"tailType":"meaty","baseTailLength":2.5,"baseTailDiameter":0.6,"maleParts":true,"baseDickLength":0.9,"baseDickDiameter":0.2,"dickType":"hefty","baseBallDiameter":0.19,"baseCumVolume":2,"cockVoreEnabled":true,"cockDigestTime":5,"basePissProduction":0.001,"baseScatDigestFactor":0.3,"scatStorageScale":1.5,"scatScaleWithSize":true,"magicEnabled":true}, - {"version":1,"name":"Goathias","scale":3,"species":"Goat","footType":"hoof","difficulty":"1","brutality":"3","victimsHuman":true,"victimsMilitary":true,"oralVore":true,"vomitEnabled":true,"analVore":true,"arousalEnabled":true,"maleParts":true,"cockVoreEnabled":true,"cumScaleWithSize":true,"maleMuskEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"milkScaleWithSize":true,"stenchEnabled":true,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"pissEnabled":true,"bladderVore":true,"pissScaleWithSize":true,"scatEnabled":true,"scatScaleWithSize":true,"breathEnabled":true,"breathFoul":true,"droolEnabled":true,"magicEnabled":true} + {"version":1,"name":"Goathias","scale":3,"species":"Goat","footType":"hoof","difficulty":"1","brutality":"3","victimsHuman":true,"victimsMilitary":true,"oralVore":true,"vomitEnabled":true,"analVore":true,"arousalEnabled":true,"maleParts":true,"cockVoreEnabled":true,"cumScaleWithSize":true,"maleMuskEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"milkScaleWithSize":true,"stenchEnabled":true,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"pissEnabled":true,"bladderVore":true,"pissScaleWithSize":true,"scatEnabled":true,"scatScaleWithSize":true,"breathEnabled":true,"breathFoul":true,"droolEnabled":true,"magicEnabled":true}, + {"version":1,"name":"Arokha","scale":10,"baseHeight":1.67,"baseMass":50,"baseAssArea":0.25,"species":"kitsune","victimsMicros":true,"oralVore":true,"oralDigestTime":5,"analVore":true,"baseAnalVoreDiameter":0.1,"analDigestTime":5,"analVoreToStomach":true,"footSockEnabled":true,"footShoeEnabled":true,"arousalEnabled":true,"hasTail":true,"tailCount":2,"tailMaw":true,"tailStretchiness":1,"tailDigestTime":5,"tailVoreToStomach":true,"dickStretchiness":1,"hasSheath":true,"femaleParts":true,"baseVaginaLength":0.12,"vaginaStretchiness":2,"femcumScaleWithSize":true,"hasBreasts":true,"lactationEnabled":true,"breastStretchiness":1,"baseAssStenchArea":2,"baseScatStenchArea":1.5,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"soulVoreEnabled":true,"soulDigestTime":5,"pissEnabled":true,"scatEnabled":true,"scatScaleWithSize":true,"gooDigestion":true}, + {"version":1,"name":"Aronai","scale":10,"baseHeight":1.8,"baseMass":86,"baseAssArea":0.25,"sameSizeStomp":true,"species":"synthfox","brutality":"0","victimsMacros":true,"victimsMicros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"footSockEnabled":true,"footShoeEnabled":true,"arousalEnabled":true,"hasTail":true,"tailType":"floofy","tailStretchiness":1,"tailVoreToStomach":true,"dickStretchiness":1,"hasSheath":true,"femaleParts":true,"baseVaginaLength":0.12,"vaginaStretchiness":2,"femcumScaleWithSize":true,"breastStretchiness":1,"baseAssStenchArea":2,"baseScatStenchArea":1.5,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"soulVoreEnabled":true,"soulDigestTime":10,"soulVoreType":"release","pissEnabled":true,"scatEnabled":true,"scatScaleWithSize":true,"gooDigestion":true}, + {"version":1,"name":"Dissy","scale":450,"baseHeight":3,"baseMass":55,"baseAssArea":5,"species":"stallion","footType":"hoof","brutality":"3","victimsHuman":true,"victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"oralDigestTime":0,"vomitEnabled":true,"analVore":true,"baseAnalVoreDiameter":1,"analDigestTime":0,"analVoreToStomach":true,"footSockEnabled":true,"footShoe":"sandal","arousalEnabled":true,"arousalFactor":2,"hasTail":true,"tailType":"floofy","baseTailDiameter":2,"tailMaw":true,"tailStretchiness":5,"tailVoreToStomach":true,"maleParts":true,"baseDickLength":4,"baseDickDiameter":2,"dickType":"horse","baseBallDiameter":7,"cumStorageScale":9,"dickStretchiness":1,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"stenchEnabled":true,"basePawStenchArea":4,"baseAssStenchArea":4,"basePissStenchArea":4,"baseScatStenchArea":4,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"baseGasDigestFactor":4,"soulVoreType":"release","pissEnabled":true,"scatEnabled":true,"baseScatDigestFactor":3,"scatStorageScale":5,"gooDigestion":true,"pawDigestTime":0}, + {"version":1,"name":"Elijah","baseHeight":1.77,"baseMass":63,"baseAssArea":0.15,"sameSizeStomp":true,"species":"Blue Jay","footType":"avian","jawType":"beak","brutality":"3","victimsHuman":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.08,"footWear":true,"footShoeEnabled":true,"footShoe":"sandal","arousalEnabled":true,"edgeFactor":3,"hasTail":true,"tailType":"Feathered","baseTailLength":0.8,"baseTailDiameter":0.2,"tailStretchiness":1,"tailVoreToStomach":true,"maleParts":true,"baseDickLength":0.18,"dickType":"Avian","dickStretchiness":1,"cockDigestTime":20,"cumScaleWithSize":true,"hasSheath":true,"vaginaStretchiness":1,"breastStretchiness":1,"baseAssStenchArea":2,"baseScatStenchArea":1.5,"belchEnabled":true,"soulVoreType":"release","gooDigestion":true,"cropEnabled":true,"cropTransferTime":30,"droolBaseVolume":0.0001}, + {"version":1,"name":"Famis","scale":155,"baseHeight":1.52,"baseAssArea":0.25,"sameSizeStomp":true,"difficulty":"1","victimsHuman":true,"victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"oralDigestTime":30,"analVore":true,"baseAnalVoreDiameter":0.1,"analDigestTime":30,"analVoreToStomach":true,"footWear":true,"arousalEnabled":true,"hasTail":true,"tailType":"slinky","tailMaw":true,"tailStretchiness":50,"tailVoreToStomach":true,"maleParts":true,"dickStretchiness":15,"cockDigestTime":45,"cumScaleWithSize":true,"hasSheath":true,"maleMuskEnabled":true,"baseMaleMuskArea":5,"vaginaStretchiness":1,"breastStretchiness":1,"stenchEnabled":true,"basePawStenchArea":4,"baseAssStenchArea":0,"basePissStenchArea":0,"baseScatStenchArea":0,"soulVoreEnabled":true,"soulDigestTime":60,"gooEnabled":true,"gooDigestion":true,"gooDigestTime":20,"pawVoreEnabled":true,"pawDigestTime":45,"cropTransferTime":15,"droolEnabled":true,"droolBaseVolume":0.0001}, + {"version":1,"name":"Jaredin","scale":2,"baseHeight":3.7,"baseMass":907,"baseAssArea":0.4,"species":"cybernetic armoured dragon","victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"footShoe":"trainer","arousalEnabled":true,"hasTail":true,"tailType":"thick armour plated","baseTailLength":1.5,"baseTailDiameter":0.5,"tailStretchiness":1,"hasPouch":true,"maleParts":true,"baseDickLength":1,"baseDickDiameter":0.3,"dickType":"draconic","baseBallDiameter":0.08,"dickStretchiness":1,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"baseAssStenchArea":1,"belchEnabled":true,"soulVoreEnabled":true}, + {"version":1,"name":"Kanosint","baseHeight":1.48,"baseMass":54,"baseAssArea":0.5,"species":"rakshasa","victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.15,"analVoreToStomach":true,"footWear":true,"footSockEnabled":true,"arousalEnabled":true,"arousalFactor":0.8,"hasTail":true,"tailType":"serpentine","baseTailLength":1.5,"baseTailDiameter":0.4,"tailStretchiness":1,"maleParts":true,"baseDickLength":0.2,"dickType":"feline","baseBallDiameter":0.04,"dickStretchiness":0.8,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastStretchiness":1,"stenchEnabled":true,"basePawStenchArea":0.7,"baseAssStenchArea":0.5,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"baseGasDigestFactor":1.2,"gasScaleWithSize":true,"soulVoreEnabled":true,"pissEnabled":true,"bladderVore":true,"baseUrethraDiameter":0.04,"urethraStretchiness":0.8,"scatEnabled":true,"gooEnabled":true}, + {"version":1,"name":"Kassy","baseHeight":1.7,"baseMass":90,"baseAssArea":0.25,"sameSizeStomp":true,"species":"Ram","footType":"foot","brutality":"3","victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"oralDigestTime":25,"analVore":true,"baseAnalVoreDiameter":0.1,"analDigestTime":20,"footWear":true,"footShoeEnabled":true,"footShoe":"sandal","arousalEnabled":true,"hasTail":true,"tailType":"Wooly","baseTailLength":0.1,"tailStretchiness":1,"tailVoreToStomach":true,"maleParts":true,"dickType":"Human","dickStretchiness":1,"cumScaleWithSize":true,"maleMuskEnabled":true,"baseMaleMuskArea":0.1,"vaginaStretchiness":1,"breastStretchiness":1,"baseAssStenchArea":2,"baseScatStenchArea":1.5,"gasEnabled":true,"belchEnabled":true,"gasScaleWithSize":true,"soulVoreType":"release","gooDigestion":true,"cropTransferTime":15,"droolEnabled":true,"droolBaseVolume":0.00001}, + {"version":1,"name":"Mekuto","baseHeight":1.778,"baseMass":66,"baseAssArea":0.25,"species":"wahsune","oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"tailCount":5,"tailType":"ravenous","baseTailLength":1.9,"baseTailDiameter":0.15,"tailMaw":true,"maleParts":true,"baseDickLength":0.15,"baseDickDiameter":0.05,"baseBallDiameter":0.03,"dickStretchiness":3,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1}, + {"version":1,"name":"Noma","baseHeight":8,"baseMass":4800,"baseAssArea":2,"sameSizeStomp":true,"species":"Lynxcoon","victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"baseAnalVoreDiameter":0.1,"footWear":true,"footSockEnabled":true,"footShoeEnabled":true,"footShoe":"boot","hasTail":true,"tailType":"fluffy coon ","baseTailLength":8,"baseTailDiameter":2,"tailMaw":true,"tailStretchiness":2,"tailVoreToStomach":true,"maleParts":true,"baseDickLength":2,"baseDickDiameter":0.5,"dickType":"feline","baseBallDiameter":2,"cumStorageScale":2,"dickStretchiness":1,"baseCumDigestFactor":2,"cumScaleWithSize":true,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"baseAssStenchArea":1,"baseScatStenchArea":1.5,"gasEnabled":true,"belchEnabled":true,"gasStorageScale":2,"gasScaleWithSize":true,"soulVoreEnabled":true,"gooEnabled":true,"gooDigestion":true,"pawVoreEnabled":true}, + {"version":1,"name":"Ona","baseMass":125,"baseAssArea":0.45,"sameSizeStomp":true,"species":"Raven","footType":"avian","jawType":"beak","brutality":"2","victimsMilitary":true,"victimsMacros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"footWear":true,"footShoeEnabled":true,"footShoe":"sandal","arousalEnabled":true,"tailType":"slinky","tailStretchiness":1,"dickStretchiness":1,"hasSheath":true,"femaleParts":true,"baseVaginaLength":0.2,"baseVaginaWidth":0.1,"vaginaStretchiness":2,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"baseAssStenchArea":1,"belchEnabled":true,"soulVoreEnabled":true,"soulVoreType":"oblivion"}, + {"version":1,"name":"Rain Fallen","scale":54.22,"baseAssArea":0.4,"sameSizeStomp":true,"species":"Wolf Demon","brutality":"3","victimsMilitary":true,"victimsMacros":true,"victimsMicros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"footSockEnabled":true,"footShoeEnabled":true,"arousalEnabled":true,"hasTail":true,"tailType":"Wolf","baseTailLength":1.8,"tailMaw":true,"tailStretchiness":1,"maleParts":true,"baseDickLength":0.4,"baseDickDiameter":0.09,"baseBallDiameter":0.12,"dickStretchiness":1,"cumScaleWithSize":true,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastStretchiness":1,"stenchEnabled":true,"baseAssStenchArea":1,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"soulVoreEnabled":true}, + {"version":1,"name":"Ralerin","baseHeight":2.2,"baseMass":140,"baseAssArea":0.4,"species":"pangolin","victimsMilitary":true,"victimsMacros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"footWear":true,"footShoeEnabled":true,"footShoe":"sandal","arousalEnabled":true,"hasTail":true,"tailType":"Scaled","baseTailLength":1.66,"baseTailDiameter":0.33,"tailStretchiness":1,"maleParts":true,"baseDickLength":0.4,"baseDickDiameter":0.12,"dickType":"pangolin","baseBallDiameter":0.09,"dickStretchiness":1.1,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"baseAssStenchArea":1,"belchEnabled":true,"soulVoreEnabled":true,"soulVoreType":"release","bladderVore":true}, + {"version":1,"name":"Vulpes","baseHeight":2,"baseMass":73,"species":"fox","brutality":"2","victimsMacros":true,"oralVore":true,"analVore":true,"baseAnalVoreDiameter":0.1,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"baseTailLength":1.3,"tailStretchiness":1,"maleParts":true,"baseDickLength":0.25,"baseDickDiameter":0.1,"dickType":"sheathed","baseBallDiameter":0.04,"dickStretchiness":2,"hasSheath":true,"vaginaStretchiness":1,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"soulVoreEnabled":true} ] From 503a449a1a9f1f88127e2fb1e74da54b8a91ec84 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Thu, 5 Dec 2019 22:26:18 -0500 Subject: [PATCH 24/44] Add a priority attribute to presets. Now Fen is #1 --- game.js | 12 +++++++++++- presets.js | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/game.js b/game.js index 0c2eaef..0f11133 100644 --- a/game.js +++ b/game.js @@ -5286,7 +5286,17 @@ window.addEventListener('load', function(event) { document.querySelector("#scale").addEventListener("input", updateAllPreviews); - presets.sort(function(x,y) {return x.name.localeCompare(y.name); } ); + presets.sort(function(x,y) { + let xp = x.priority === undefined ? 0 : x.priority; + let yp = y.priority === undefined ? 0 : y.priority; + + if (xp != yp) { + return yp - xp; + } else { + return x.name.localeCompare(y.name); + } + + } ); let list = document.getElementById("character-presets"); diff --git a/presets.js b/presets.js index ccd827a..a10ed53 100644 --- a/presets.js +++ b/presets.js @@ -1,5 +1,5 @@ let presets = [ - {"version":1,"name":"Fen","brutality":"2","oralVore":true,"analVore":true,"analVoreToStomach":true,"hasTail":true,"tailType":"twisted","baseTailLength":2,"baseTailDiameter":0.4}, + {"version":1,"name":"Fen","priority": 1,"brutality":"2","oralVore":true,"analVore":true,"analVoreToStomach":true,"hasTail":true,"tailType":"twisted","baseTailLength":2,"baseTailDiameter":0.4}, {"version":1,"name":"Mech","baseHeight":3.7,"baseMass":500,"basePawLength":0.8,"basePawWidth":0.5,"baseHandLength":0.4,"baseHandWidth":0.2,"baseAssArea":1,"species":"Dragon","brutality":"2","victimsHuman":true,"victimsMilitary":true,"victimsMacros":true,"oralVore":true,"oralDigestTime":5,"analVore":true,"baseAnalVoreDiameter":0.4,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"tailType":"meaty","baseTailLength":2.5,"baseTailDiameter":0.6,"maleParts":true,"baseDickLength":0.9,"baseDickDiameter":0.2,"dickType":"hefty","baseBallDiameter":0.19,"baseCumVolume":2,"cockVoreEnabled":true,"cockDigestTime":5,"basePissProduction":0.001,"baseScatDigestFactor":0.3,"scatStorageScale":1.5,"scatScaleWithSize":true,"magicEnabled":true}, {"version":1,"name":"Goathias","scale":3,"species":"Goat","footType":"hoof","difficulty":"1","brutality":"3","victimsHuman":true,"victimsMilitary":true,"oralVore":true,"vomitEnabled":true,"analVore":true,"arousalEnabled":true,"maleParts":true,"cockVoreEnabled":true,"cumScaleWithSize":true,"maleMuskEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"milkScaleWithSize":true,"stenchEnabled":true,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"pissEnabled":true,"bladderVore":true,"pissScaleWithSize":true,"scatEnabled":true,"scatScaleWithSize":true,"breathEnabled":true,"breathFoul":true,"droolEnabled":true,"magicEnabled":true}, {"version":1,"name":"Arokha","scale":10,"baseHeight":1.67,"baseMass":50,"baseAssArea":0.25,"species":"kitsune","victimsMicros":true,"oralVore":true,"oralDigestTime":5,"analVore":true,"baseAnalVoreDiameter":0.1,"analDigestTime":5,"analVoreToStomach":true,"footSockEnabled":true,"footShoeEnabled":true,"arousalEnabled":true,"hasTail":true,"tailCount":2,"tailMaw":true,"tailStretchiness":1,"tailDigestTime":5,"tailVoreToStomach":true,"dickStretchiness":1,"hasSheath":true,"femaleParts":true,"baseVaginaLength":0.12,"vaginaStretchiness":2,"femcumScaleWithSize":true,"hasBreasts":true,"lactationEnabled":true,"breastStretchiness":1,"baseAssStenchArea":2,"baseScatStenchArea":1.5,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"soulVoreEnabled":true,"soulDigestTime":5,"pissEnabled":true,"scatEnabled":true,"scatScaleWithSize":true,"gooDigestion":true}, From 85c50ad4080b150325ffaf234b7accef2903caf5 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Thu, 5 Dec 2019 23:10:32 -0500 Subject: [PATCH 25/44] Make a first stab at a mobile layout --- style.css | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/style.css b/style.css index ca1ebbd..a586a65 100644 --- a/style.css +++ b/style.css @@ -56,23 +56,59 @@ body.dark div { margin: auto; } -@media (max-aspect-ratio: 16/9){ +@media (max-aspect-ratio: 1/1){ .game-area { width: 100% height: 60%; } + #stat-container { + position: fixed; + top: 0%; + left: 0%; + max-width: 50%; + max-height: 50%; + } + #action-panel { + position: fixed; + right: 0%; + top: 0%; + max-width: 33%; + max-height: 50%; + } #log { - height: 80vh; - max-height: 50vh; + position: fixed; + left: 0%; + bottom: 0%; + width: 50%; + height: 50%; + max-height: 50%; margin: 0 0 1vh 0; } #react-log { + position: fixed; + right: 0%; + bottom: 0%; + width: 50%; + height: 50%; + max-height: 50%; margin: 1vh 0 0 0; height: 40vh; } + .growth-part { + width: 100px !important; + } + .growth-amount { + width: 100px !important; + } + .action-part-button { + width: 100px !important; + } + .action-button { + width: 100px !important; + } } -@media (min-aspect-ratio: 16/10){ +@media (min-aspect-ratio: 1/1){ .game-area { width: 90% } From 81bf4f262e1a02778ae68e42071dcc4ab2389b35 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Thu, 5 Dec 2019 23:29:41 -0500 Subject: [PATCH 26/44] Update changelog link --- stroll.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stroll.html b/stroll.html index 375592b..b0f0dd8 100644 --- a/stroll.html +++ b/stroll.html @@ -210,7 +210,7 @@

Welcome to Stroll

This game features 18+ content

-

Changelog - Discord

+

Changelog - Discord

Stroll is a text-based macro game. Stomp things, eat things, abuse things - then grow larger and do it all over again.

From a3a4125a135400c82b3ffc508a928383cf5babed Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 13:09:51 -0500 Subject: [PATCH 27/44] Rearrange the biome settings; allow for labels in the character creation screen --- features.js | 73 +++++++++++++++++++++++++---------------------------- game.js | 13 ++++++++++ style.css | 8 ++++++ 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/features.js b/features.js index 1143b5f..ce87840 100644 --- a/features.js +++ b/features.js @@ -656,6 +656,12 @@ options = [ } ] }, + { + "name": "Scale growth with size", + "id": "growthScaleWithSize", + "type": "checkbox", + "tooltip": "If you're ten times bigger than normal, you gain ten times as much mass when digesting prey" + }, { "name": "Automatic Growth", "id": "automaticGrowth", @@ -728,46 +734,37 @@ options = [ ] }, { - "name": "Available Biomes", - "id": "biomes", - "type": "subcategory", - "entries": - [ - { - "name": "City", - "id": "cityEnabled", - "type": "checkbox", - "default": true, - "tooltip": "The normal city enviroment you are used to.", - }, - { - "name": "Downtown", - "id": "downtownEnabled", - "type": "checkbox", - "default": true, - "tooltip": "A dense city center.", - }, - { - "name": "Suburb", - "id": "suburbEnabled", - "type": "checkbox", - "default": true, - "tooltip": "The perfect place to start a family, or eat one.", - }, - { - "name": "Rural", - "id": "ruralEnabled", - "type": "checkbox", - "default": true, - "tooltip": "Is that a cow?", - } - ] + "name": "Enabled biomes:", + "id": "", + "type": "label", + }, + { + "name": "City", + "id": "cityEnabled", + "type": "checkbox", + "default": true, + "tooltip": "The normal city enviroment you are used to.", }, { - "name": "Scale growth with size", - "id": "growthScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you gain ten times as much mass when digesting prey" + "name": "Downtown", + "id": "downtownEnabled", + "type": "checkbox", + "default": true, + "tooltip": "A dense city center.", + }, + { + "name": "Suburb", + "id": "suburbEnabled", + "type": "checkbox", + "default": true, + "tooltip": "The perfect place to start a family, or eat one.", + }, + { + "name": "Rural", + "id": "ruralEnabled", + "type": "checkbox", + "default": true, + "tooltip": "Is that a cow?", } ] }, diff --git a/game.js b/game.js index eb48b12..d8d18b9 100644 --- a/game.js +++ b/game.js @@ -5640,6 +5640,15 @@ function render_subcategory_option(li, option) { li.appendChild(sub_div); } +function render_label(li, option) { + let div = document.createElement("div"); + div.classList.add("custom-label"); + + div.textContent = option.name; + + li.appendChild(div); +} + function render_option(root_div, li, option) { if (option.type == "text") { render_text_option(li, option); @@ -5671,6 +5680,10 @@ function render_option(root_div, li, option) { render_subcategory_option(li, option); } + if (option.type == "label") { + render_label(li, option); + } + root_div.appendChild(li); } diff --git a/style.css b/style.css index a586a65..594bf11 100644 --- a/style.css +++ b/style.css @@ -793,3 +793,11 @@ body.dark .meterLabel { .log::-webkit-scrollbar-corner { background: transparent; } + +.custom-label { + text-align: center; + font-size: 30px; + width: 100%; + padding-top: 6px; + padding-bottom: 6px; +} \ No newline at end of file From 184e3c4d5792c30aed206ecce0602fc19a3fad86 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 13:16:03 -0500 Subject: [PATCH 28/44] Fix failure to export checkboxes that default to true This was because the game threw out all false settings when exporting - in the past, every checkbox defaulted to false. This was done because many checkboxes lack default settings of false, meaning their defualt value was undefined, not false. The code now checks for this case - false setting, undefined default - before moving on to the more general check for equivalence. --- game.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.js b/game.js index d8d18b9..956debb 100644 --- a/game.js +++ b/game.js @@ -4850,7 +4850,7 @@ function recurseDeletePanel(settings, panel) { recurseDeletePanel(settings, option); } else if (settings[option.id] == undefined) { delete settings[option.id]; - } else if (option.type == "checkbox" && !settings[option.id]) { + } else if (option.type == "checkbox" && !settings[option.id] && option.default === undefined) { delete settings[option.id]; } else if (settings[option.id] == option.default && option.id != "name") { delete settings[option.id]; From 8f3ba09a2c74f6111e0817939996b6762563af5d Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 15:50:14 -0500 Subject: [PATCH 29/44] Allow subcategories to be on by default; fix spurious export of default-true subcategories --- game.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/game.js b/game.js index 956debb..4d26137 100644 --- a/game.js +++ b/game.js @@ -4844,7 +4844,7 @@ function recurseDeletePanel(settings, panel) { } panel.entries.forEach(option => { if (option.type == "subcategory") { - if (!settings[option.id]) { + if (settings[option.id] == option.default || (!settings[option.id] && option.default === undefined)) { delete settings[option.id]; } recurseDeletePanel(settings, option); @@ -5612,6 +5612,10 @@ function render_subcategory_option(li, option) { sub_input.setAttribute("name", option.id); sub_input.setAttribute("type", "checkbox"); + if (option.default === true) { + sub_input.setAttribute("checked", true); + } + let sub_label = document.createElement("label"); sub_label.classList.add("custom-header"); sub_label.setAttribute("for", option.id); From 9a36ed3b1ef171b698360fa12b628187dd57579d Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 16:12:24 -0500 Subject: [PATCH 30/44] Make automatic digestion toggleable. This replaces the old behavior of setting digestion time to 0. Doing so does still work, but it is no longer mentioned. This introduces a save migration, since the option needs to be set based on the digestion times. --- features.js | 228 +++++++++++++++++++++++++++++++++++++------------- game.js | 32 +++---- migrations.js | 38 ++++++++- 3 files changed, 221 insertions(+), 77 deletions(-) diff --git a/features.js b/features.js index ce87840..04c7c25 100644 --- a/features.js +++ b/features.js @@ -843,11 +843,20 @@ options = [ "entries": [ { - "name": "Digestion time", - "id": "oralDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "oralDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "oralDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "oralDigestManual", @@ -884,11 +893,20 @@ options = [ "unit": "length" }, { - "name": "Digestion time", - "id": "analDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "analDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "analDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Anal autogrowth factor", "id": "assGrowthFactor", @@ -1068,11 +1086,20 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Digestion time", - "id": "tailDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "tailDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "tailDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "tailDigestManual", @@ -1201,11 +1228,20 @@ options = [ "default": "1" }, { - "name": "Digestion time", - "id": "cockDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "cockDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "cockDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "cockDigestManual", @@ -1356,11 +1392,20 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Digestion time", - "id": "unbirthDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "unbirthDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "unbirthDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "unbirthDigestManual", @@ -1470,11 +1515,20 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Digestion time", - "id": "breastDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "breastDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "breastDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "breastDigestManual", @@ -1594,11 +1648,20 @@ options = [ "tooltip": "How much you grow when absorbing souls. [1]-you will gain equal mass to the souls you absorb. [.01]- you will grow by 1% of the mass of the souls you absorb. This does not stack with Prey growth factor" }, { - "name": "Digestion time", - "id": "soulDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "soulDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "soulDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "soulDigestManual", @@ -1677,11 +1740,20 @@ options = [ "default": "1" }, { - "name": "Digestion time", - "id": "bladderDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "bladderDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "bladderDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "bladderDigestManual", @@ -1763,11 +1835,20 @@ options = [ "tooltip": "How much you grow when absorbing people via goo. [1]-you will gain equal mass to the souls you absorb. [.01]- you will grow by 1% of the mass of the souls you absorb. This does not stack with Prey growth factor" }, { - "name": "Digestion time", - "id": "gooDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "gooDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "gooDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "gooDigestManual", @@ -1792,11 +1873,20 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Digestion time", - "id": "pawDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "pawDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "pawDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "pawDigestManual", @@ -1819,11 +1909,20 @@ options = [ "entries": [ { - "name": "Transfer time", - "id": "cropTransferTime", - "type": "float", - "default": "10" - } + "name": "Automatic transfer", + "id": "cropTransferAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "cropTransferTime", + "type": "float", + "default": "10" + } + ] + }, ] }, { @@ -1964,11 +2063,20 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Digestion time", - "id": "wingDigestTime", - "type": "float", - "default": "15" - }, + "name": "Automatic digestion", + "id": "wingDigestAuto", + "type": "subcategory", + "default": true, + "entries": + [ + { + "name": "Digestion time", + "id": "wingDigestTime", + "type": "float", + "default": "15" + } + ] + }, { "name": "Manual digestion", "id": "wingDigestManual", diff --git a/game.js b/game.js index 4d26137..bec68d7 100644 --- a/game.js +++ b/game.js @@ -527,10 +527,12 @@ let macro = //macro controls every customizable part of the players body return this.scaling(this.droolBaseVolume / 1000 , this.scale, 3); }, - "digest": function(owner, organ, time=15) { + "digest": function(owner, organ, time=15, auto=true) { - // ignore if using manual digestion - if (time != 0) { + // we now have an explicit no-auto-digest flag, but + // some saves will wind up a time of 0 anyway, so I'll + // just leave this here to keep that from breaking things + if (auto && time != 0) { setTimeout(function() { owner.digest(owner, organ, time); }, time * 1000 / organ.stages / macro.fastDigestFactor); } @@ -560,7 +562,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.oralDigestTime); + owner.digest(owner, this, owner.oralDigestTime, owner.oralDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -609,7 +611,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.tailDigestTime); + owner.digest(owner, this, owner.tailDigestTime, owner.tailDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -664,7 +666,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.analDigestTime); + owner.digest(owner, this, owner.analDigestTime, owner.analDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -724,7 +726,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.unbirthDigestTime); + owner.digest(owner, this, owner.unbirthDigestTime, owner.unbirthDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -778,7 +780,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.cockDigestTime); + owner.digest(owner, this, owner.cockDigestTime, owner.cockDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -832,7 +834,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.breastDigestTime); + owner.digest(owner, this, owner.breastDigestTime, owner.breastDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -887,7 +889,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.bladderDigestTime); + owner.digest(owner, this, owner.bladderDigestTime, owner.bladderDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -933,7 +935,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.soulDigestTime); + owner.digest(owner, this, owner.soulDigestTime, owner.soulDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -979,7 +981,7 @@ let macro = //macro controls every customizable part of the players body this.contents.push(new Container()); if (owner.gooDigestion) { - owner.digest(owner, this, owner.gooDigestTime); + owner.digest(owner, this, owner.gooDigestTime, owner.gooDigestAuto); } }, @@ -1028,7 +1030,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.pawDigestTime); + owner.digest(owner, this, owner.pawDigestTime, owner.pawDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -1068,7 +1070,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.cropTransferTime); + owner.digest(owner, this, owner.cropTransferTime, owner.cropTransferAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); @@ -1111,7 +1113,7 @@ let macro = //macro controls every customizable part of the players body this.owner = owner; for (let i = 0; i < this.stages; i++) this.contents.push(new Container()); - owner.digest(owner, this, owner.wingDigestTime); + owner.digest(owner, this, owner.wingDigestTime, owner.wingDigestAuto); }, "feed": function(prey) { this.feedFunc(prey,this,this.owner); diff --git a/migrations.js b/migrations.js index cb0c4e1..40b631f 100644 --- a/migrations.js +++ b/migrations.js @@ -1,9 +1,42 @@ // bumps save versions migrations = [ - (save) => { - // does nothing + // 0 -> 1 + + // does nothing + save => { + }, + // 1 -> 2 + + // automatic digestion is now a subcategory, so anyone with + // a digest time of 0 should have that unset + save => { + if (save.oralDigestTime == 0) + save.oralDigestAuto = false; + if (save.analDigestTime == 0) + save.analDigestAuto = false; + if (save.tailDigestTime == 0) + save.tailDigestAuto = false; + if (save.cockDigestTime == 0) + save.cockDigestAuto = false; + if (save.unbirthDigestTime == 0) + save.unbirthDigestAuto = false; + if (save.breastDigestTime == 0) + save.breastDigestAuto = false; + if (save.soulDigestTime == 0) + save.soulDigestAuto = false; + if (save.bladderDigestTime == 0) + save.bladderDigestAuto = false; + if (save.gooDigestTime == 0) + save.gooDigestAuto = false; + if (save.pawDigestTime == 0) + save.pawDigestAuto = false; + if (save.cropTransferTime == 0) + save.cropTransferAuto = false; + if (save.wingDigestTime == 0) + save.wingDigestAuto = false; } + ]; function migrate(save, target=null) { @@ -29,6 +62,7 @@ function migrate(save, target=null) { for (let x = version; x < target; x++) { migrations[x](save); } + save.version = target; } else { return false; } From 10e7136eff105ff1080c0315ca0c89390e3e14bb Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 16:51:30 -0500 Subject: [PATCH 31/44] Make layout improvements for character creation. Nested subcategories are now centered. Toggleable settings have proper widthsn ow --- style.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/style.css b/style.css index 594bf11..f49dba6 100644 --- a/style.css +++ b/style.css @@ -347,7 +347,7 @@ input[type="checkbox"]:checked ~ .reveal-if-active { .custom-category-sub { text-align: center; margin: 10px; - width: 400px; + width: 100%; padding: 0px; margin: 0px 50px; } @@ -449,7 +449,7 @@ body.dark input[type="checkbox"]:checked+ .flex-outer input[type="radio"] + label:not(.custom-header), .flex-outer input[type="checkbox"] + label:not(.custom-header) { user-select: none; - flex: 1 0 400px; + flex: 1 0 100%; font-size: 24px; } @@ -498,7 +498,8 @@ body.light .flex-outer input[type="checkbox"]:checked + label:not(.custom-header display: flex; flex-wrap: wrap; align-items: center; - width: 400px; + margin: auto; + width: 90%; } body.light .has-tooltip { From fd0174c9f37ebd8df77a78c27ffc38d659b9eb2f Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 17:40:17 -0500 Subject: [PATCH 32/44] Add tooltips for passive production settings --- features.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/features.js b/features.js index 04c7c25..4292378 100644 --- a/features.js +++ b/features.js @@ -1187,6 +1187,7 @@ options = [ "type": "float", "default": "0.01", "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Cum storage factor", @@ -1350,7 +1351,8 @@ options = [ "id": "baseFemcumProduction", "type": "float", "default": "0.01", - "unit": "volume" + "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Femcum storage factor", @@ -1478,7 +1480,8 @@ options = [ "id": "baseLactationProduction", "type": "float", "default": "0.001", - "unit": "volume" + "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Milk storage scale", @@ -1609,7 +1612,8 @@ options = [ "id": "baseGasProduction", "type": "float", "default": "0.01", - "unit": "volume" + "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Gas storage scale", @@ -1705,7 +1709,8 @@ options = [ "id": "basePissProduction", "type": "float", "default": "0.01", - "unit": "volume" + "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Piss storage scale", @@ -1797,7 +1802,8 @@ options = [ "id": "baseScatProduction", "type": "float", "default": "0.001", - "unit": "volume" + "unit": "volume", + "tooltip": "The fraction of your maximum capacity produced every second" }, { "name": "Scat storage scale", From 41ec1b0f74878680f217eaa6387bc9afaf02ac89 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 17:54:34 -0500 Subject: [PATCH 33/44] Adjust appearance of text items in the creation screen. Add arousal help --- features.js | 12 ++++++++++-- game.js | 5 +++++ style.css | 3 ++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/features.js b/features.js index 4292378..819a395 100644 --- a/features.js +++ b/features.js @@ -1017,17 +1017,25 @@ options = [ "warning": "Arousal is enabled", "entries": [ + { + "name": "Help", + "id": "", + "type": "label", + "tooltip": "Most actions increase arousal, as does digestion and being overfilled.\nEdging occurs when you're near orgasm, and increases the total volume of the orgasm." + }, { "name": "Arousal multiplier", "id": "arousalFactor", "type": "float", - "default": "1" + "default": "1", + "tooltip": "How quickly arousal and orgasm builds." }, { "name": "Edge multiplier", "id": "edgeFactor", "type": "float", - "default": "1" + "default": "1", + "tooltip": "How quickly edge builds up." } ] }, diff --git a/game.js b/game.js index bec68d7..6e409c0 100644 --- a/game.js +++ b/game.js @@ -5652,6 +5652,11 @@ function render_label(li, option) { div.textContent = option.name; + if (option.tooltip != undefined) { + div.classList.add("has-tooltip"); + div.setAttribute("title", option.tooltip); + } + li.appendChild(div); } diff --git a/style.css b/style.css index f49dba6..fe1c1fe 100644 --- a/style.css +++ b/style.css @@ -798,7 +798,8 @@ body.dark .meterLabel { .custom-label { text-align: center; font-size: 30px; - width: 100%; + margin: auto; padding-top: 6px; padding-bottom: 6px; + user-select: none; } \ No newline at end of file From e7ff0516075499e08fc87d3936386d4601d598b7 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 18:09:55 -0500 Subject: [PATCH 34/44] Log items fade out over time --- stroll.html | 4 +++- style.css | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/stroll.html b/stroll.html index e23bc30..01a68b3 100644 --- a/stroll.html +++ b/stroll.html @@ -192,7 +192,9 @@
Welcome to Stroll
-

+
+
+
This game features 18+ content
 
diff --git a/style.css b/style.css index fe1c1fe..74917d3 100644 --- a/style.css +++ b/style.css @@ -802,4 +802,22 @@ body.dark .meterLabel { padding-top: 6px; padding-bottom: 6px; user-select: none; +} + +#log > div, +#react-log > div { + animation: log-fade 10s linear; + animation-fill-mode: forwards; +} + +@keyframes log-fade { + 0% { + opacity: 1; + } + 70% { + opacity: 1; + } + 100% { + opacity: 0.6; + } } \ No newline at end of file From 123bad2449f2f2d637f8ca307cf70ccac8d74741 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 18:20:24 -0500 Subject: [PATCH 35/44] Make text fading an option --- features.js | 5 +++++ game.js | 14 ++++++++++++++ style.css | 9 ++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/features.js b/features.js index 819a395..8847420 100644 --- a/features.js +++ b/features.js @@ -486,6 +486,11 @@ panels = { "target": "toggleDarkMode", "default": true }, + { + "name": "Text Stays", + "target": "toggleTextFade", + "default": true + }, { "name": "Debug Log", "target": "debugLog", diff --git a/game.js b/game.js index 6e409c0..d182e35 100644 --- a/game.js +++ b/game.js @@ -38,6 +38,7 @@ let text_verbosity = "verbose"; let autoVerbose = true; +let textFade = false; let newline = " "; @@ -5331,6 +5332,19 @@ function updatePreview(name) { document.getElementById(name + "Preview").innerHTML = result; } +function toggleTextFade() { + const button = document.querySelector("#button-option-toggleTextFade"); + if (textFade) { + document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", "none")); + button.textContent = "Text Stays" + } else { + document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", "log-fade 10s linear")); + button.textContent = "Text Fades" + } + + textFade = !textFade; +} + function debugLog() { console.log("Your character settings:"); console.log(JSON.stringify(generateSettings()["settings"])); diff --git a/style.css b/style.css index 74917d3..0682db7 100644 --- a/style.css +++ b/style.css @@ -804,9 +804,12 @@ body.dark .meterLabel { user-select: none; } -#log > div, -#react-log > div { - animation: log-fade 10s linear; +.log { + --fade-animation: none; +} + +.log > div { + animation: var(--fade-animation); animation-fill-mode: forwards; } From a5bfd2e399317a9540214b5fd6f66e34ea7b90fe Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 18:24:04 -0500 Subject: [PATCH 36/44] Remove duplicate scale-growth-with-size button --- features.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/features.js b/features.js index 8847420..0c344d7 100644 --- a/features.js +++ b/features.js @@ -661,12 +661,6 @@ options = [ } ] }, - { - "name": "Scale growth with size", - "id": "growthScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you gain ten times as much mass when digesting prey" - }, { "name": "Automatic Growth", "id": "automaticGrowth", From 35f72bf4eebcf1f300366a2f170766a11daf7e83 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 18:48:50 -0500 Subject: [PATCH 37/44] Add option to make text vanish entirely. --- game.js | 33 ++++++++++++++++++++++++--------- stroll.html | 1 + style.css | 20 +++++++++++++++++++- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/game.js b/game.js index d182e35..f4619ce 100644 --- a/game.js +++ b/game.js @@ -38,7 +38,25 @@ let text_verbosity = "verbose"; let autoVerbose = true; -let textFade = false; +const textFadeChoices = { + stays: { + name: "Text Stays", + animation: "none", + next: "dims" + }, + dims: { + name: "Text Dims", + animation: "log-dim 10s linear", + next: "fades" + }, + fades: { + name: "Text Fades", + animation: "log-fade 10s linear", + next: "stays" + } +}; + +let textFade = textFadeChoices["stays"]; let newline = " "; @@ -5333,16 +5351,13 @@ function updatePreview(name) { } function toggleTextFade() { + textFade = textFadeChoices[textFade.next]; + const button = document.querySelector("#button-option-toggleTextFade"); - if (textFade) { - document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", "none")); - button.textContent = "Text Stays" - } else { - document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", "log-fade 10s linear")); - button.textContent = "Text Fades" - } + button.innerText = textFade.name; + + document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", textFade.animation)); - textFade = !textFade; } function debugLog() { diff --git a/stroll.html b/stroll.html index 01a68b3..fb8b063 100644 --- a/stroll.html +++ b/stroll.html @@ -4,6 +4,7 @@ Stroll + diff --git a/style.css b/style.css index 0682db7..71e0023 100644 --- a/style.css +++ b/style.css @@ -813,7 +813,7 @@ body.dark .meterLabel { animation-fill-mode: forwards; } -@keyframes log-fade { +@keyframes log-dim { 0% { opacity: 1; } @@ -823,4 +823,22 @@ body.dark .meterLabel { 100% { opacity: 0.6; } +} + +@keyframes log-fade { + 0% { + opacity: 1; + } + 70% { + opacity: 1; + height: auto; + } + 99% { + opacity: 0; + height: auto; + } + 100% { + opacity: 0; + height: 0; + } } \ No newline at end of file From 8e6a7a97466a6b4791665bf4bf335b5debd15441 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 19:07:22 -0500 Subject: [PATCH 38/44] Capitalize automatic digestion --- features.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/features.js b/features.js index 0c344d7..871cff3 100644 --- a/features.js +++ b/features.js @@ -842,7 +842,7 @@ options = [ "entries": [ { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "oralDigestAuto", "type": "subcategory", "default": true, @@ -892,7 +892,7 @@ options = [ "unit": "length" }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "analDigestAuto", "type": "subcategory", "default": true, @@ -1093,7 +1093,7 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "tailDigestAuto", "type": "subcategory", "default": true, @@ -1236,7 +1236,7 @@ options = [ "default": "1" }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "cockDigestAuto", "type": "subcategory", "default": true, @@ -1401,7 +1401,7 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "unbirthDigestAuto", "type": "subcategory", "default": true, @@ -1525,7 +1525,7 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "breastDigestAuto", "type": "subcategory", "default": true, @@ -1659,7 +1659,7 @@ options = [ "tooltip": "How much you grow when absorbing souls. [1]-you will gain equal mass to the souls you absorb. [.01]- you will grow by 1% of the mass of the souls you absorb. This does not stack with Prey growth factor" }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "soulDigestAuto", "type": "subcategory", "default": true, @@ -1752,7 +1752,7 @@ options = [ "default": "1" }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "bladderDigestAuto", "type": "subcategory", "default": true, @@ -1848,7 +1848,7 @@ options = [ "tooltip": "How much you grow when absorbing people via goo. [1]-you will gain equal mass to the souls you absorb. [.01]- you will grow by 1% of the mass of the souls you absorb. This does not stack with Prey growth factor" }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "gooDigestAuto", "type": "subcategory", "default": true, @@ -1886,7 +1886,7 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "pawDigestAuto", "type": "subcategory", "default": true, @@ -2076,7 +2076,7 @@ options = [ "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, [1]:all mass goes to this part [.2]:20% part growth-80% overall growth." }, { - "name": "Automatic digestion", + "name": "Automatic Digestion", "id": "wingDigestAuto", "type": "subcategory", "default": true, From 32511920d8b2fc1e359af60387146750d0df6f5d Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 19:07:54 -0500 Subject: [PATCH 39/44] Capitalize automatic transfer too --- features.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features.js b/features.js index 871cff3..83fb236 100644 --- a/features.js +++ b/features.js @@ -1922,7 +1922,7 @@ options = [ "entries": [ { - "name": "Automatic transfer", + "name": "Automatic Transfer", "id": "cropTransferAuto", "type": "subcategory", "default": true, From ee34d8e3c0b7a09ef35876fe88e02946c4832f22 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 19:21:19 -0500 Subject: [PATCH 40/44] Add firefox scrollbar styling --- style.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/style.css b/style.css index 71e0023..64d0210 100644 --- a/style.css +++ b/style.css @@ -806,6 +806,8 @@ body.dark .meterLabel { .log { --fade-animation: none; + scrollbar-color: #e1e1e1 #888; + scrollbar-width: thin; } .log > div { From 763d582fd777f65f476dc910790173098abe38a3 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 19:39:37 -0500 Subject: [PATCH 41/44] Adjust spacing in the character creation screen --- game.js | 4 ++++ style.css | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/game.js b/game.js index f4619ce..45e363c 100644 --- a/game.js +++ b/game.js @@ -5594,6 +5594,8 @@ function render_checkbox_option(li, option) { label.setAttribute("for", option.id); label.innerText = option.name; + label.classList.add("solo"); + attach_form_data(input, option); if (option.tooltip != undefined) { @@ -5652,6 +5654,8 @@ function render_subcategory_option(li, option) { sub_label.setAttribute("for", option.id); sub_label.innerText = option.name; + sub_label.classList.add("solo"); + let sub_div_inner = document.createElement("div"); sub_div_inner.classList.add("reveal-if-active"); diff --git a/style.css b/style.css index 64d0210..de9b5a9 100644 --- a/style.css +++ b/style.css @@ -439,6 +439,7 @@ body.dark input[type="checkbox"]:checked+ align-items: center; text-align: center; width: 500px; + margin: 10px auto; } .flex-outer input[type="radio"], @@ -479,8 +480,15 @@ body.light .flex-outer input[type="checkbox"]:checked + label:not(.custom-header .flex-outer label { flex: 0 1 40%; + text-align: right; + margin-right: 12pt; +} + +.flex-outer label.solo { + text-align: center; } + .flex-outer label + * { flex: 1 1 20%; } @@ -496,9 +504,9 @@ body.light .flex-outer input[type="checkbox"]:checked + label:not(.custom-header .flex-outer-sub li { display: flex; - flex-wrap: wrap; + flex-wrap: nowrap; align-items: center; - margin: auto; + margin: 5px auto; width: 90%; } From afecd177c5759d89cfc762231275972513c37c7e Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 20:03:52 -0500 Subject: [PATCH 42/44] Make soul vore type a dropdown box. Fix incorrect defaults and loading for selects --- features.js | 23 ++++++++++++----------- game.js | 4 ++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/features.js b/features.js index 83fb236..1dd9df3 100644 --- a/features.js +++ b/features.js @@ -1679,26 +1679,27 @@ options = [ "type": "checkbox", "buttons": ["digest_soul"] }, - { - "type": "radio", + { + "name":"Soul vore type", + "type": "select", "id": "soulVoreType", "default": "body", "choices": [ { - "name": "Released", - "value": "release" + "name": "Released", + "value": "release", }, { - "name": "Trapped", - "value": "body" + "name": "Trapped", + "value": "body", }, { - "name": "Digested", - "value": "oblivion" - } - ] - } + "name": "Digested", + "value": "oblivion", + }, + ] + }, ] }, { diff --git a/game.js b/game.js index 45e363c..da2cee2 100644 --- a/game.js +++ b/game.js @@ -5613,6 +5613,7 @@ function render_select_option(li, option) { label.innerText = option.name; let select = document.createElement("select"); + select.setAttribute("id", option.id); select.setAttribute("name", option.id); option.choices.forEach(function(choice) { @@ -5620,6 +5621,9 @@ function render_select_option(li, option) { sub_option.innerText = choice.name; sub_option.setAttribute("value", choice.value); + if (option.default == choice.value) { + sub_option.defaultSelected = true; + } select.appendChild(sub_option); }); From fd5e0f1c045be76db6f6e064308c1a8f31008ee5 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 20:26:18 -0500 Subject: [PATCH 43/44] Make second-level subcategory titles smaller --- style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/style.css b/style.css index de9b5a9..3b0c007 100644 --- a/style.css +++ b/style.css @@ -396,6 +396,10 @@ body.dark .custom-header-static { font-size: 200%; } +.custom-category-sub .custom-category-sub .custom-header { + font-size: 150%; +} + body.light .custom-header { color: #aaa; background-color: rgba(255, 255, 255, 0.3); From b2584888c15d7cb29c12396d55feaa82d3872250 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Wed, 18 Dec 2019 21:05:38 -0500 Subject: [PATCH 44/44] Shade the background for subcategories. Remove excess margin. --- style.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/style.css b/style.css index 3b0c007..49b6526 100644 --- a/style.css +++ b/style.css @@ -349,7 +349,6 @@ input[type="checkbox"]:checked ~ .reveal-if-active { margin: 10px; width: 100%; padding: 0px; - margin: 0px 50px; } body.light .custom-category { @@ -514,6 +513,14 @@ body.light .flex-outer input[type="checkbox"]:checked + label:not(.custom-header width: 90%; } +body.dark .flex-outer-sub { + background: #181818; +} + +body.dark .flex-outer-sub .flex-outer-sub { + background: #222; +} + body.light .has-tooltip { position: relative; display: inline-block;