| @@ -573,12 +573,14 @@ function feed() | |||||
| var area = macro.handArea; | var area = macro.handArea; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.eat(verbose) | |||||
| var line = describe("eat", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), false); | var linesummary = summarize(prey.sum(), false); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| var sound = "Ulp"; | |||||
| if (people < 3) { | |||||
| var sound = ""; | |||||
| if (people == 0) { | |||||
| sound = ""; | |||||
| } else if (people < 3) { | |||||
| sound = "Ulp."; | sound = "Ulp."; | ||||
| } else if (people < 10) { | } else if (people < 10) { | ||||
| sound = "Gulp."; | sound = "Gulp."; | ||||
| @@ -608,7 +610,7 @@ function stomp() | |||||
| { | { | ||||
| var area = macro.pawArea; | var area = macro.pawArea; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.stomp(verbose) | |||||
| var line = describe("stomp", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -646,10 +648,10 @@ function anal_vore() | |||||
| area = macro.assArea; | area = macro.assArea; | ||||
| var crushed = getPrey(biome,area); | var crushed = getPrey(biome,area); | ||||
| var line1 = prey.anal_vore(verbose, macro.height); | |||||
| var line1 = describe("anal-vore", prey, macro, verbose); | |||||
| var line1summary = summarize(prey.sum(), false); | var line1summary = summarize(prey.sum(), false); | ||||
| var line2 = crushed.buttcrush(verbose); | |||||
| var line2 = describe("ass-crush", crushed, macro, verbose); | |||||
| var line2summary = summarize(crushed.sum(), true); | var line2summary = summarize(crushed.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -705,7 +707,7 @@ function breast_crush() | |||||
| { | { | ||||
| var area = macro.breastArea; | var area = macro.breastArea; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.breast_crush(verbose); | |||||
| var line = describe("breast-crush", prey, macro, verbose); | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -739,7 +741,7 @@ function unbirth() | |||||
| { | { | ||||
| var area = macro.vaginaArea; | var area = macro.vaginaArea; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.unbirth(verbose) | |||||
| var line = describe("unbirth", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), false); | var linesummary = summarize(prey.sum(), false); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -776,7 +778,7 @@ function cockslap() | |||||
| { | { | ||||
| var area = macro.dickArea; | var area = macro.dickArea; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.cockslap(verbose) | |||||
| var line = describe("cockslap", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -811,7 +813,7 @@ function cock_vore() | |||||
| { | { | ||||
| var area = macro.dickGirth; | var area = macro.dickGirth; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.cock_vore(verbose) | |||||
| var line = describe("cock-vore", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), false); | var linesummary = summarize(prey.sum(), false); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -847,7 +849,7 @@ function ball_smother() | |||||
| { | { | ||||
| var area = macro.ballArea * 2; | var area = macro.ballArea * 2; | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.ball_smother(verbose) | |||||
| var line = describe("ball-smother", prey, macro, verbose) | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -882,7 +884,7 @@ function male_orgasm(vol) | |||||
| var area = Math.pow(vol, 2/3); | var area = Math.pow(vol, 2/3); | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.male_orgasm(verbose).replace("$VOLUME",volume(vol,unit,false)) | |||||
| var line = describe("male-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)) | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -915,7 +917,7 @@ function female_orgasm(vol) | |||||
| var area = Math.pow(vol, 2/3); | var area = Math.pow(vol, 2/3); | ||||
| var prey = getPrey(biome, area); | var prey = getPrey(biome, area); | ||||
| var line = prey.female_orgasm(verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| var line = describe("female-orgasm", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false)); | |||||
| var linesummary = summarize(prey.sum(), true); | var linesummary = summarize(prey.sum(), true); | ||||
| var people = get_living_prey(prey.sum()); | var people = get_living_prey(prey.sum()); | ||||
| @@ -1,97 +1,84 @@ | |||||
| function configure(dict) { | |||||
| foot = dict.foot; | |||||
| rules = {}; | |||||
| } | |||||
| rules["eat"] = []; | |||||
| rules["stomp"] = []; | |||||
| rules["kick"] = []; | |||||
| rules["anal-vore"] = []; | |||||
| rules["ass-crush"] = []; | |||||
| rules["breast-crush"] = []; | |||||
| rules["unbirth"] = []; | |||||
| rules["cock-vore"] = []; | |||||
| rules["cockslap"] = []; | |||||
| rules["ball-smother"] = []; | |||||
| rules["male-orgasm"] = []; | |||||
| rules["female-orgasm"] = []; | |||||
| function subset(list1,list2) { | |||||
| for (var i = 0; i < list1.length; i++) { | |||||
| if (!list2.includes(list1[i])){ | |||||
| function hasNothing(container, thing, amount) { | |||||
| for (var key in container.contents) { | |||||
| if (container.contents.hasOwnProperty(key)) | |||||
| return false; | return false; | ||||
| } | |||||
| } | } | ||||
| return true; | return true; | ||||
| } | } | ||||
| function seteq(list1,list2) { | |||||
| return list1.length == list2.length && subset(list1,list2); | |||||
| function hasExactly(container, thing, amount) { | |||||
| if (!container.contents.hasOwnProperty(thing) && amount == 0) | |||||
| return true; | |||||
| if (container.contents.hasOwnProperty(thing) && container.contents[thing].count == amount) | |||||
| return true; | |||||
| return false; | |||||
| } | } | ||||
| function getPreyNames(contents) { | |||||
| prey = []; | |||||
| function describe(action, container, macro, verbose=true) { | |||||
| options = []; | |||||
| for (var key in contents) { | |||||
| if (contents.hasOwnProperty(key)) { | |||||
| prey.push(contents[key].name); | |||||
| for (var i = 0; i < rules[action].length; i++) { | |||||
| if(rules[action][i].test(container,macro)) { | |||||
| options.push(rules[action][i].desc); | |||||
| } | } | ||||
| } | } | ||||
| return prey; | |||||
| } | |||||
| function getPreyCounts(contents) { | |||||
| prey = {}; | |||||
| for (var key in contents) { | |||||
| if (contents.hasOwnProperty(key)) { | |||||
| prey[contents[key].name] = contents[key].count; | |||||
| } | |||||
| if (options.length > 0) | |||||
| return options[0](container, macro); | |||||
| else { | |||||
| return describeDefault(action, container, macro, verbose); | |||||
| } | } | ||||
| return prey; | |||||
| } | |||||
| function containerEat(container,verbose=true) { | |||||
| var preyNames = getPreyNames(container.contents); | |||||
| var preyCounts = getPreyCounts(container.contents); | |||||
| return ""; | |||||
| } | } | ||||
| function personEat(person) { | |||||
| if (person.count == 1) { | |||||
| if (Math.random() > 0.5) | |||||
| return "You hoist " + person.describe() + " into the air and stuff them down your gullet. Delicious!"; | |||||
| function describeDefault(action, container, macro, verbose=true) { | |||||
| switch(action) { | |||||
| case "eat": return "You scoop up " + container.describe(verbose) + " and swallow " + (container.count > 1 ? "them" : "it") + " whole."; | |||||
| case "stomp": return "You crush " + container.describe(verbose) + " underfoot."; | |||||
| case "kick": return "You punt " + container.describe(verbose) + ", destroying " + (container.count > 1 ? "them" : "it") + "."; | |||||
| case "anal-vore": return "You sit yourself down on " + container.describe(verbose) + ". " + (container.count > 1 ? "They slide" : "It slides") + " inside with ease."; | |||||
| case "ass-crush": return "Your heavy ass obliterates " + container.describe(verbose) + ". "; | |||||
| case "breast-crush": return "Your heavy breasts obliterate " + container.describe(verbose) + ". "; | |||||
| case "unbirth": return "You gasp as you slide " + container.describe(verbose) + " up your slit. "; | |||||
| case "cock-vore": return "You stuff " + container.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls."; | |||||
| case "cockslap": return "Your swaying shaft crushes " + container.describe(verbose) + ". "; | |||||
| case "ball-smother": return "Your weighty balls spread over " + container.describe(verbose) + ", smothering them in musk."; | |||||
| case "male-orgasm": return "You're cumming! Your thick cock spurts out $VOLUME of seed, splooging " + container.describe(verbose) + "."; | |||||
| case "female-orgasm": return "You're cumming! Your moist slit sprays $VOLUME of slick femcum, splooging " + container.describe(verbose) + "."; | |||||
| } | } | ||||
| else if (person.count <= 3) { | |||||
| if (Math.random() > 0.5) | |||||
| return "You reach down with both hands, snagging " + (person.count == 2 ? "two" : "three") + " meals. You savor their taste, " + person.describe() + " slipping past your lips and down your throat, one-by-one."; | |||||
| } | |||||
| else if (person.count < 5) { | |||||
| if (Math.random() > 0.5) | |||||
| return "You reach down and snatch up a fistful of snacks, stuffing " + person.count + " people into your maw and swallowing deeply."; | |||||
| } | |||||
| return ""; | |||||
| } | } | ||||
| function personStomp(person) { | |||||
| if (person.count == 1) { | |||||
| var choice = Math.random(); | |||||
| if (choice < 0.2) | |||||
| return "Your heavy paw smashes a " + person.describe() + " like a bug. Splat."; | |||||
| else if (choice < 0.4) | |||||
| return "A wayward step obliterates a " + person.describe(); | |||||
| else if (choice < 0.6) | |||||
| return "You lunge at a " + person.describe() + " with your toes outstretched, squashing them flat."; | |||||
| } | |||||
| else if (person.count <= 3) { | |||||
| if (Math.random() > 0.5) | |||||
| return "Your paw comes down on " + person.describe() + ". " + (person.count == 2 ? "Both" : "All three") + " crunch beneath your heavy toes."; | |||||
| } | |||||
| // EATING | |||||
| return ""; | |||||
| } | |||||
| function skyscraperAnalVore(skyscraper,verbose=true,height = 10) { | |||||
| if (height < 5000) { | |||||
| if (verbose) | |||||
| return "You ease yourself down over the skyscraper, spreading your ass wide as you take it to the ground - then, with a powerful clench, snap it from its base. " + describe_all(skyscraper.contents) + " are sealed away in your ass."; | |||||
| else | |||||
| return "You ease yourself down over the skyscraper, spreading your ass wide as you take it to the ground - then, with a powerful clench, snap it from its base. "; | |||||
| } else { | |||||
| if (verbose) | |||||
| return "You stuff the skyscraper up your ass with ease. Bad luck for " + describe_all(skyscraper.contents) + " inside."; | |||||
| else | |||||
| return "You stuff the skyscraper up your ass with ease."; | |||||
| rules["eat"].push({ | |||||
| "test": function(container, macro) { | |||||
| return hasNothing(container); | |||||
| }, | |||||
| "desc": function(container, macro) { | |||||
| return "You scoop up...nothing. Oh well."; | |||||
| } | } | ||||
| }); | |||||
| return ""; | |||||
| } | |||||
| rules["eat"].push({ | |||||
| "test": function(container, macro) { | |||||
| return hasExactly(container, "Person", 1); | |||||
| }, | |||||
| "desc": function(conatiner, macro) { | |||||
| return "you eat them lol"; | |||||
| } | |||||
| }); | |||||
| @@ -236,56 +236,6 @@ function distribution(min, max, samples) { | |||||
| return result; | return result; | ||||
| } | } | ||||
| /* default actions */ | |||||
| function defaultStomp(thing) { | |||||
| return function (verbose=true,height=10) { return "You crush " + thing.describe(verbose) + " underfoot."}; | |||||
| } | |||||
| function defaultKick(thing) { | |||||
| return function(verbose=true,height=10) { return "You punt " + thing.describe(verbose) + ", destroying " + (thing.count > 1 ? "them" : "it") + "."; } | |||||
| } | |||||
| function defaultEat(thing) { | |||||
| return function(verbose=true,height=10) { return "You scoop up " + thing.describe(verbose) + " and swallow " + (thing.count > 1 ? "them" : "it") + " whole."; } | |||||
| } | |||||
| function defaultAnalVore(thing) { | |||||
| return function(verbose=true,height=10) { return "You sit yourself down on " + thing.describe(verbose) + ". " + (thing.count > 1 ? "They slide" : "It slides") + " inside with ease."; } | |||||
| } | |||||
| function defaultButtcrush(thing) { | |||||
| return function(verbose=true,height=10) { return "Your heavy ass obliterates " + thing.describe(verbose) + ". "; } | |||||
| } | |||||
| function defaultBreastCrush(thing) { | |||||
| return function(verbose=true,height=10) { return "Your heavy breasts obliterate " + thing.describe(verbose) + ". "; } | |||||
| } | |||||
| function defaultUnbirth(thing) { | |||||
| return function(verbose=true,height=10) { return "You gasp as you slide " + thing.describe(verbose) + " up your slit. "; } | |||||
| } | |||||
| function defaultCockslap(thing) { | |||||
| return function(verbose=true,height=10) { return "Your swaying shaft crushes " + thing.describe(verbose) + ". "; } | |||||
| } | |||||
| function defaultCockVore(thing) { | |||||
| return function(verbose=true,height=10) { return "You stuff " + thing.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls."; } | |||||
| } | |||||
| function defaultBallSmother(thing) { | |||||
| return function(verbose=true,height=10) { return "Your weighty balls spread over " + thing.describe(verbose) + ", smothering them in musk."; } | |||||
| } | |||||
| function defaultMaleOrgasm(thing) { | |||||
| return function(verbose=true,height=10) { return "You're cumming! Your thick cock spurts out $VOLUME of seed, splooging " + thing.describe(verbose) + "."; } | |||||
| } | |||||
| function defaultFemaleOrgasm(thing) { | |||||
| return function(verbose=true,height=10) { return "You're cumming! Your moist slit sprays $VOLUME of slick femcum, splooging " + thing.describe(verbose) + "."; } | |||||
| } | |||||
| function defaultArea(thing) { | function defaultArea(thing) { | ||||
| return areas[thing.name]; | return areas[thing.name]; | ||||
| } | } | ||||
| @@ -422,20 +372,7 @@ function Container(contents = []) { | |||||
| else | else | ||||
| return line; | return line; | ||||
| }; | }; | ||||
| this.stomp = defaultStomp(this); | |||||
| this.eat = defaultEat(this); | |||||
| this.kick = defaultKick(this); | |||||
| this.anal_vore = defaultAnalVore(this); | |||||
| this.buttcrush = defaultButtcrush(this); | |||||
| this.breast_crush = defaultBreastCrush(this); | |||||
| this.unbirth = defaultUnbirth(this); | |||||
| this.cockslap = defaultCockslap(this); | |||||
| this.cock_vore = defaultCockVore(this); | |||||
| this.ball_smother = defaultBallSmother(this); | |||||
| this.male_orgasm = defaultMaleOrgasm(this); | |||||
| this.female_orgasm = defaultFemaleOrgasm(this); | |||||
| return this; | return this; | ||||
| } | } | ||||