From c6f2037ca600711e0cd4bedcaad03620f4bb65da Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Mon, 25 Jul 2022 10:47:49 -0400 Subject: [PATCH] Format the codebase with Prettier --- .prettierrc | 4 + features.js | 3849 ++++++++-------- game.js | 4998 ++++++++++++-------- migrations.js | 77 +- presets.js | 1658 ++++--- recursive-desc.js | 10602 +++++++++++++++++++++++++++---------------- recursive-macro.js | 1298 ++++-- sounds.js | 117 +- units.js | 348 +- 9 files changed, 13905 insertions(+), 9046 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..222861c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "useTabs": false +} diff --git a/features.js b/features.js index 90057af..57491ad 100644 --- a/features.js +++ b/features.js @@ -4,2265 +4,2242 @@ const groupInfo = { "body-part": { name: "Body parts", }, - "nsfw": { - name: "Sexual parts" + nsfw: { + name: "Sexual parts", }, "alt-vore": { - name: "Alt vore" + name: "Alt vore", }, - "gross": { - name: "Disposal/waste" + gross: { + name: "Disposal/waste", }, - "magic": { - name: "Magic" - } -} + magic: { + name: "Magic", + }, +}; const panels = { - "body": { - "name": "Body", - "buttons": [ + body: { + name: "Body", + buttons: [ { - "name": "Eat", - "target": "feed" + name: "Eat", + target: "feed", }, { - "name": "Crop Swallow", - "target": "crop_swallow" + name: "Crop Swallow", + target: "crop_swallow", }, { - "name": "Digest", - "target": "digest_stomach" + name: "Digest", + target: "digest_stomach", }, { - "name": "Chew", - "target": "chew" + name: "Chew", + target: "chew", }, { - "name": "Grab", - "target": "hand_crush" + name: "Grab", + target: "hand_crush", }, { - "name": "Drool", - "target": "drool" + name: "Drool", + target: "drool", }, { - "name": "Vomit", - "target": "vomit" + name: "Vomit", + target: "vomit", }, { - "name": "Sit", - "target": "sit" + name: "Sit", + target: "sit", }, { - "name": "Grind ass", - "target": "ass_grind" + name: "Grind ass", + target: "ass_grind", }, { - "name": "Anal Vore", - "target": "anal_vore" + name: "Anal Vore", + target: "anal_vore", }, { - "name": "Digest Bowels", - "target": "digest_anal" + name: "Digest Bowels", + target: "digest_anal", }, { - "name": "Grind hips", - "target": "grind" - } - ] + name: "Grind hips", + target: "grind", + }, + ], }, - "paws": { - "name": "Paws", - "buttons": [ + paws: { + name: "Paws", + buttons: [ { - "name": "Stomp", - "target": "stomp" + name: "Stomp", + target: "stomp", }, { - "name": "Grab", - "target": "foot_crush" + name: "Grab", + target: "foot_crush", }, { - "name": "Flex Toes", - "target": "flex_toes" + name: "Flex Toes", + target: "flex_toes", }, { - "name": "Absorb", - "target": "paw_vore" + name: "Absorb", + target: "paw_vore", }, { - "name": "Digest", - "target": "digest_paws" - } - ] + name: "Digest", + target: "digest_paws", + }, + ], }, - "tails": { - "name": "Tails", - "buttons": [ + tails: { + name: "Tails", + buttons: [ { - "name": "Tail Slap", - "target": "tail_slap" + name: "Tail Slap", + target: "tail_slap", }, { - "name": "Tail Vore", - "target": "tail_vore_only" + name: "Tail Vore", + target: "tail_vore_only", }, { - "name": "Tail Vore (1)", - "target": "tail_vore_one" + name: "Tail Vore (1)", + target: "tail_vore_one", }, { - "name": "Tail Vore (some)", - "target": "tail_vore_some" + name: "Tail Vore (some)", + target: "tail_vore_some", }, { - "name": "Tail Vore (all!)", - "target": "tail_vore_all" + name: "Tail Vore (all!)", + target: "tail_vore_all", }, { - "name": "Digest", - "target": "digest_tail" - } - ] + name: "Digest", + target: "digest_tail", + }, + ], }, - "breasts": { - "name": "Breasts", - "buttons": [ + breasts: { + name: "Breasts", + buttons: [ { - "name": "Stuff Cleavage", - "target": "cleavage_stuff" + name: "Stuff Cleavage", + target: "cleavage_stuff", }, { - "name": "Squeeze Cleavage", - "target": "breast_toy" + name: "Squeeze Cleavage", + target: "breast_toy", }, { - "name": "Crush Cleavage", - "target": "cleavage_crush" + name: "Crush Cleavage", + target: "cleavage_crush", }, { - "name": "Drop Cleavage", - "target": "cleavage_drop" + name: "Drop Cleavage", + target: "cleavage_drop", }, { - "name": "Absorb Cleavage", - "target": "cleavage_absorb" + name: "Absorb Cleavage", + target: "cleavage_absorb", }, { - "name": "Breast Crush", - "target": "breast_crush" + name: "Breast Crush", + target: "breast_crush", }, { - "name": "Breast Vore", - "target": "breast_vore" + name: "Breast Vore", + target: "breast_vore", }, { - "name": "Digest", - "target": "digest_breast" + name: "Digest", + target: "digest_breast", }, { - "name": "Milk Breasts", - "target": "breast_milk" - } - ] + name: "Milk Breasts", + target: "breast_milk", + }, + ], }, - "vagina": { - "name": "Slit", - "buttons": [ + vagina: { + name: "Slit", + buttons: [ { - "name": "Unbirth", - "target": "unbirth" + name: "Unbirth", + target: "unbirth", }, { - "name": "Digest", - "target": "digest_unbirth" + name: "Digest", + target: "digest_unbirth", }, { - "name": "Finger Slit", - "target": "slit_toy" - } - ] + name: "Finger Slit", + target: "slit_toy", + }, + ], }, - "dick": { - "name": "Cock", - "buttons": [ + dick: { + name: "Cock", + buttons: [ { - "name": "Cockslap", - "target": "cockslap" + name: "Cockslap", + target: "cockslap", }, { - "name": "Cock Vore", - "target": "cock_vore" + name: "Cock Vore", + target: "cock_vore", }, { - "name": "Digest", - "target": "digest_cock" + name: "Digest", + target: "digest_cock", }, { - "name": "Ball Smother", - "target": "ball_smother" + name: "Ball Smother", + target: "ball_smother", }, { - "name": "Stuff Sheath", - "target": "sheath_stuff" + name: "Stuff Sheath", + target: "sheath_stuff", }, { - "name": "Squeeze Sheath", - "target": "sheath_toy" + name: "Squeeze Sheath", + target: "sheath_toy", }, { - "name": "Clench Sheath", - "target": "sheath_clench" + name: "Clench Sheath", + target: "sheath_clench", }, { - "name": "Absorb Sheath", - "target": "sheath_absorb" + name: "Absorb Sheath", + target: "sheath_absorb", }, { - "name": "Stuff Foreskin", - "target": "foreskin_stuff" + name: "Stuff Foreskin", + target: "foreskin_stuff", }, { - "name": "Squeeze Foreskin", - "target": "foreskin_toy" + name: "Squeeze Foreskin", + target: "foreskin_toy", }, { - "name": "Clench Foreskin", - "target": "foreskin_clench" + name: "Clench Foreskin", + target: "foreskin_clench", }, { - "name": "Absorb Foreskin", - "target": "foreskin_absorb" - } - ] + name: "Absorb Foreskin", + target: "foreskin_absorb", + }, + ], }, - "souls": { - "name": "Souls", - "buttons": [ + souls: { + name: "Souls", + buttons: [ { - "name": "Soul Vore", - "target": "soul_vore" + name: "Soul Vore", + target: "soul_vore", }, { - "name": "Digest", - "target": "digest_soul" + name: "Digest", + target: "digest_soul", }, { - "name": "Paws", - "target": "soul_absorb_paw" - } - ] + name: "Paws", + target: "soul_absorb_paw", + }, + ], }, - "shoes": { - "name": "Footwear", - "buttons": [ + shoes: { + name: "Footwear", + buttons: [ { - "name": "Put On Shoes", - "target": "wear_shoes" + name: "Put On Shoes", + target: "wear_shoes", }, { - "name": "Take Off Shoes", - "target": "remove_shoes" + name: "Take Off Shoes", + target: "remove_shoes", }, { - "name": "Put On Socks", - "target": "wear_socks" + name: "Put On Socks", + target: "wear_socks", }, { - "name": "Take Off Socks", - "target": "remove_socks" + name: "Take Off Socks", + target: "remove_socks", }, { - "name": "Stuff Shoes", - "target": "stuff_shoes" + name: "Stuff Shoes", + target: "stuff_shoes", }, { - "name": "Stuff Socks", - "target": "stuff_socks" + name: "Stuff Socks", + target: "stuff_socks", }, { - "name": "Dump Shoes", - "target": "dump_shoes" + name: "Dump Shoes", + target: "dump_shoes", }, { - "name": "Dump Socks", - "target": "dump_socks" - } - ] + name: "Dump Socks", + target: "dump_socks", + }, + ], }, - "waste": { - "name": "Waste", - "buttons": [ + waste: { + name: "Waste", + buttons: [ { - "name": "Belch", - "target": "belch" + name: "Belch", + target: "belch", }, { - "name": "Fart", - "target": "fart" + name: "Fart", + target: "fart", }, { - "name": "Piss", - "target": "piss" + name: "Piss", + target: "piss", }, { - "name": "Bladder Vore", - "target": "bladder_vore" + name: "Bladder Vore", + target: "bladder_vore", }, { - "name": "Digest", - "target": "digest_bladder" + name: "Digest", + target: "digest_bladder", }, { - "name": "Scat", - "target": "scat" - } - ] + name: "Scat", + target: "scat", + }, + ], }, - "goo": { - "name": "Goo", - "buttons": [ + goo: { + name: "Goo", + buttons: [ { - "name": "Solidify", - "target": "solidify" + name: "Solidify", + target: "solidify", }, { - "name": "Melt", - "target": "melt" + name: "Melt", + target: "melt", }, { - "name": "Flood", - "target": "flood" + name: "Flood", + target: "flood", }, { - "name": "Push to Stomach", - "target": "goo_stomach_push" + name: "Push to Stomach", + target: "goo_stomach_push", }, { - "name": "Pull from Stomach", - "target": "goo_stomach_pull" + name: "Pull from Stomach", + target: "goo_stomach_pull", }, { - "name": "Push to Bowels", - "target": "goo_bowels_push" + name: "Push to Bowels", + target: "goo_bowels_push", }, { - "name": "Pull from Bowels", - "target": "goo_bowels_pull" + name: "Pull from Bowels", + target: "goo_bowels_pull", }, { - "name": "Push to Womb", - "target": "goo_womb_push" + name: "Push to Womb", + target: "goo_womb_push", }, { - "name": "Pull from Womb", - "target": "goo_womb_pull" + name: "Pull from Womb", + target: "goo_womb_pull", }, { - "name": "Push to Balls", - "target": "goo_balls_push" + name: "Push to Balls", + target: "goo_balls_push", }, { - "name": "Pull from Balls", - "target": "goo_balls_pull" + name: "Pull from Balls", + target: "goo_balls_pull", }, { - "name": "Push to Breasts", - "target": "goo_breasts_push" + name: "Push to Breasts", + target: "goo_breasts_push", }, { - "name": "Pull from Breasts", - "target": "goo_breasts_pull" + name: "Pull from Breasts", + target: "goo_breasts_pull", }, { - "name": "Push to Tails", - "target": "goo_tail_push" + name: "Push to Tails", + target: "goo_tail_push", }, { - "name": "Pull from Tails", - "target": "goo_tail_pull" + name: "Pull from Tails", + target: "goo_tail_pull", }, { - "name": "Push to Paws", - "target": "goo_paws_push" + name: "Push to Paws", + target: "goo_paws_push", }, { - "name": "Pull from Paws", - "target": "goo_paws_pull" + name: "Pull from Paws", + target: "goo_paws_pull", }, { - "name": "Digest", - "target": "digest_goo" - } - ] + name: "Digest", + target: "digest_goo", + }, + ], }, - "misc": { - "name": "Misc", - "buttons": [ + misc: { + name: "Misc", + buttons: [ { - "name": "Stuff Pouch", - "target": "pouch_stuff" + name: "Stuff Pouch", + target: "pouch_stuff", }, { - "name": "Rub Pouch", - "target": "pouch_rub" + name: "Rub Pouch", + target: "pouch_rub", }, { - "name": "Eat From Pouch", - "target": "pouch_eat" + name: "Eat From Pouch", + target: "pouch_eat", }, { - "name": "Absorb Pouch", - "target": "pouch_absorb" + name: "Absorb Pouch", + target: "pouch_absorb", }, { - "name": "Flap Wings", - "target": "wings_flap" + name: "Flap Wings", + target: "wings_flap", }, { - "name": "Wing Vore", - "target": "wings_vore" + name: "Wing Vore", + target: "wings_vore", }, { - "name": "Digest Wings", - "target": "digest_wings" - } - ] + name: "Digest Wings", + target: "digest_wings", + }, + ], }, - "breath": { - "name": "Breath", - "buttons": [ + breath: { + name: "Breath", + buttons: [ { - "name": "Line Shape", - "target": "breath_line" + name: "Line Shape", + target: "breath_line", }, { - "name": "Cone Shape", - "target": "breath_cone" + name: "Cone Shape", + target: "breath_cone", }, { - "name": "Fire", - "target": "breath_fire" + name: "Fire", + target: "breath_fire", }, { - "name": "Ice", - "target": "breath_ice" + name: "Ice", + target: "breath_ice", }, { - "name": "Electric", - "target": "breath_electric" + name: "Electric", + target: "breath_electric", }, { - "name": "Smoke", - "target": "breath_smoke" + name: "Smoke", + target: "breath_smoke", }, { - "name": "Radiation", - "target": "breath_radiation" + name: "Radiation", + target: "breath_radiation", }, { - "name": "Foul", - "target": "breath_foul" - } - ] + name: "Foul", + target: "breath_foul", + }, + ], }, - "magic": { - "name": "Magic", - "buttons": [ + magic: { + name: "Magic", + buttons: [ { - "name": "Shrink", - "target": "magic_shrink" + name: "Shrink", + target: "magic_shrink", }, { - "name": "Fast Digestion", - "target": "magic_fast_digestion" + name: "Fast Digestion", + target: "magic_fast_digestion", }, { - "name": "Pause Digestion", - "target": "magic_pause_digestion" + name: "Pause Digestion", + target: "magic_pause_digestion", }, { - "name": "Arousal", - "target": "magic_arousal" + name: "Arousal", + target: "magic_arousal", }, { - "name": "Summon Cum", - "target": "magic_fill_sexual" - } - ] + name: "Summon Cum", + target: "magic_fill_sexual", + }, + ], }, - "options": { - "name": "Options", - "type": "options", - "buttons": [ + options: { + name: "Options", + type: "options", + buttons: [ { - "name": "Arousal On", - "target": "toggle_arousal", - "default": true + name: "Arousal On", + target: "toggle_arousal", + default: true, }, { - "name": "Status: Standing", - "target": "toggle_auto", - "default": true + name: "Status: Standing", + target: "toggle_auto", + default: true, }, { - "name": "Numbers: Words", - "target": "toggle_numbers", - "default": true + name: "Numbers: Words", + target: "toggle_numbers", + default: true, }, { - "name": "Units: Metric", - "target": "toggle_units", - "default": true + name: "Units: Metric", + target: "toggle_units", + default: true, }, { - "name": "Verbose Text", - "target": "toggle_verbose", - "default": true + name: "Verbose Text", + target: "toggle_verbose", + default: true, }, { - "name": "Toggle Dark Mode", - "target": "toggleDarkMode", - "default": true + name: "Toggle Dark Mode", + target: "toggleDarkMode", + default: true, }, { - "name": "Text Stays", - "target": "toggleTextFade", - "default": true + name: "Text Stays", + target: "toggleTextFade", + default: true, }, { - "name": "Debug Log", - "target": "debugLog", - "default": true - } - ] - } -} - + name: "Debug Log", + target: "debugLog", + default: true, + }, + ], + }, +}; options = [ { - "name": "Basics", - "optional": false, - "group": "main", - "entries": [ + name: "Basics", + optional: false, + group: "main", + entries: [ { - "name": "Name", - "id": "name", - "type": "text", - "default": "Fen" + name: "Name", + id: "name", + type: "text", + default: "Fen", }, { - "name": "Scale", - "id": "scale", - "type": "float", - "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: "Scale", + id: "scale", + type: "float", + 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: "Walk Speed", + id: "walkSpeed", + type: "float", + default: "1", + tooltip: "How quickly you move while walking, jogging, or running.", }, { - "name": "Height", - "id": "baseHeight", - "type": "float", - "default": "2.26", - "unit": "length" + name: "Height", + id: "baseHeight", + type: "float", + default: "2.26", + unit: "length", }, { - "name": "Weight", - "id": "baseMass", - "type": "float", - "default": "135", - "unit": "mass" + name: "Weight", + id: "baseMass", + type: "float", + default: "135", + unit: "mass", }, { - "name": "Paw length", - "id": "basePawLength", - "type": "float", - "default": "0.15", - "unit": "length" + name: "Paw length", + id: "basePawLength", + type: "float", + default: "0.15", + unit: "length", }, { - "name": "Paw width", - "id": "basePawWidth", - "type": "float", - "default": "0.15", - "unit": "length" + name: "Paw width", + id: "basePawWidth", + type: "float", + default: "0.15", + unit: "length", }, { - "name": "Hand length", - "id": "baseHandLength", - "type": "float", - "default": "0.2", - "unit": "length" + name: "Hand length", + id: "baseHandLength", + type: "float", + default: "0.2", + unit: "length", }, { - "name": "Hand width", - "id": "baseHandWidth", - "type": "float", - "default": "0.15", - "unit": "length" + name: "Hand width", + id: "baseHandWidth", + type: "float", + default: "0.15", + unit: "length", }, { - "name": "Ass area", - "id": "baseAssArea", - "type": "float", - "default": "0.1", - "unit": "area" + name: "Ass area", + id: "baseAssArea", + type: "float", + default: "0.1", + unit: "area", }, { - "name": "Same-size stomping", - "id": "sameSizeStomp", - "type": "checkbox" - } - ] - }, - { - "name": "Extra Info", - "optional": false, - "group": "main", - "entries": - [ - { - "name": "Bio", - "id": "bio", - "type": "text", - "default": "Big stompy monster, innit" - } - ] + name: "Same-size stomping", + id: "sameSizeStomp", + type: "checkbox", + }, + ], }, { - "name": "Body Details", - "optional": false, - "group": "main", - "entries": - [ - { - "name": "Species", - "id": "species", - "type": "text", - "default": "crux" - }, - { - "name": "Foot type", - "id": "footType", - "type": "select", - "default": "paw", - "choices": - [ - { - "name": "Paws", - "value": "paw" - }, - { - "name": "Hooves", - "value": "hoof" - }, - { - "name": "Feet", - "value": "foot", - }, - { - "name": "Avian", - "value": "avian" - } - ] - }, - { - "name": "Mouth type", - "id": "jawType", - "type": "select", - "default": "jaw", - "choices": - [ - { - "name": "Jaws", - "value": "jaw" - }, - { - "name": "Beak", - "value": "beak" - } - ] - } - ] + name: "Extra Info", + optional: false, + group: "main", + entries: [ + { + name: "Bio", + id: "bio", + type: "text", + default: "Big stompy monster, innit", + }, + ], }, { - "name": "Gameplay", - "optional": false, - "group": "main", - "entries": - [ - { - "type": "radio", - "id": "difficulty", - "default": "0", - "choices": - [ - { - "name": "Sandbox", - "value": "0", - "tooltip": "Grow how you want, when you want.", - }, - { - "name": "Stompvival", - "value": "1", - "tooltip": "Actions earn you growth points, which are used to grow bigger.", - } - ] - }, - { - "name": "Automatic Growth", - "id": "automaticGrowthEnabled", - "type": "subcategory", - "entries": - [ - { - "name": "Help", - "id": "", - "type": "label", - "tooltip": "When checked, you will automaically grow by ingesting/absorbing mass." - }, - { - "name": "Prey growth factor", - "id": "basePreyGrowthFactor", - "type": "float", - "default": "80", - "unit": "percentage", - "tooltip": "How much of what you eat gets automatically added to your body. Setting this to 0% disables it. To add half of your prey mass to your own, set to 50%." - }, - { - "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": "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": "Enabled biomes:", - "id": "", - "type": "label", - }, - { - "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: "Body Details", + optional: false, + group: "main", + entries: [ + { + name: "Species", + id: "species", + type: "text", + default: "crux", + }, + { + name: "Foot type", + id: "footType", + type: "select", + default: "paw", + choices: [ + { + name: "Paws", + value: "paw", + }, + { + name: "Hooves", + value: "hoof", + }, + { + name: "Feet", + value: "foot", + }, + { + name: "Avian", + value: "avian", + }, + ], + }, + { + name: "Mouth type", + id: "jawType", + type: "select", + default: "jaw", + choices: [ + { + name: "Jaws", + value: "jaw", + }, + { + name: "Beak", + value: "beak", + }, + ], + }, + ], }, { - "name": "Brutality", - "optional": false, - "group": "main", - "entries": - [ - { - "type": "radio", - "id": "brutality", - "default": "1", - "choices": - [ - { - "name": "Non-fatal", - "value": "0", - "tooltip": "All actions are explicitly safe." + name: "Gameplay", + optional: false, + group: "main", + entries: [ + { + type: "radio", + id: "difficulty", + default: "0", + choices: [ + { + name: "Sandbox", + value: "0", + tooltip: "Grow how you want, when you want.", + }, + { + name: "Stompvival", + value: "1", + tooltip: + "Actions earn you growth points, which are used to grow bigger.", + }, + ], + }, + { + name: "Automatic Growth", + id: "automaticGrowthEnabled", + type: "subcategory", + entries: [ + { + name: "Help", + id: "", + type: "label", + tooltip: + "When checked, you will automaically grow by ingesting/absorbing mass.", + }, + { + name: "Prey growth factor", + id: "basePreyGrowthFactor", + type: "float", + default: "80", + unit: "percentage", + tooltip: + "How much of what you eat gets automatically added to your body. Setting this to 0% disables it. To add half of your prey mass to your own, set to 50%.", + }, + { + 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: "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": "Fatal", - "value": "1", - "warning": "Fatal actions are enabled", - "tooltip": "Actions can have fatal consequences, but don't go into detail." + name: "Downtown", + value: "Downtown", + tooltip: "A dense city center.", }, { - "name": "Gory", - "value": "2", - "warning": "Gory actions are enabled", - "tooltip": "Descriptions are violent, but not excessively so." + name: "Suburb", + value: "Suburb", + tooltip: "The perfect place to start a family, or eat one.", }, { - "name": "Sadistic", - "value": "3", - "warning": "Brutal actions are enabled", - "tooltip": "Cronch." + name: "Rural", + value: "Rural", + tooltip: "Is that a cow?", }, - ] - } - ] - }, - { - "name": "Victims", - "optional": false, - "group": "main", - "entries": - [ - { - "name": "Human prey", - "id": "victimsHuman", - "type": "checkbox", - "tooltip": "When checked, your prey is humans. By default your prey is a wide array of anthros." - }, - { - "name": "Military", - "id": "victimsMilitary", - "type": "checkbox", - "tooltip": "When checked, you can prey on military units like soldiers, tanks, helicopeter, up to destroying entire armies." - }, - { - "name": "Macros", - "id": "victimsMacros", - "type": "checkbox" - }, - { - "name": "Micros", - "id": "victimsMicros", - "type": "checkbox" - }, - { - "name": "Single Victim Type", - "id": "singleVictimType", - "type": "select", - "default": "Disabled", - "tooltip": "Only spawns one specific kind of victim.", - "choices": - ["Disabled"].concat(Object.keys(things)).map(thing => { - return thing === "Container" ? null : thing - }).filter(x => x !== null).map(x => { return { name: x, value: x} }) - } - ] + ], + }, + { + name: "Enabled biomes:", + id: "", + type: "label", + }, + { + 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": "Oral Vore", - "id": "oralVore", - "group": "main", - "optional": true, - "buttons": [ - "feed", "chew" + name: "Brutality", + optional: false, + group: "main", + entries: [ + { + type: "radio", + id: "brutality", + default: "1", + choices: [ + { + name: "Non-fatal", + value: "0", + tooltip: "All actions are explicitly safe.", + }, + { + name: "Fatal", + value: "1", + warning: "Fatal actions are enabled", + tooltip: + "Actions can have fatal consequences, but don't go into detail.", + }, + { + name: "Gory", + value: "2", + warning: "Gory actions are enabled", + tooltip: "Descriptions are violent, but not excessively so.", + }, + { + name: "Sadistic", + value: "3", + warning: "Brutal actions are enabled", + tooltip: "Cronch.", + }, + ], + }, ], - "entries": - [ - { - "name": "Automatic Digestion", - "id": "oralDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "oralDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "oralDigestManual", - "type": "checkbox", - "buttons": ["digest_stomach"] - }, - { - "name": "Same-size vore", - "id": "sameSizeOralVore", - "type": "checkbox", - "default": true - }, - { - "name": "Vomiting", - "id": "vomitEnabled", - "type": "checkbox", - "warning": "Vomiting is enabled", - "buttons": ["vomit"] - } - ] }, { - "name": "Anal Vore", - "id": "analVore", - "optional": true, - "group": "alt-vore", - "buttons": ["anal_vore"], - "entries": - [ - { - "name": "Anus diameter", - "id": "baseAnalVoreDiameter", - "type": "float", - "default": "0.1", - "unit": "length" - }, - { - "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", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Manual digestion", - "id": "analDigestManual", - "type": "checkbox", - "buttons": ["digest_anal"] - }, - { - "name": "Same-size vore", - "id": "sameSizeAnalVore", - "type": "checkbox", - "default": true - }, - { - "name": "Anal vore goes to stomach", - "id": "analVoreToStomach", - "type": "checkbox" - } - ] + name: "Victims", + optional: false, + group: "main", + entries: [ + { + name: "Human prey", + id: "victimsHuman", + type: "checkbox", + tooltip: + "When checked, your prey is humans. By default your prey is a wide array of anthros.", + }, + { + name: "Military", + id: "victimsMilitary", + type: "checkbox", + tooltip: + "When checked, you can prey on military units like soldiers, tanks, helicopeter, up to destroying entire armies.", + }, + { + name: "Macros", + id: "victimsMacros", + type: "checkbox", + }, + { + name: "Micros", + id: "victimsMicros", + type: "checkbox", + }, + { + name: "Single Victim Type", + id: "singleVictimType", + type: "select", + default: "Disabled", + tooltip: "Only spawns one specific kind of victim.", + choices: ["Disabled"] + .concat(Object.keys(things)) + .map((thing) => { + return thing === "Container" ? null : thing; + }) + .filter((x) => x !== null) + .map((x) => { + return { name: x, value: x }; + }), + }, + ], }, { - "name": "Footwear", - "id": "footWear", - "group": "body-part", - "optional": true, - "panels": ["shoes"], - "entries": - [ - { - "name": "Socks", - "id": "footSockEnabled", - "type": "subcategory", - "buttons": ["remove_socks", "wear_socks", "stuff_socks", "dump_socks"], - "entries": - [ - { - "name": "Sock type", - "id": "footSock", - "type": "select", - "default": "sock", - "choices": - [ - { - "name": "Socks", - "value": "sock" - }, - { - "name": "Stockings", - "value": "stocking" - } - ] - } - ] - }, - { - "name": "Shoes", - "id": "footShoeEnabled", - "type": "subcategory", - "buttons": ["remove_shoes", "wear_shoes", "stuff_shoes", "dump_shoes"], - "entries": - [ - { - "name": "Shoe type", - "id": "footShoe", - "type": "select", - "default": "shoe", - "choices": - [ - { - "name": "Shoes", - "value": "shoe" - }, - { - "name": "Boots", - "value": "boot" - }, - { - "name": "Trainers", - "value": "trainer" - }, - { - "name": "Sandals", - "value": "sandal" - }, - { - "name": "High Heels", - "value": "heel", - }, - { - "name": "Crocs", - "value": "croc" - } - ] - } - ] - } - ] + name: "Oral Vore", + id: "oralVore", + group: "main", + optional: true, + buttons: ["feed", "chew"], + entries: [ + { + name: "Automatic Digestion", + id: "oralDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "oralDigestTime", + type: "float", + default: "15", + }, + ], + }, + { + name: "Manual digestion", + id: "oralDigestManual", + type: "checkbox", + buttons: ["digest_stomach"], + }, + { + name: "Same-size vore", + id: "sameSizeOralVore", + type: "checkbox", + default: true, + }, + { + name: "Vomiting", + id: "vomitEnabled", + type: "checkbox", + warning: "Vomiting is enabled", + buttons: ["vomit"], + }, + ], }, { - "name": "Arousal", - "id": "arousalEnabled", - "group": "nsfw", - "optional": true, - "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", - "tooltip": "How quickly arousal and orgasm builds." - }, - { - "name": "Edge multiplier", - "id": "edgeFactor", - "type": "float", - "default": "1", - "tooltip": "How quickly edge builds up." - } - ] + name: "Anal Vore", + id: "analVore", + optional: true, + group: "alt-vore", + buttons: ["anal_vore"], + entries: [ + { + name: "Anus diameter", + id: "baseAnalVoreDiameter", + type: "float", + default: "0.1", + unit: "length", + }, + { + 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", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Manual digestion", + id: "analDigestManual", + type: "checkbox", + buttons: ["digest_anal"], + }, + { + name: "Same-size vore", + id: "sameSizeAnalVore", + type: "checkbox", + default: true, + }, + { + name: "Anal vore goes to stomach", + id: "analVoreToStomach", + type: "checkbox", + }, + ], }, { - "name": "Tail", - "id": "hasTail", - "group": "body-part", - "optional": true, - "parts": ["tail"], - "panels": ["tails"], - "buttons": ["tail_slap"], - "entries": - [ - { - "name": "Number of tails", - "id": "tailCount", - "type": "int", - "default": "1" - }, - { - "name": "Tail description", - "id": "tailType", - "type": "text", - "default": "fluffy" - }, - { - "name": "Tail length", - "id": "baseTailLength", - "type": "float", - "default": "1", - "unit": "length" - }, - { - "name": "Tail diameter", - "id": "baseTailDiameter", - "type": "float", - "default": "0.3", - "unit": "length" - }, - { - "name": "Tail Vore", - "id": "tailMaw", - "type": "subcategory", - "entries": - [ + name: "Footwear", + id: "footWear", + group: "body-part", + optional: true, + panels: ["shoes"], + entries: [ + { + name: "Socks", + id: "footSockEnabled", + type: "subcategory", + buttons: ["remove_socks", "wear_socks", "stuff_socks", "dump_socks"], + entries: [ + { + name: "Sock type", + id: "footSock", + type: "select", + default: "sock", + choices: [ + { + name: "Socks", + value: "sock", + }, { - "name": "Tail stretchiness", - "id": "tailStretchiness", - "type": "float", - "default": "3" + name: "Stockings", + value: "stocking", + }, + ], + }, + ], + }, + { + name: "Shoes", + id: "footShoeEnabled", + type: "subcategory", + buttons: ["remove_shoes", "wear_shoes", "stuff_shoes", "dump_shoes"], + entries: [ + { + name: "Shoe type", + id: "footShoe", + type: "select", + default: "shoe", + choices: [ + { + name: "Shoes", + value: "shoe", }, { - "name": "Tail autogrowth factor", - "id": "tailGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." + name: "Boots", + value: "boot", }, { - "name": "Automatic Digestion", - "id": "tailDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "tailDigestTime", - "type": "float", - "default": "15" - } - ] + name: "Trainers", + value: "trainer", }, { - "name": "Manual digestion", - "id": "tailDigestManual", - "type": "checkbox", - "buttons": ["digest_tail"] + name: "Sandals", + value: "sandal", }, { - "name": "Same-size vore", - "id": "sameSizeTailVore", - "type": "checkbox", - "default": true + name: "High Heels", + value: "heel", }, { - "name": "Tail vore goes to stomach", - "id": "tailVoreToStomach", - "type": "checkbox" - } - ] - } - ] + name: "Crocs", + value: "croc", + }, + ], + }, + ], + }, + ], }, { - "name": "Pouch", - "id": "hasPouch", - "group": "alt-vore", - "optional": true, - "panels": ["misc"], - "buttons": ["pouch_stuff", "pouch_rub"], - "entries": - [ - { - "name": "Absorption", - "id": "pouchAbsorption", - "type": "checkbox", - "buttons": ["pouch_absorb"] - } - ] + name: "Arousal", + id: "arousalEnabled", + group: "nsfw", + optional: true, + 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", + tooltip: "How quickly arousal and orgasm builds.", + }, + { + name: "Edge multiplier", + id: "edgeFactor", + type: "float", + default: "1", + tooltip: "How quickly edge builds up.", + }, + ], }, { - "name": "Male Genitals", - "id": "maleParts", - "group": "nsfw", - "optional": true, - "stats": ["cum"], - "parts": ["dick", "balls"], - "panels": ["dick"], - "buttons": ["cockslap", "ball_smother"], - "entries": - [ - { - "name": "Cock length", - "id": "baseDickLength", - "type": "float", - "default": "0.3", - "unit": "length" - }, - { - "name": "Cock diameter", - "id": "baseDickDiameter", - "type": "float", - "default": "0.08", - "unit": "length" - }, - { - "name": "Cock description", - "id": "dickType", - "type": "text", - "default": "canine" - }, - { - "name": "Ball diameter", - "id": "baseBallDiameter", - "type": "float", - "default": "0.05", - "unit": "length" - }, - { - "name": "Orgasm size", - "id": "baseCumVolume", - "type": "float", - "default": "0.1", - "unit": "volume" - }, - { - "name": "Passive cum production", - "id": "baseCumProduction", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Cum storage factor", - "id": "cumStorageScale", - "type": "float", - "default": "1" - }, - { - "name": "Cock autogrowth factor", - "id": "cockGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Balls autogrowth factor", - "id": "ballGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Cock Vore", - "id": "cockVoreEnabled", - "type": "subcategory", - "buttons": ["cock_vore"], - "entries": - [ - { - "name": "Cock stretchiness", - "id": "dickStretchiness", - "type": "float", - "default": "5" - }, - { - "name": "Cum digestion factor", - "id": "baseCumDigestFactor", - "type": "float", - "default": "1" + name: "Tail", + id: "hasTail", + group: "body-part", + optional: true, + parts: ["tail"], + panels: ["tails"], + buttons: ["tail_slap"], + entries: [ + { + name: "Number of tails", + id: "tailCount", + type: "int", + default: "1", + }, + { + name: "Tail description", + id: "tailType", + type: "text", + default: "fluffy", + }, + { + name: "Tail length", + id: "baseTailLength", + type: "float", + default: "1", + unit: "length", + }, + { + name: "Tail diameter", + id: "baseTailDiameter", + type: "float", + default: "0.3", + unit: "length", + }, + { + name: "Tail Vore", + id: "tailMaw", + type: "subcategory", + entries: [ + { + name: "Tail stretchiness", + id: "tailStretchiness", + type: "float", + default: "3", + }, + { + name: "Tail autogrowth factor", + id: "tailGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Automatic Digestion", + id: "tailDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "tailDigestTime", + 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", - "type": "checkbox", - "buttons": ["digest_cock"] - }, - { - "name": "Same-size vore", - "id": "sameSizeCockVore", - "type": "checkbox", - "default": true - }, - { - "name": "Scale cum with size", - "id": "cumScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much cum when digesting prey" - } - ] - }, - { - "name": "Sheath", - "id": "hasSheath", - "type": "subcategory", - "buttons": ["sheath_stuff", "sheath_toy", "sheath_clench"], - "entries": - [ - { - "name": "Absorption", - "id": "sheathAbsorptionEnabled", - "type": "checkbox", - "buttons": ["sheath_absorb"] - } - ] - }, - { - "name": "Foreskin", - "id": "hasForeskin", - "type": "subcategory", - "buttons": ["foreskin_stuff", "foreskin_toy", "foreskin_clench"], - "entries": - [ - { - "name": "Absorption", - "id": "foreskinAbsorptionEnabled", - "type": "checkbox", - "buttons": ["foreskin_absorb"] - } - ] - }, - { - "name": "Musk", - "id": "maleMuskEnabled", - "type": "subcategory", - "parts": ["musk"], - "entries": - [ - { - "name": "Musk factor", - "id": "baseMaleMuskArea", - "type": "float", - "default": "0.5" - } - ] - } - ] + ], + }, + { + name: "Manual digestion", + id: "tailDigestManual", + type: "checkbox", + buttons: ["digest_tail"], + }, + { + name: "Same-size vore", + id: "sameSizeTailVore", + type: "checkbox", + default: true, + }, + { + name: "Tail vore goes to stomach", + id: "tailVoreToStomach", + type: "checkbox", + }, + ], + }, + ], }, { - "name": "Female Genitals", - "id": "femaleParts", - "group": "nsfw", - "optional": true, - "stats": ["femcum"], - "parts": ["slit", "womb"], - "panels": ["vagina"], - "buttons": ["slit_toy"], - "entries": - [ - { - "name": "Slit length", - "id": "baseVaginaLength", - "type": "float", - "default": "0.1", - "unit": "length" - }, - { - "name": "Slit width", - "id": "baseVaginaWidth", - "type": "float", - "default": "0.05", - "unit": "length" - }, - { - "name": "Womb volume", - "id": "baseWombVolume", - "type": "float", - "default": "0.1", - "unit": "volume" - }, - { - "name": "Orgasm size", - "id": "baseFemcumVolume", - "type": "float", - "default": "0.1", - }, - { - "name": "Passive femcum production", - "id": "baseFemcumProduction", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Femcum storage factor", - "id": "femcumStorageScale", - "type": "float", - "default": "1" - }, - { - "name": "Unbirth", - "id": "unbirthEnabled", - "type": "subcategory", - "buttons": ["unbirth"], - "entries": - [ - { - "name": "Slit stretchiness", - "id": "vaginaStretchiness", - "type": "float", - "default": "5" - }, - { - "name": "Femcum digestion factor", - "id": "baseFemcumDigestFactor", - "type": "float", - "default": "1" - }, - { - "name": "Vagina autogrowth factor", - "id": "vaginaGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Womb autogrowth factor", - "id": "wombGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Automatic Digestion", - "id": "unbirthDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "unbirthDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "unbirthDigestManual", - "type": "checkbox", - "buttons": ["digest_unbirth"] + name: "Pouch", + id: "hasPouch", + group: "alt-vore", + optional: true, + panels: ["misc"], + buttons: ["pouch_stuff", "pouch_rub"], + entries: [ + { + name: "Absorption", + id: "pouchAbsorption", + type: "checkbox", + buttons: ["pouch_absorb"], + }, + ], + }, + { + name: "Male Genitals", + id: "maleParts", + group: "nsfw", + optional: true, + stats: ["cum"], + parts: ["dick", "balls"], + panels: ["dick"], + buttons: ["cockslap", "ball_smother"], + entries: [ + { + name: "Cock length", + id: "baseDickLength", + type: "float", + default: "0.3", + unit: "length", + }, + { + name: "Cock diameter", + id: "baseDickDiameter", + type: "float", + default: "0.08", + unit: "length", + }, + { + name: "Cock description", + id: "dickType", + type: "text", + default: "canine", + }, + { + name: "Ball diameter", + id: "baseBallDiameter", + type: "float", + default: "0.05", + unit: "length", + }, + { + name: "Orgasm size", + id: "baseCumVolume", + type: "float", + default: "0.1", + unit: "volume", + }, + { + name: "Passive cum production", + id: "baseCumProduction", + type: "float", + default: "1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Cum storage factor", + id: "cumStorageScale", + type: "float", + default: "1", + }, + { + name: "Cock autogrowth factor", + id: "cockGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Balls autogrowth factor", + id: "ballGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Cock Vore", + id: "cockVoreEnabled", + type: "subcategory", + buttons: ["cock_vore"], + entries: [ + { + name: "Cock stretchiness", + id: "dickStretchiness", + type: "float", + default: "5", + }, + { + name: "Cum digestion factor", + id: "baseCumDigestFactor", + type: "float", + default: "1", + }, + { + name: "Automatic Digestion", + id: "cockDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "cockDigestTime", + type: "float", + default: "15", }, - { - "name": "Same-size vore", - "id": "sameSizeUnbirth", - "type": "checkbox", - "default": true + ], + }, + { + name: "Manual digestion", + id: "cockDigestManual", + type: "checkbox", + buttons: ["digest_cock"], + }, + { + name: "Same-size vore", + id: "sameSizeCockVore", + type: "checkbox", + default: true, + }, + { + name: "Scale cum with size", + id: "cumScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much cum when digesting prey", + }, + ], + }, + { + name: "Sheath", + id: "hasSheath", + type: "subcategory", + buttons: ["sheath_stuff", "sheath_toy", "sheath_clench"], + entries: [ + { + name: "Absorption", + id: "sheathAbsorptionEnabled", + type: "checkbox", + buttons: ["sheath_absorb"], + }, + ], + }, + { + name: "Foreskin", + id: "hasForeskin", + type: "subcategory", + buttons: ["foreskin_stuff", "foreskin_toy", "foreskin_clench"], + entries: [ + { + name: "Absorption", + id: "foreskinAbsorptionEnabled", + type: "checkbox", + buttons: ["foreskin_absorb"], + }, + ], + }, + { + name: "Musk", + id: "maleMuskEnabled", + type: "subcategory", + parts: ["musk"], + entries: [ + { + name: "Musk factor", + id: "baseMaleMuskArea", + type: "float", + default: "0.5", + }, + ], + }, + ], + }, + { + name: "Female Genitals", + id: "femaleParts", + group: "nsfw", + optional: true, + stats: ["femcum"], + parts: ["slit", "womb"], + panels: ["vagina"], + buttons: ["slit_toy"], + entries: [ + { + name: "Slit length", + id: "baseVaginaLength", + type: "float", + default: "0.1", + unit: "length", + }, + { + name: "Slit width", + id: "baseVaginaWidth", + type: "float", + default: "0.05", + unit: "length", + }, + { + name: "Womb volume", + id: "baseWombVolume", + type: "float", + default: "0.1", + unit: "volume", + }, + { + name: "Orgasm size", + id: "baseFemcumVolume", + type: "float", + default: "0.1", + }, + { + name: "Passive femcum production", + id: "baseFemcumProduction", + type: "float", + default: "1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Femcum storage factor", + id: "femcumStorageScale", + type: "float", + default: "1", + }, + { + name: "Unbirth", + id: "unbirthEnabled", + type: "subcategory", + buttons: ["unbirth"], + entries: [ + { + name: "Slit stretchiness", + id: "vaginaStretchiness", + type: "float", + default: "5", + }, + { + name: "Femcum digestion factor", + id: "baseFemcumDigestFactor", + type: "float", + default: "1", + }, + { + name: "Vagina autogrowth factor", + id: "vaginaGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Womb autogrowth factor", + id: "wombGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Automatic Digestion", + id: "unbirthDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "unbirthDigestTime", + type: "float", + default: "15", }, - { - "name": "Scale femcum with size", - "id": "femcumScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much femcum when digesting prey" - } - ] - }, - { - "name": "Musk", - "id": "femaleMuskEnabled", - "type": "subcategory", - "parts": ["musk"], - "entries": - [ - { - "name": "Musk factor", - "id": "baseFemaleMuskArea", - "type": "float", - "default": "0.5" - } - ] - } - ] + ], + }, + { + name: "Manual digestion", + id: "unbirthDigestManual", + type: "checkbox", + buttons: ["digest_unbirth"], + }, + { + name: "Same-size vore", + id: "sameSizeUnbirth", + type: "checkbox", + default: true, + }, + { + name: "Scale femcum with size", + id: "femcumScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much femcum when digesting prey", + }, + ], + }, + { + name: "Musk", + id: "femaleMuskEnabled", + type: "subcategory", + parts: ["musk"], + entries: [ + { + name: "Musk factor", + id: "baseFemaleMuskArea", + type: "float", + default: "0.5", + }, + ], + }, + ], }, { - "name": "Sexual Magic", - "id": "sexualMagicEnabled", - "group": "nsfw", - "optional": true, - "panels": ["magic"], - "entries": - [ - { - "name": "Arousal", - "id": "magicArousal", - "type": "checkbox", - "buttons": ["magic_arousal"], - "default": true, - "tooltip": "Rapidly arouses the caster" - }, - { - "name": "Summon cum", - "id": "magicFillSexual", - "type": "checkbox", - "buttons": ["magic_fill_sexual"], - "default": true, - "tooltip": "Prepares the caster for quite the gush!" - } - ] + name: "Sexual Magic", + id: "sexualMagicEnabled", + group: "nsfw", + optional: true, + panels: ["magic"], + entries: [ + { + name: "Arousal", + id: "magicArousal", + type: "checkbox", + buttons: ["magic_arousal"], + default: true, + tooltip: "Rapidly arouses the caster", + }, + { + name: "Summon cum", + id: "magicFillSexual", + type: "checkbox", + buttons: ["magic_fill_sexual"], + default: true, + tooltip: "Prepares the caster for quite the gush!", + }, + ], }, { - "name": "Breasts", - "id": "hasBreasts", - "group": "body-part", - "optional": true, - "panels": ["breasts"], - "parts": ["breasts"], - "buttons": ["breast_crush", "breast_toy", "cleavage_stuff", "cleavage_crush", "cleavage_drop", "cleavage_absorb"], - "entries": - [ - { - "name": "Breast diameter", - "id": "baseBreastDiameter", - "type": "float", - "default": "0.1", - "unit": "length" - }, - { - "name": "Lactation", - "id": "lactationEnabled", - "type": "subcategory", - "stats": ["milk"], - "buttons": ["breast_milk"], - "warning": "Lactation is enabled", - "entries": - [ - { - "name": "Lactation scale", - "id": "lactationFactor", - "type": "float", - "default": "0.25" - }, - { - "name": "Passive milk production", - "id": "baseLactationProduction", - "type": "float", - "default": "0.1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Milk storage scale", - "id": "milkStorageScale", - "type": "float", - "default": "1" - } - ] - }, - { - "name": "Breast Vore", - "id": "breastVore", - "type": "subcategory", - "buttons": ["breast_vore", "digest_breast"], - "entries": - [ - { - "name": "Breast stretchiness", - "id": "breastStretchiness", - "type": "float", - "default": "3" - }, - { - "name": "Milk digestion scale", - "id": "baseMilkDigestFactor", - "type": "float", - "default": "1" - }, - { - "name": "Breast autogrowth factor", - "id": "breastGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Automatic Digestion", - "id": "breastDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "breastDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "breastDigestManual", - "type": "checkbox" - }, - { - "name": "Same-size vore", - "id": "sameSizeBreastVore", - "type": "checkbox", - "default": true + name: "Breasts", + id: "hasBreasts", + group: "body-part", + optional: true, + panels: ["breasts"], + parts: ["breasts"], + buttons: [ + "breast_crush", + "breast_toy", + "cleavage_stuff", + "cleavage_crush", + "cleavage_drop", + "cleavage_absorb", + ], + entries: [ + { + name: "Breast diameter", + id: "baseBreastDiameter", + type: "float", + default: "0.1", + unit: "length", + }, + { + name: "Lactation", + id: "lactationEnabled", + type: "subcategory", + stats: ["milk"], + buttons: ["breast_milk"], + warning: "Lactation is enabled", + entries: [ + { + name: "Lactation scale", + id: "lactationFactor", + type: "float", + default: "0.25", + }, + { + name: "Passive milk production", + id: "baseLactationProduction", + type: "float", + default: "0.1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Milk storage scale", + id: "milkStorageScale", + type: "float", + default: "1", + }, + ], + }, + { + name: "Breast Vore", + id: "breastVore", + type: "subcategory", + buttons: ["breast_vore", "digest_breast"], + entries: [ + { + name: "Breast stretchiness", + id: "breastStretchiness", + type: "float", + default: "3", + }, + { + name: "Milk digestion scale", + id: "baseMilkDigestFactor", + type: "float", + default: "1", + }, + { + name: "Breast autogrowth factor", + id: "breastGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Automatic Digestion", + id: "breastDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "breastDigestTime", + type: "float", + default: "15", }, - { - "name": "Scale milk with size", - "id": "milkScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much milk when digesting prey" - } - ] - } - ] + ], + }, + { + name: "Manual digestion", + id: "breastDigestManual", + type: "checkbox", + }, + { + name: "Same-size vore", + id: "sameSizeBreastVore", + type: "checkbox", + default: true, + }, + { + name: "Scale milk with size", + id: "milkScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much milk when digesting prey", + }, + ], + }, + ], }, { - "name": "Stench", - "id": "stenchEnabled", - "group": "gross", - "optional": true, - "warning": "Stench is enabled", - "parts": ["stench"], - "entries": - [ - { - "name": "Paw stench scale", - "id": "basePawStenchArea", - "type": "float", - "default": "1" - }, - { - "name": "Ass stench scale", - "id": "baseAssStenchArea", - "type": "float", - "default": "1.5" - }, - { - "name": "Piss stench scale", - "id": "basePissStenchArea", - "type": "float", - "default": "0.75" - }, - { - "name": "Scat stench scale", - "id": "baseScatStenchArea", - "type": "float", - "default": "3" - }, - ] + name: "Stench", + id: "stenchEnabled", + group: "gross", + optional: true, + warning: "Stench is enabled", + parts: ["stench"], + entries: [ + { + name: "Paw stench scale", + id: "basePawStenchArea", + type: "float", + default: "1", + }, + { + name: "Ass stench scale", + id: "baseAssStenchArea", + type: "float", + default: "1.5", + }, + { + name: "Piss stench scale", + id: "basePissStenchArea", + type: "float", + default: "0.75", + }, + { + name: "Scat stench scale", + id: "baseScatStenchArea", + type: "float", + default: "3", + }, + ], }, { - "name": "Gas", - "id": "gasEnabled", - "group": "gross", - "optional": true, - "stats": ["gas"], - "panels": ["waste"], - "warning": "Gas is enabled", - "entries": - [ - { - "name": "Belching", - "id": "belchEnabled", - "type": "checkbox", - "buttons": ["belch"] - }, - { - "name": "Farting", - "id": "fartEnabled", - "type": "checkbox", - "buttons": ["fart"] - }, - { - "name": "Passive gas production", - "id": "baseGasProduction", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Gas storage scale", - "id": "gasStorageScale", - "type": "float", - "default": "1" - }, - { - "name": "Gas digestion factor", - "id": "baseGasDigestFactor", - "type": "float", - "default": "1" - }, - { - "name": "Scale gas with size", - "id": "gasScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much gas when digesting prey" - } - ] + name: "Gas", + id: "gasEnabled", + group: "gross", + optional: true, + stats: ["gas"], + panels: ["waste"], + warning: "Gas is enabled", + entries: [ + { + name: "Belching", + id: "belchEnabled", + type: "checkbox", + buttons: ["belch"], + }, + { + name: "Farting", + id: "fartEnabled", + type: "checkbox", + buttons: ["fart"], + }, + { + name: "Passive gas production", + id: "baseGasProduction", + type: "float", + default: "1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Gas storage scale", + id: "gasStorageScale", + type: "float", + default: "1", + }, + { + name: "Gas digestion factor", + id: "baseGasDigestFactor", + type: "float", + default: "1", + }, + { + name: "Scale gas with size", + id: "gasScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much gas when digesting prey", + }, + ], }, { - "name": "Soul Vore", - "id": "soulVoreEnabled", - "group": "alt-vore", - "optional": true, - "panels": ["souls"], - "buttons": ["soul_vore", "soul_absorb_paw"], - "warning": "Soul vore enabled", - "entries": - [ - { - "name": "Souls autogrowth factor", - "id": "soulGrowthFactor", - "type": "float", - "default": "25", - "unit": "percentage", - "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", - "id": "soulDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "soulDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "soulDigestManual", - "type": "checkbox", - "buttons": ["digest_soul"] - }, - { - "name": "Soul vore type", - "type": "select", - "id": "soulVoreType", - "default": "body", - "choices": - [ - { - "name": "Released", - "value": "release", - }, - { - "name": "Trapped", - "value": "body", - }, - { - "name": "Digested", - "value": "oblivion", - }, - ] - }, - ] + name: "Soul Vore", + id: "soulVoreEnabled", + group: "alt-vore", + optional: true, + panels: ["souls"], + buttons: ["soul_vore", "soul_absorb_paw"], + warning: "Soul vore enabled", + entries: [ + { + name: "Souls autogrowth factor", + id: "soulGrowthFactor", + type: "float", + default: "25", + unit: "percentage", + 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", + id: "soulDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "soulDigestTime", + type: "float", + default: "15", + }, + ], + }, + { + name: "Manual digestion", + id: "soulDigestManual", + type: "checkbox", + buttons: ["digest_soul"], + }, + { + name: "Soul vore type", + type: "select", + id: "soulVoreType", + default: "body", + choices: [ + { + name: "Released", + value: "release", + }, + { + name: "Trapped", + value: "body", + }, + { + name: "Digested", + value: "oblivion", + }, + ], + }, + ], }, { - "name": "Piss", - "id": "pissEnabled", - "group": "gross", - "optional": true, - "stats": ["piss"], - "panels": ["waste"], - "buttons": ["piss"], - "warning": "Watersports enabled", - "entries": - [ - { - "name": "Passive piss production", - "id": "basePissProduction", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Piss storage scale", - "id": "pissStorageScale", - "type": "float", - "default": "1" - }, - { - "name": "Bladder Vore", - "id": "bladderVore", - "type": "subcategory", - "buttons": ["bladder_vore"], - "entries": - [ - { - "name": "Urethra diameter", - "id": "baseUrethraDiameter", - "type": "float", - "default": "0.03", - "unit": "length" - }, - { - "name": "Urethra stretchiness", - "id": "urethraStretchiness", - "type": "float", - "default": "5" - }, - { - "name": "Piss digestion scale", - "id": "basePissDigestFactor", - "type": "float", - "default": "1" - }, - { - "name": "Automatic Digestion", - "id": "bladderDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "bladderDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "bladderDigestManual", - "type": "checkbox", - "buttons": ["digest_bladder"], - }, - { - "name": "Same-size vore", - "id": "sameSizeBladderVore", - "type": "checkbox", - "default": true + name: "Piss", + id: "pissEnabled", + group: "gross", + optional: true, + stats: ["piss"], + panels: ["waste"], + buttons: ["piss"], + warning: "Watersports enabled", + entries: [ + { + name: "Passive piss production", + id: "basePissProduction", + type: "float", + default: "1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Piss storage scale", + id: "pissStorageScale", + type: "float", + default: "1", + }, + { + name: "Bladder Vore", + id: "bladderVore", + type: "subcategory", + buttons: ["bladder_vore"], + entries: [ + { + name: "Urethra diameter", + id: "baseUrethraDiameter", + type: "float", + default: "0.03", + unit: "length", + }, + { + name: "Urethra stretchiness", + id: "urethraStretchiness", + type: "float", + default: "5", + }, + { + name: "Piss digestion scale", + id: "basePissDigestFactor", + type: "float", + default: "1", + }, + { + name: "Automatic Digestion", + id: "bladderDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "bladderDigestTime", + type: "float", + default: "15", }, - { - "name": "Scale piss with size", - "id": "pissScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much piss when digesting prey" - } - ] - } - ] + ], + }, + { + name: "Manual digestion", + id: "bladderDigestManual", + type: "checkbox", + buttons: ["digest_bladder"], + }, + { + name: "Same-size vore", + id: "sameSizeBladderVore", + type: "checkbox", + default: true, + }, + { + name: "Scale piss with size", + id: "pissScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much piss when digesting prey", + }, + ], + }, + ], }, { - "name": "Scat", - "id": "scatEnabled", - "group": "gross", - "optional": true, - "stats": ["scat"], - "panels": ["waste"], - "buttons": ["scat"], - "warning": "Scat is enabled", - "entries": - [ - { - "name": "Scat digestion scale", - "id": "baseScatDigestFactor", - "type": "float", - "default": "1" - }, - { - "name": "Passive scat production", - "id": "baseScatProduction", - "type": "float", - "default": "0.1", - "unit": "percentage", - "tooltip": "How much you fill up every second" - }, - { - "name": "Scat storage scale", - "id": "scatStorageScale", - "type": "float", - "default": "1" - }, - { - "name": "Scale scat with size", - "id": "scatScaleWithSize", - "type": "checkbox", - "tooltip": "If you're ten times bigger than normal, you produce ten times as much scat when digesting prey" - } - ] + name: "Scat", + id: "scatEnabled", + group: "gross", + optional: true, + stats: ["scat"], + panels: ["waste"], + buttons: ["scat"], + warning: "Scat is enabled", + entries: [ + { + name: "Scat digestion scale", + id: "baseScatDigestFactor", + type: "float", + default: "1", + }, + { + name: "Passive scat production", + id: "baseScatProduction", + type: "float", + default: "0.1", + unit: "percentage", + tooltip: "How much you fill up every second", + }, + { + name: "Scat storage scale", + id: "scatStorageScale", + type: "float", + default: "1", + }, + { + name: "Scale scat with size", + id: "scatScaleWithSize", + type: "checkbox", + tooltip: + "If you're ten times bigger than normal, you produce ten times as much scat when digesting prey", + }, + ], }, { - "name": "Goo", - "id": "gooEnabled", - "group": "body-part", - "optional": true, - "panels": ["goo"], - "buttons": ["melt"], - "entries": - [ - { - "name": "Digestion", - "id": "gooDigestion", - "type": "subcategory", - "entries": - [ - { - "name": "Goo autogrowth factor", - "id": "gooGrowthFactor", - "type": "float", - "default": "80", - "unit": "percentage", - "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", - "id": "gooDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "gooDigestTime", - "type": "float", - "default": "15" - } - ] + name: "Goo", + id: "gooEnabled", + group: "body-part", + optional: true, + panels: ["goo"], + buttons: ["melt"], + entries: [ + { + name: "Digestion", + id: "gooDigestion", + type: "subcategory", + entries: [ + { + name: "Goo autogrowth factor", + id: "gooGrowthFactor", + type: "float", + default: "80", + unit: "percentage", + 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", + id: "gooDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "gooDigestTime", + type: "float", + default: "15", }, - { - "name": "Manual digestion", - "id": "gooDigestManual", - "type": "checkbox" - } - ] - } - ] + ], + }, + { + name: "Manual digestion", + id: "gooDigestManual", + type: "checkbox", + }, + ], + }, + ], }, { - "name": "Paw Vore", - "id": "pawVoreEnabled", - "group": "alt-vore", - "optional": true, - "buttons": ["paw_vore"], - "entries": - [ - { - "name": "Paw autogrowth factor", - "id": "pawGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Automatic Digestion", - "id": "pawDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "pawDigestTime", - "type": "float", - "default": "15" - } - ] - }, - { - "name": "Manual digestion", - "id": "pawDigestManual", - "type": "checkbox", - "buttons": ["digest_paws"] - }, - { - "name": "Same-size vore", - "id": "sameSizePawVore", - "type": "checkbox", - "default": true - } - ] + name: "Paw Vore", + id: "pawVoreEnabled", + group: "alt-vore", + optional: true, + buttons: ["paw_vore"], + entries: [ + { + name: "Paw autogrowth factor", + id: "pawGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Automatic Digestion", + id: "pawDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "pawDigestTime", + type: "float", + default: "15", + }, + ], + }, + { + name: "Manual digestion", + id: "pawDigestManual", + type: "checkbox", + buttons: ["digest_paws"], + }, + { + name: "Same-size vore", + id: "sameSizePawVore", + type: "checkbox", + default: true, + }, + ], }, { - "name": "Crop", - "id": "cropEnabled", - "group": "alt-vore", - "optional": true, - "buttons": ["crop_swallow"], - "entries": - [ - { - "name": "Automatic Transfer", - "id": "cropTransferAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "cropTransferTime", - "type": "float", - "default": "10" - } - ] - }, - ] + name: "Crop", + id: "cropEnabled", + group: "alt-vore", + optional: true, + buttons: ["crop_swallow"], + entries: [ + { + name: "Automatic Transfer", + id: "cropTransferAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "cropTransferTime", + type: "float", + default: "10", + }, + ], + }, + ], }, { - "name": "Breath", - "id": "breathEnabled", - "group": "magic", - "optional": true, - "panels": ["breath"], - "parts": ["breath"], - "buttons": ["breath_line", "breath_cone"], - "entries": - [ - { - "name": "Breath area", - "id": "baseBreathArea", - "type": "float", - "default": "10", - "unit": "area" - }, - { - "name": "Fire", - "id": "breathFire", - "type": "checkbox", - "buttons": ["breath_fire"] - }, - { - "name": "Ice", - "id": "breathIce", - "type": "checkbox", - "buttons": ["breath_ice"] - }, - { - "name": "Electric", - "id": "breathElectric", - "type": "checkbox", - "buttons": ["breath_electric"] - }, - { - "name": "Smoke", - "id": "breathSmoke", - "type": "checkbox", - "buttons": ["breath_smoke"] - }, - { - "name": "Radiation", - "id": "breathRadiation", - "type": "checkbox", - "buttons": ["breath_radiation"] - }, - { - "name": "Foul", - "id": "breathFoul", - "type": "checkbox", - "buttons": ["breath_foul"] - }, - ] + name: "Breath", + id: "breathEnabled", + group: "magic", + optional: true, + panels: ["breath"], + parts: ["breath"], + buttons: ["breath_line", "breath_cone"], + entries: [ + { + name: "Breath area", + id: "baseBreathArea", + type: "float", + default: "10", + unit: "area", + }, + { + name: "Fire", + id: "breathFire", + type: "checkbox", + buttons: ["breath_fire"], + }, + { + name: "Ice", + id: "breathIce", + type: "checkbox", + buttons: ["breath_ice"], + }, + { + name: "Electric", + id: "breathElectric", + type: "checkbox", + buttons: ["breath_electric"], + }, + { + name: "Smoke", + id: "breathSmoke", + type: "checkbox", + buttons: ["breath_smoke"], + }, + { + name: "Radiation", + id: "breathRadiation", + type: "checkbox", + buttons: ["breath_radiation"], + }, + { + name: "Foul", + id: "breathFoul", + type: "checkbox", + buttons: ["breath_foul"], + }, + ], }, { - "name": "Drool", - "id": "droolEnabled", - "group": "gross", - "optional": true, - "buttons": ["drool"], - "entries": - [ - { - "name": "Drool volume", - "id": "droolBaseVolume", - "type": "float", - "default": "0.01", - "unit": "volume" - } - ] + name: "Drool", + id: "droolEnabled", + group: "gross", + optional: true, + buttons: ["drool"], + entries: [ + { + name: "Drool volume", + id: "droolBaseVolume", + type: "float", + default: "0.01", + unit: "volume", + }, + ], }, { - "name": "Magic", - "id": "magicEnabled", - "group": "magic", - "optional": true, - "panels": ["magic"], - "parts": ["magic",], - "entries": - [ - { - "name": "Shrinking magic", - "id": "magicShrink", - "type": "subcategory", - "buttons": ["magic_shrink"], - "default": true, - "tooltip": "Allows you to shrink a wide area(relative to your size) into a smaller area, allowing you to devour prey much bigger than you are.", - "entries": - [ - { - "name": "Auto-shrink", - "id": "magicShrinkAuto", - "type": "checkbox", - "default": false, - "tooltip": "Automatically shrink your victims before performing an action." - } - ] - }, - { - "name": "Fast digestion", - "id": "magicFastDigestion", - "type": "checkbox", - "buttons": ["magic_fast_digestion"], - "default": true, - "tooltip": "Fast Digestion allows you to speed up your digestion for a short duration." - }, - { - "name": "Pause digestion", - "id": "magicPauseDigestion", - "type": "checkbox", - "buttons": ["magic_pause_digestion"], - "default": true, - "tooltip": "Pause Digestion allows you to halt digestion until you cast it again." - } - ] + name: "Magic", + id: "magicEnabled", + group: "magic", + optional: true, + panels: ["magic"], + parts: ["magic"], + entries: [ + { + name: "Shrinking magic", + id: "magicShrink", + type: "subcategory", + buttons: ["magic_shrink"], + default: true, + tooltip: + "Allows you to shrink a wide area(relative to your size) into a smaller area, allowing you to devour prey much bigger than you are.", + entries: [ + { + name: "Auto-shrink", + id: "magicShrinkAuto", + type: "checkbox", + default: false, + tooltip: + "Automatically shrink your victims before performing an action.", + }, + ], + }, + { + name: "Fast digestion", + id: "magicFastDigestion", + type: "checkbox", + buttons: ["magic_fast_digestion"], + default: true, + tooltip: + "Fast Digestion allows you to speed up your digestion for a short duration.", + }, + { + name: "Pause digestion", + id: "magicPauseDigestion", + type: "checkbox", + buttons: ["magic_pause_digestion"], + default: true, + tooltip: + "Pause Digestion allows you to halt digestion until you cast it again.", + }, + ], }, { - "name": "Wings", - "id": "hasWings", - "group": "body-part", - "optional": true, - "panels": ["misc"], - "parts": ["wings"], - "buttons": ["wings_flap"], - "entries": - [ - { - "name": "Wing width", - "id": "baseWingWidth", - "type": "float", - "default": "1", - "unit": "length" - }, - { - "name": "Wing length", - "id": "baseWingLength", - "type": "float", - "default": "1", - "unit": "length" - }, - { - "name": "Wing description", - "id": "wingDesc", - "type": "text", - "default": "feathery" - }, - { - "name": "Wing Vore", - "id": "wingVoreEnabled", - "type": "subcategory", - "buttons": ["wings_vore"], - "entries": - [ - { - "name": "Wing autogrowth factor", - "id": "wingGrowthFactor", - "type": "float", - "default": "1", - "unit": "percentage", - "tooltip": "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth." - }, - { - "name": "Automatic Digestion", - "id": "wingDigestAuto", - "type": "subcategory", - "default": true, - "entries": - [ - { - "name": "Digestion time", - "id": "wingDigestTime", - "type": "float", - "default": "15" - } - ] + name: "Wings", + id: "hasWings", + group: "body-part", + optional: true, + panels: ["misc"], + parts: ["wings"], + buttons: ["wings_flap"], + entries: [ + { + name: "Wing width", + id: "baseWingWidth", + type: "float", + default: "1", + unit: "length", + }, + { + name: "Wing length", + id: "baseWingLength", + type: "float", + default: "1", + unit: "length", + }, + { + name: "Wing description", + id: "wingDesc", + type: "text", + default: "feathery", + }, + { + name: "Wing Vore", + id: "wingVoreEnabled", + type: "subcategory", + buttons: ["wings_vore"], + entries: [ + { + name: "Wing autogrowth factor", + id: "wingGrowthFactor", + type: "float", + default: "1", + unit: "percentage", + tooltip: + "How much this part grows during part specific digestion. This is relative to overall growth, 100%:all mass goes to this part 20%:20% part growth-80% overall growth.", + }, + { + name: "Automatic Digestion", + id: "wingDigestAuto", + type: "subcategory", + default: true, + entries: [ + { + name: "Digestion time", + id: "wingDigestTime", + type: "float", + default: "15", }, - { - "name": "Manual digestion", - "id": "wingDigestManual", - "type": "checkbox", - "buttons": ["digest_wings"] - }, - { - "name": "Same-size vore", - "id": "sameSizeWingVore", - "type": "checkbox", - "default": true - }, - { - "name": "Wing vore goes to stomach", - "id": "wingVoreToStomach", - "type": "checkbox" - } - ] - } - ] - } + ], + }, + { + name: "Manual digestion", + id: "wingDigestManual", + type: "checkbox", + buttons: ["digest_wings"], + }, + { + name: "Same-size vore", + id: "sameSizeWingVore", + type: "checkbox", + default: true, + }, + { + name: "Wing vore goes to stomach", + id: "wingVoreToStomach", + type: "checkbox", + }, + ], + }, + ], + }, ]; diff --git a/game.js b/game.js index 8251033..3d47789 100644 --- a/game.js +++ b/game.js @@ -7,11 +7,19 @@ let version = "v1.1.2"; let errored = false; -window.onerror = function (msg, source, lineno, colno, error) { //opens a popup if the game encounters an error +window.onerror = function (msg, source, lineno, colno, error) { + //opens a popup if the game encounters an error if (!errored) { errored = true; - alert("An error occurred! Please press F12 to open the dev tools, then click the 'Console' tab and send any errors shown there to chemicalcrux\n\nScreenshotting the text and line number of the error would be great.\n\nAlso include the browser information that gets logged below it.\n\nThe error might also show up here: " + msg + " at " + lineno + "," + colno); + alert( + "An error occurred! Please press F12 to open the dev tools, then click the 'Console' tab and send any errors shown there to chemicalcrux\n\nScreenshotting the text and line number of the error would be great.\n\nAlso include the browser information that gets logged below it.\n\nThe error might also show up here: " + + msg + + " at " + + lineno + + "," + + colno + ); console.log(navigator.userAgent); } @@ -25,7 +33,7 @@ const strollingEnum = { Standing: 0, Strolling: 1, Jogging: 2, - Running: 3 + Running: 3, }; let strolling = strollingEnum.Standing; @@ -45,1755 +53,2197 @@ const textFadeChoices = { stays: { name: "Text Stays", animation: "none", - next: "dims" + next: "dims", }, dims: { name: "Text Dims", animation: "log-dim 15s linear", - next: "fades" + next: "fades", }, fades: { name: "Text Fades", animation: "log-fade 20s linear", - next: "stays" - } + next: "stays", + }, }; let textFade = textFadeChoices["stays"]; - let newline = " "; let victims = {}; -let macro = //macro controls every customizable part of the players body -{ - "shrunkPrey": null, - "fastDigestFactor": 1, - "fastDigestTimer": null, - "pauseDigest": false, - "walkSpeed": 1, - - "growthPoints": 0, - - "orgasm": false, - "afterglow": false, - - "arousal": 0, - "edge": 0, - - "maleSpurt": 0, - "femaleSpurt": 0, - - "scale": 1, - "pawScale": 1, - "assScale": 1, - "dickScale": 1, - "ballScale": 1, - "vaginaScale": 1, - "wombScale": 1, - "breastScale": 1, - "tailScale": 1, - "wingScale": 1, - "muskScale": 1, - "stenchScale": 1, - "breathScale": 1, - "magicScale": 1, - - "tailDensity": 1000, - "dickDensity": 1000, - "ballDensity": 1000, - "breastDensity": 1000, - "assDensity": 1000, //this is only used for automatic growth function - "wombDensity": 1000, //this is only used for automatic growth function - "pawDensity": 1000, //this is only used for automatic growth function - - "breathStyle": "cone", - - "scaling": function (value, scale, factor) { return value * Math.pow(scale, factor); }, - get height() { return this.scaling(this.baseHeight, this.scale, 1); }, - get mass() { return this.scaling(this.baseMass, this.scale, 3); }, - get pawLength() { return this.scaling(this.basePawLength * this.pawScale, this.scale, 1); }, - get pawWidth() { return this.scaling(this.basePawWidth * this.pawScale, this.scale, 1); }, - get pawArea() { return this.pawLength * this.pawWidth; }, - get analVoreArea() { return this.scaling(Math.pow(this.baseAnalVoreDiameter * this.assScale, 2), this.scale, 2); }, - get assArea() { return this.scaling(this.baseAssArea * this.assScale, this.scale, 2); }, - get handLength() { return this.scaling(this.baseHandLength, this.scale, 1); }, - get handWidth() { return this.scaling(this.baseHandWidth, this.scale, 1); }, - get handArea() { return this.handLength * this.handWidth }, - - get wingLength() { return this.scaling(this.baseWingLength, this.scale * this.wingScale, 1); }, - get wingWidth() { return this.scaling(this.baseWingWidth, this.scale * this.wingScale, 1); }, - get wingArea() { return this.wingLength * this.wingWidth; }, - - "footOnlyDesc": function (plural = false, capital = false) { - let result = ""; - - switch (this.footType) { - case "paw": - result = plural ? "paws" : "paw"; - break; - case "hoof": - result = plural ? "hooves" : "hoof"; - break; - case "foot": - result = plural ? "feet" : "foot"; - break; - case "avian": - result = plural ? "avian feet" : "avian foot"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, +let macro = + //macro controls every customizable part of the players body + { + shrunkPrey: null, + fastDigestFactor: 1, + fastDigestTimer: null, + pauseDigest: false, + walkSpeed: 1, + + growthPoints: 0, + + orgasm: false, + afterglow: false, + + arousal: 0, + edge: 0, + + maleSpurt: 0, + femaleSpurt: 0, + + scale: 1, + pawScale: 1, + assScale: 1, + dickScale: 1, + ballScale: 1, + vaginaScale: 1, + wombScale: 1, + breastScale: 1, + tailScale: 1, + wingScale: 1, + muskScale: 1, + stenchScale: 1, + breathScale: 1, + magicScale: 1, + + tailDensity: 1000, + dickDensity: 1000, + ballDensity: 1000, + breastDensity: 1000, + assDensity: 1000, //this is only used for automatic growth function + wombDensity: 1000, //this is only used for automatic growth function + pawDensity: 1000, //this is only used for automatic growth function + + breathStyle: "cone", + + scaling: function (value, scale, factor) { + return value * Math.pow(scale, factor); + }, + get height() { + return this.scaling(this.baseHeight, this.scale, 1); + }, + get mass() { + return this.scaling(this.baseMass, this.scale, 3); + }, + get pawLength() { + return this.scaling(this.basePawLength * this.pawScale, this.scale, 1); + }, + get pawWidth() { + return this.scaling(this.basePawWidth * this.pawScale, this.scale, 1); + }, + get pawArea() { + return this.pawLength * this.pawWidth; + }, + get analVoreArea() { + return this.scaling( + Math.pow(this.baseAnalVoreDiameter * this.assScale, 2), + this.scale, + 2 + ); + }, + get assArea() { + return this.scaling(this.baseAssArea * this.assScale, this.scale, 2); + }, + get handLength() { + return this.scaling(this.baseHandLength, this.scale, 1); + }, + get handWidth() { + return this.scaling(this.baseHandWidth, this.scale, 1); + }, + get handArea() { + return this.handLength * this.handWidth; + }, - "footDesc": function (plural = false, capital = false, possessive = false) { - let result = ""; - if (!this.footWear) { - return this.footOnlyDesc(plural, capital); - } - if (!this.footSockWorn && !this.footShoeWorn) { - return this.footOnlyDesc(plural, capital); - } else if (this.footShoeWorn) { - switch (this.footShoe) { - case "shoe": - result = plural ? "shoes" : "shoe"; - break; - case "boot": - result = plural ? "boots" : "boot"; - break; - case "trainer": - result = plural ? "trainers" : "trainer"; + get wingLength() { + return this.scaling(this.baseWingLength, this.scale * this.wingScale, 1); + }, + get wingWidth() { + return this.scaling(this.baseWingWidth, this.scale * this.wingScale, 1); + }, + get wingArea() { + return this.wingLength * this.wingWidth; + }, + + footOnlyDesc: function (plural = false, capital = false) { + let result = ""; + + switch (this.footType) { + case "paw": + result = plural ? "paws" : "paw"; break; - case "sandal": - result = plural ? "sandals" : "sandal"; + case "hoof": + result = plural ? "hooves" : "hoof"; break; - case "heel": - return plural ? "high heels" : "high heel"; + case "foot": + result = plural ? "feet" : "foot"; break; - case "croc": - return plural ? "crocs" : "croc"; + case "avian": + result = plural ? "avian feet" : "avian foot"; break; } - } else if (this.footSockWorn) { - switch (this.footSock) { - case "sock": - result = "socked " + this.footOnlyDesc(plural, false); - break; - case "stocking": - result = "stocking-wrapped " + this.footOnlyDesc(plural, false); - break; + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, + + footDesc: function (plural = false, capital = false, possessive = false) { + let result = ""; + if (!this.footWear) { + return this.footOnlyDesc(plural, capital); + } + if (!this.footSockWorn && !this.footShoeWorn) { + return this.footOnlyDesc(plural, capital); + } else if (this.footShoeWorn) { + switch (this.footShoe) { + case "shoe": + result = plural ? "shoes" : "shoe"; + break; + case "boot": + result = plural ? "boots" : "boot"; + break; + case "trainer": + result = plural ? "trainers" : "trainer"; + break; + case "sandal": + result = plural ? "sandals" : "sandal"; + break; + case "heel": + return plural ? "high heels" : "high heel"; + break; + case "croc": + return plural ? "crocs" : "croc"; + break; + } + } else if (this.footSockWorn) { + switch (this.footSock) { + case "sock": + result = "socked " + this.footOnlyDesc(plural, false); + break; + case "stocking": + result = "stocking-wrapped " + this.footOnlyDesc(plural, false); + break; + } } - } - if (possessive) { - result = " your " + result; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, + if (possessive) { + result = " your " + result; + } + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - "toeNoShoeDesc": function (plural = false, capital = false) { - let result = ""; + toeNoShoeDesc: function (plural = false, capital = false) { + let result = ""; - if (!this.footSockWorn) { - return this.toeOnlyDesc(plural, capital); - } else if (this.footSockWorn) { - switch (this.footSock) { - case "sock": - result = "socked " + this.toeOnlyDesc(plural, false); + if (!this.footSockWorn) { + return this.toeOnlyDesc(plural, capital); + } else if (this.footSockWorn) { + switch (this.footSock) { + case "sock": + result = "socked " + this.toeOnlyDesc(plural, false); + } } - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - "toeOnlyDesc": function (plural = false, capital = false) { - let result = ""; + toeOnlyDesc: function (plural = false, capital = false) { + let result = ""; - switch (this.footType) { - case "paw": - result = plural ? "toes" : "toe"; - break; - case "hoof": - result = plural ? "hooves" : "hoof"; - break; - case "foot": - result = plural ? "toes" : "toe"; - break; - case "avian": - result = plural ? "talons" : "talon"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - - "toeDesc": function (plural = false, capital = false, possessive = false) { - let result = ""; - if (!this.footWear) { - return this.toeOnlyDesc(plural, capital); - } - if (!this.footSockWorn && !this.footShoeWorn) { - return this.toeOnlyDesc(plural, capital); - } else if (this.footShoeWorn) { - switch (this.footShoe) { - case "shoe": - result = plural ? "treads" : "tread"; - break; - case "boot": - result = plural ? "treads" : "tread"; + switch (this.footType) { + case "paw": + result = plural ? "toes" : "toe"; break; - case "trainer": - result = plural ? "treads" : "tread"; + case "hoof": + result = plural ? "hooves" : "hoof"; break; - case "sandal": - result = plural ? "treads" : "tread"; + case "foot": + result = plural ? "toes" : "toe"; break; - case "heel": - return plural ? "treads" : "tread"; - break; - case "croc": - return plural ? "treads" : "tread"; + case "avian": + result = plural ? "talons" : "talon"; break; } - } else if (this.footSockWorn) { - switch (this.footSock) { - case "sock": - result = "socked " + this.toeOnlyDesc(plural, false); - break; - case "stocking": - result = "stocking-wrapped " + this.footOnlyDesc(plural, false); - break; + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, + + toeDesc: function (plural = false, capital = false, possessive = false) { + let result = ""; + if (!this.footWear) { + return this.toeOnlyDesc(plural, capital); + } + if (!this.footSockWorn && !this.footShoeWorn) { + return this.toeOnlyDesc(plural, capital); + } else if (this.footShoeWorn) { + switch (this.footShoe) { + case "shoe": + result = plural ? "treads" : "tread"; + break; + case "boot": + result = plural ? "treads" : "tread"; + break; + case "trainer": + result = plural ? "treads" : "tread"; + break; + case "sandal": + result = plural ? "treads" : "tread"; + break; + case "heel": + return plural ? "treads" : "tread"; + break; + case "croc": + return plural ? "treads" : "tread"; + break; + } + } else if (this.footSockWorn) { + switch (this.footSock) { + case "sock": + result = "socked " + this.toeOnlyDesc(plural, false); + break; + case "stocking": + result = "stocking-wrapped " + this.footOnlyDesc(plural, false); + break; + } } - } - if (possessive) { - result = "your " + result; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, + if (possessive) { + result = "your " + result; + } + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - "soleNoShoeDesc": function (plural = false, capital = false) { - let 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); + 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; - }, + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - "soleOnlyDesc": function (plural = false, capital = false) { - let 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; - }, + 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) { + 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) { case "shoe": - result = plural ? "heels" : "heel"; + result = plural ? "shoes" : "shoe"; break; case "boot": - result = plural ? "heels" : "heel"; + result = plural ? "boots" : "boot"; break; case "trainer": - result = plural ? "heels" : "heel"; + result = plural ? "trainers" : "trainer"; break; case "sandal": - result = plural ? "heels" : "heel"; + result = plural ? "sandals" : "sandal"; break; case "heel": - return plural ? "soles" : "sole"; + return plural ? "high heels" : "high heel"; break; case "croc": - return plural ? "heels" : "heel"; + return plural ? "crocs" : "croc"; break; } - } else if (this.footSockWorn) { + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, + + sockDesc: function (plural, capital) { + let result = ""; switch (this.footSock) { case "sock": - result = "socked " + this.soleOnlyDesc(plural, false); + result = plural ? "socks" : "sock"; break; case "stocking": - result = "stocking-wrapped " + this.soleOnlyDesc(plural, false); + result = plural ? "stockings" : "stocking"; 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) { - case "shoe": - result = plural ? "shoes" : "shoe"; - break; - case "boot": - result = plural ? "boots" : "boot"; - break; - case "trainer": - result = plural ? "trainers" : "trainer"; - break; - case "sandal": - result = plural ? "sandals" : "sandal"; - break; - case "heel": - return plural ? "high heels" : "high heel"; - break; - case "croc": - return plural ? "crocs" : "croc"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - - "sockDesc": function (plural, capital) { - let result = ""; - switch (this.footSock) { - case "sock": - result = plural ? "socks" : "sock"; - break; - case "stocking": - result = plural ? "stockings" : "stocking"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - - "jawDesc": function (plural = false, capital = false) { - let result = ""; - switch (this.jawType) { - case "jaw": - result = plural ? "jaws" : "jaw"; - break; - case "beak": - result = "beak"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - - "biteDesc": function (plural = false, capital = false) { - let result = ""; - - switch (this.jawType) { - case "jaw": - result = plural ? "crushes" : "crush"; - break; - case "beak": - result = plural ? "slices" : "slice"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - "teethDesc": function (plural = false, capital = false) { - let result = ""; - - switch (this.jawType) { - case "jaw": - result = plural ? "fangs" : "fang"; - break; - case "beak": - result = "beak"; - break; - } - return capital ? result.charAt(0).toUpperCase() + result.slice(1) : result; - }, - - get preyGrowthFactor() { - if (macro.growthScaleWithSize) { - return this.basePreyGrowthFactor * Math.pow(this.scale, 1); - //this breaks once you get to the size of a planet - } else { - return this.basePreyGrowthFactor; - } - }, - get tailLength() { - return this.scaling(this.baseTailLength * this.tailScale, this.scale, 1); - }, - get tailDiameter() { - return this.scaling(this.baseTailDiameter * this.tailScale, this.scale, 1); - }, - get tailStretchDiameter() { - return this.scaling(this.tailStretchiness * this.baseTailDiameter * this.tailScale, this.scale, 1); - }, - get tailGirth() { - return Math.pow(this.tailDiameter / 2, 2) * Math.PI; - }, - get tailStretchGirth() { - return Math.pow(this.tailStretchDiameter / 2, 2) * Math.PI; - }, - get tailArea() { - return this.tailLength * this.tailDiameter; - }, - get tailVolume() { - return this.tailGirth * this.tailLength; - }, - get tailMass() { - return this.tailVolume * this.tailDensity; - }, - get tailDesc() { - return this.tailType + " " + (this.tailCount > 1 ? "tails" : "tail"); - }, - get tailNoDesc() { - 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(multiplier on arousal you gain from actions) - let factor = 1; - if (!this.arousalEnabled || this.arousal < 25) { - factor = 0.5; - } else if (this.arousal < 75) { - factor = 0.5 + (this.arousal - 25) / 100; - } - return factor; - }, - get dickLength() { - return this.scaling(this.baseDickLength * this.dickScale * this.arousalDickFactor, this.scale, 1); - }, - get dickDiameter() { - return this.scaling(this.baseDickDiameter * this.dickScale * this.arousalDickFactor, this.scale, 1); - }, - get dickGirth() { - return Math.pow((this.dickDiameter / 2), 2) * Math.PI; - }, - get dickStretchGirth() { - return this.dickGirth * this.dickStretchiness * this.dickStretchiness; - }, - get dickArea() { - return this.dickLength * this.dickDiameter * Math.PI / 2; - }, - get dickVolume() { - return this.dickLength * Math.pow(this.dickDiameter / 2, 2) * Math.PI; - }, - get dickMass() { - return this.dickVolume * this.dickDensity; - }, - - - get ballDiameter() { return this.scaling(this.baseBallDiameter * this.ballScale, this.scale, 1); }, - get ballArea() { return 2 * Math.PI * Math.pow(this.ballDiameter / 2, 2); }, - get ballVolume() { - let radius = this.ballDiameter / 2; - return 4 / 3 * Math.PI * Math.pow(radius, 3); - }, - get ballMass() { - let volume = this.ballVolume; - return volume * this.ballDensity; - }, - - get cumVolume() { - let vol = this.scaling(this.baseCumVolume / 1000, this.scale, 3); - return this.scaling(vol, this.dickScale, 2); - }, - - get vaginaLength() { return this.scaling(this.baseVaginaLength * this.vaginaScale, this.scale, 1); }, - get vaginaWidth() { return this.scaling(this.baseVaginaWidth * this.vaginaScale, this.scale, 1); }, - get vaginaArea() { return this.vaginaLength * this.vaginaWidth; }, - get vaginaStretchArea() { return this.vaginaStretchiness * this.vaginaStretchiness * this.vaginaLength * this.vaginaWidth; }, - // this isn't how biology works but I'll leave it in - - get vaginaVolume() { return this.vaginaArea * this.vaginaWidth; }, - - get wombVolume() { return this.scaling(this.baseWombVolume, this.wombScale * this.scale, 3); }, - - get femcumVolume() { - let vol = this.scaling(this.baseFemcumVolume / 1000, this.scale, 3); - return this.scaling(vol, this.vaginaScale, 2); - }, - - get lactationVolume() { - return this.milkStorage.limit * this.lactationFactor; - }, - - - get breastDiameter() { return this.scaling(this.baseBreastDiameter * this.breastScale, this.scale, 1); }, - get breastStretchDiameter() { return this.scaling(this.breastStretchiness * this.baseBreastDiameter * this.breastScale, this.scale, 1); }, - get breastArea() { - return 2 * Math.PI * Math.pow(this.breastDiameter / 2, 2); - }, - get breastStretchArea() { - return 2 * Math.PI * Math.pow(this.breastStretchDiameter / 2, 2); - }, - get breastVolume() { - let radius = this.breastDiameter / 2; - return 4 / 3 * Math.PI * Math.pow(radius, 3); - }, - get breastMass() { - let volume = this.breastVolume; - return volume * this.breastDensity; - }, - - get droolVolume() { - return this.scaling(this.droolBaseVolume / 1000, this.scale, 3); - }, - - "digest": function (owner, organ, time = 15, auto = true) { - - // 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); - } - - if (macro.pauseDigest) { - return; - } - - let count = Math.min(organ.contents.length, organ.maxDigest); - - let container = organ.contents.pop(); - organ.contents.unshift(new Container()); - - if (container.count == 0) - return; - - do_digestion(owner, organ, container); + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - }, + jawDesc: function (plural = false, capital = false) { + let result = ""; + switch (this.jawType) { + case "jaw": + result = plural ? "jaws" : "jaw"; + break; + case "beak": + result = "beak"; + break; + } + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - get scatDigestFactor() { - if (this.scatScaleWithSize) { - return this.baseScatDigestFactor * this.scale; - } else { - return this.baseScatDigestFactor; - } - }, + biteDesc: function (plural = false, capital = false) { + let result = ""; - "stomach": { - "name": "stomach", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.oralDigestTime, owner.oralDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); - }, - "describeDigestion": function (container) { - return describe("stomach", container, this.owner, verbose, flat); - }, - "fill": function (owner, container) { - if (owner.gasEnabled) - owner.gasStorage.amount += container.sum_property("mass") * owner.gasDigestFactor / 1e4; - if (owner.scatEnabled) { - owner.scatStorage.amount += container.sum_property("mass") * owner.scatDigestFactor / 1e3; - owner.scatStorage.victims = owner.scatStorage.victims.merge(container); + switch (this.jawType) { + case "jaw": + result = plural ? "crushes" : "crush"; + break; + case "beak": + result = plural ? "slices" : "slice"; + break; } + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); + teethDesc: function (plural = false, capital = false) { + let result = ""; - if (verbose || flat) { - prey = flatten(prey); + switch (this.jawType) { + case "jaw": + result = plural ? "fangs" : "fang"; + break; + case "beak": + result = "beak"; + break; } + return capital + ? result.charAt(0).toUpperCase() + result.slice(1) + : result; + }, - if (prey.count == 0) { - return "Your belly is flat, growling and gurgling for want of prey."; + get preyGrowthFactor() { + if (macro.growthScaleWithSize) { + return this.basePreyGrowthFactor * Math.pow(this.scale, 1); + //this breaks once you get to the size of a planet } else { - if (macro.brutality > 0) { - return "Your belly churns and bubbles as it works to melt " + prey.describeSimple(verbose || flat) + " down to chyme."; - } else { - return "Your belly sloshes with the weight of " + prey.describeSimple(verbose || flat) + " trapped within."; - } + return this.basePreyGrowthFactor; } }, - "contents": [], - "stages": 3 - }, - - "tail": { - "name": "tail", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.tailDigestTime, owner.tailDigestAuto); + get tailLength() { + return this.scaling(this.baseTailLength * this.tailScale, this.scale, 1); }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); + get tailDiameter() { + return this.scaling( + this.baseTailDiameter * this.tailScale, + this.scale, + 1 + ); }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); + get tailStretchDiameter() { + return this.scaling( + this.tailStretchiness * this.baseTailDiameter * this.tailScale, + this.scale, + 1 + ); }, - "describeMove": function (container) { - return describe("tail-to-stomach", container, this.owner, verbose, flat); + get tailGirth() { + return Math.pow(this.tailDiameter / 2, 2) * Math.PI; }, - "describeDigestion": function (container) { - return describe("tail", container, this.owner, verbose, flat); + get tailStretchGirth() { + return Math.pow(this.tailStretchDiameter / 2, 2) * Math.PI; }, - "fill": function (owner, container) { - if (owner.gasEnabled) - owner.gasStorage.amount += container.sum_property("mass") * owner.gasDigestFactor / 1e3; - if (owner.scatEnabled) { - owner.scatStorage.amount += container.sum_property("mass") * owner.scatDigestFactor / 1e3; - owner.scatStorage.victims = owner.scatStorage.victims.merge(container); - } + get tailArea() { + return this.tailLength * this.tailDiameter; }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - - if (verbose || flat) { - prey = flatten(prey); - } - - if (prey.count == 0) { - return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "are" : "is") + " empty."; - } else { - if (this.owner.tailVoreToStomach) { - return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "clench and squeeze around " : "clenches and squeezes around ") + prey.describeSimple(verbose || flat) + ", working them deeper and deeper inside."; - } - else if (macro.brutality > 0) { - return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "groans" : "groan") + " ominously as " + (this.owner.tailCount > 1 ? "they gurgle" : "it gurgles") + " around " + prey.describeSimple(verbose || flat) + ", slowly absorbing them into your musky depths."; - } else { - return "Your " + this.owner.tailDesc + " " + (this.owner.tailCount > 1 ? "bulge" : "bulges") + " with " + prey.describeSimple(verbose || flat) + "."; - } + get tailVolume() { + return this.tailGirth * this.tailLength; + }, + get tailMass() { + return this.tailVolume * this.tailDensity; + }, + get tailDesc() { + return this.tailType + " " + (this.tailCount > 1 ? "tails" : "tail"); + }, + get tailNoDesc() { + 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(multiplier on arousal you gain from actions) + let factor = 1; + if (!this.arousalEnabled || this.arousal < 25) { + factor = 0.5; + } else if (this.arousal < 75) { + factor = 0.5 + (this.arousal - 25) / 100; } + return factor; }, - "contents": [], - "stages": 3 - }, - - "bowels": { - "name": "bowels", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.analDigestTime, owner.analDigestAuto); + get dickLength() { + return this.scaling( + this.baseDickLength * this.dickScale * this.arousalDickFactor, + this.scale, + 1 + ); }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); + get dickDiameter() { + return this.scaling( + this.baseDickDiameter * this.dickScale * this.arousalDickFactor, + this.scale, + 1 + ); }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); + get dickGirth() { + return Math.pow(this.dickDiameter / 2, 2) * Math.PI; }, - "describeMove": function (container) { - return describe("bowels-to-stomach", container, this.owner, verbose, flat); + get dickStretchGirth() { + return this.dickGirth * this.dickStretchiness * this.dickStretchiness; }, - "describeDigestion": function (container) { - return describe("bowels", container, this.owner, verbose, flat); + get dickArea() { + return (this.dickLength * this.dickDiameter * Math.PI) / 2; }, - "fill": function (owner, container) { - if (owner.gasEnabled) - owner.gasStorage.amount += container.sum_property("mass") * owner.gasDigestFactor / 1e3; - if (owner.scatEnabled) { - owner.scatStorage.amount += container.sum_property("mass") * owner.scatDigestFactor / 1e3; - owner.scatStorage.victims = owner.scatStorage.victims.merge(container); - } + get dickVolume() { + return this.dickLength * Math.pow(this.dickDiameter / 2, 2) * Math.PI; }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - - if (verbose || flat) { - prey = flatten(prey); - } - - if (prey.count == 0) { - return "Your bowels are empty."; - } else { - if (macro.brutality > 0) { - return "Your bowels groan ominously as they clench around " + prey.describeSimple(verbose || flat) + ", slowly absorbing them into your musky depths."; - } else { - return "Your bowels bulge with " + prey.describeSimple(verbose || flat) + "."; - } - } + get dickMass() { + return this.dickVolume * this.dickDensity; }, - "contents": [], - "stages": 3 - }, - get femcumDigestFactor() { - if (this.femcumScaleWithSize) { - return this.baseFemcumDigestFactor * this.scale; - } else { - return this.baseFemcumDigestFactor; - } - }, - - "womb": { - "name": "womb", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.unbirthDigestTime, owner.unbirthDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); + get ballDiameter() { + return this.scaling( + this.baseBallDiameter * this.ballScale, + this.scale, + 1 + ); }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); + get ballArea() { + return 2 * Math.PI * Math.pow(this.ballDiameter / 2, 2); }, - "describeDigestion": function (container, vol) { - return describe("womb", container, this.owner, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + get ballVolume() { + let radius = this.ballDiameter / 2; + return (4 / 3) * Math.PI * Math.pow(radius, 3); }, - "fill": function (owner, container) { - let amount = container.sum_property("mass") * owner.femcumDigestFactor / 1e3; - owner.femcumStorage.amount += amount; - return amount; + get ballMass() { + let volume = this.ballVolume; + return volume * this.ballDensity; }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - - if (verbose || flat) { - prey = flatten(prey); - } - if (prey.count == 0) { - return "Your lower belly is flat."; - } else { - if (macro.brutality > 0) { - return "Your womb tingles as its rhythmically grinds down on " + prey.describeSimple(verbose || flat) + ", turning them soft and wet as they start to dissolve into femcum."; - } else { - return "Your womb clenches around " + prey.describeSimple(verbose || flat) + "."; - } - } + get cumVolume() { + let vol = this.scaling(this.baseCumVolume / 1000, this.scale, 3); + return this.scaling(vol, this.dickScale, 2); }, - "contents": [], - "stages": 3 - }, - get cumDigestFactor() { - if (this.cumScaleWithSize) { - return this.baseCumDigestFactor * this.scale; - } else { - return this.baseCumDigestFactor; - } - }, - - "balls": { - "name": "balls", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.cockDigestTime, owner.cockDigestAuto); + get vaginaLength() { + return this.scaling( + this.baseVaginaLength * this.vaginaScale, + this.scale, + 1 + ); }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); + get vaginaWidth() { + return this.scaling( + this.baseVaginaWidth * this.vaginaScale, + this.scale, + 1 + ); }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); + get vaginaArea() { + return this.vaginaLength * this.vaginaWidth; }, - "describeDigestion": function (container, vol) { - return describe("balls", container, this.owner, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + get vaginaStretchArea() { + return ( + this.vaginaStretchiness * + this.vaginaStretchiness * + this.vaginaLength * + this.vaginaWidth + ); }, - "fill": function (owner, container) { - let amount = container.sum_property("mass") * owner.cumDigestFactor / 1e3; - owner.cumStorage.amount += amount; - return amount; + // this isn't how biology works but I'll leave it in + + get vaginaVolume() { + return this.vaginaArea * this.vaginaWidth; }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); - } + get wombVolume() { + return this.scaling(this.baseWombVolume, this.wombScale * this.scale, 3); + }, - if (prey.count == 0) { - return "Your balls are smooth."; - } else { - if (macro.brutality > 0) { - return "Your balls slosh and bulge as they work to convert " + prey.describeSimple(verbose || flat) + " into hot cum."; - } else { - return "Your balls slosh about, loaded down with " + prey.describeSimple(verbose || flat) + "."; - } - } + get femcumVolume() { + let vol = this.scaling(this.baseFemcumVolume / 1000, this.scale, 3); + return this.scaling(vol, this.vaginaScale, 2); }, - "contents": [], - "stages": 3 - }, - get milkDigestFactor() { - if (this.milkScaleWithSize) { - return this.baseMilkDigestFactor * this.scale; - } else { - return this.baseMilkDigestFactor; - } - }, + get lactationVolume() { + return this.milkStorage.limit * this.lactationFactor; + }, - "breasts": { - "name": "breasts", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.breastDigestTime, owner.breastDigestAuto); + get breastDiameter() { + return this.scaling( + this.baseBreastDiameter * this.breastScale, + this.scale, + 1 + ); }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); + get breastStretchDiameter() { + return this.scaling( + this.breastStretchiness * this.baseBreastDiameter * this.breastScale, + this.scale, + 1 + ); }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); + get breastArea() { + return 2 * Math.PI * Math.pow(this.breastDiameter / 2, 2); }, - "describeDigestion": function (container, vol) { - return describe("breasts", container, this.owner, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + get breastStretchArea() { + return 2 * Math.PI * Math.pow(this.breastStretchDiameter / 2, 2); }, - "fill": function (owner, container) { - if (macro.lactationEnabled) { - let amount = container.sum_property("mass") * owner.milkDigestFactor / 1e3; - owner.milkStorage.amount += amount; - return amount; - } + get breastVolume() { + let radius = this.breastDiameter / 2; + return (4 / 3) * Math.PI * Math.pow(radius, 3); + }, + get breastMass() { + let volume = this.breastVolume; + return volume * this.breastDensity; + }, + + get droolVolume() { + return this.scaling(this.droolBaseVolume / 1000, this.scale, 3); }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); + digest: function (owner, organ, time = 15, auto = true) { + // 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); } - if (prey.count == 0) { - return "Your breasts are smooth."; - } else { - if (macro.brutality > 0) { - return "Your breasts slosh from side to side, " + prey.describeSimple(verbose || flat) + " slowly digesting into creamy milk."; - } else { - return "Your breasts bulge with " + prey.describeSimple(verbose || flat) + "."; - } + if (macro.pauseDigest) { + return; } - }, - "contents": [], - "stages": 3 - }, - get pissDigestFactor() { - if (this.pissScaleWithSize) { - return this.basePissDigestFactor * this.scale; - } else { - return this.basePissDigestFactor; - } - }, - "bladder": { - "name": "bladder", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.bladderDigestTime, owner.bladderDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); - }, - "describeDigestion": function (container, vol) { - return describe("bladder", container, this.owner, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); - }, - "fill": function (owner, container) { - let amount = container.sum_property("mass") * owner.pissDigestFactor / 1e3; - owner.pissStorage.amount += amount; - return amount; + let count = Math.min(organ.contents.length, organ.maxDigest); + + let container = organ.contents.pop(); + organ.contents.unshift(new Container()); + + if (container.count == 0) return; + + do_digestion(owner, organ, container); }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); + get scatDigestFactor() { + if (this.scatScaleWithSize) { + return this.baseScatDigestFactor * this.scale; + } else { + return this.baseScatDigestFactor; } + }, + + stomach: { + name: "stomach", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.oralDigestTime, owner.oralDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container) { + return describe("stomach", container, this.owner, verbose, flat); + }, + fill: function (owner, container) { + if (owner.gasEnabled) + owner.gasStorage.amount += + (container.sum_property("mass") * owner.gasDigestFactor) / 1e4; + if (owner.scatEnabled) { + owner.scatStorage.amount += + (container.sum_property("mass") * owner.scatDigestFactor) / 1e3; + owner.scatStorage.victims = + owner.scatStorage.victims.merge(container); + } + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - if (prey.count == 0) { - return "Your bladder has nobody in it."; - } else { - if (macro.brutality > 0) { - return "Your bladder bulges, " + prey.describeSimple(verbose || flat) + " dissolving in your acrid piss."; + if (prey.count == 0) { + return "Your belly is flat, growling and gurgling for want of prey."; } else { - return "Your bladder bulges with " + prey.describeSimple(verbose || flat) + "."; + if (macro.brutality > 0) { + return ( + "Your belly churns and bubbles as it works to melt " + + prey.describeSimple(verbose || flat) + + " down to chyme." + ); + } else { + return ( + "Your belly sloshes with the weight of " + + prey.describeSimple(verbose || flat) + + " trapped within." + ); + } } - } + }, + contents: [], + stages: 3, }, - "contents": [], - "stages": 3 - }, - "souls": { - "name": "souls", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.soulDigestTime, owner.soulDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - if (get_living_prey(prey.sum()) > 0) + tail: { + name: "tail", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.tailDigestTime, owner.tailDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { this.contents[0] = this.contents[0].merge(prey); + }, + describeMove: function (container) { + return describe( + "tail-to-stomach", + container, + this.owner, + verbose, + flat + ); + }, + describeDigestion: function (container) { + return describe("tail", container, this.owner, verbose, flat); + }, + fill: function (owner, container) { + if (owner.gasEnabled) + owner.gasStorage.amount += + (container.sum_property("mass") * owner.gasDigestFactor) / 1e3; + if (owner.scatEnabled) { + owner.scatStorage.amount += + (container.sum_property("mass") * owner.scatDigestFactor) / 1e3; + owner.scatStorage.victims = + owner.scatStorage.victims.merge(container); + } + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } + + if (prey.count == 0) { + return ( + "Your " + + this.owner.tailDesc + + " " + + (this.owner.tailCount > 1 ? "are" : "is") + + " empty." + ); + } else { + if (this.owner.tailVoreToStomach) { + return ( + "Your " + + this.owner.tailDesc + + " " + + (this.owner.tailCount > 1 + ? "clench and squeeze around " + : "clenches and squeezes around ") + + prey.describeSimple(verbose || flat) + + ", working them deeper and deeper inside." + ); + } else if (macro.brutality > 0) { + return ( + "Your " + + this.owner.tailDesc + + " " + + (this.owner.tailCount > 1 ? "groans" : "groan") + + " ominously as " + + (this.owner.tailCount > 1 ? "they gurgle" : "it gurgles") + + " around " + + prey.describeSimple(verbose || flat) + + ", slowly absorbing them into your musky depths." + ); + } else { + return ( + "Your " + + this.owner.tailDesc + + " " + + (this.owner.tailCount > 1 ? "bulge" : "bulges") + + " with " + + prey.describeSimple(verbose || flat) + + "." + ); + } + } + }, + contents: [], + stages: 3, }, - "describeDigestion": function (container) { - return describe("soul-digest", container, this.owner, verbose, flat); - }, - "fill": function (owner, container) { - add_victim_people("soul-digest", container); - }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - let souls = get_living_prey(prey.sum()); + bowels: { + name: "bowels", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.analDigestTime, owner.analDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeMove: function (container) { + return describe( + "bowels-to-stomach", + container, + this.owner, + verbose, + flat + ); + }, + describeDigestion: function (container) { + return describe("bowels", container, this.owner, verbose, flat); + }, + fill: function (owner, container) { + if (owner.gasEnabled) + owner.gasStorage.amount += + (container.sum_property("mass") * owner.gasDigestFactor) / 1e3; + if (owner.scatEnabled) { + owner.scatStorage.amount += + (container.sum_property("mass") * owner.scatDigestFactor) / 1e3; + owner.scatStorage.victims = + owner.scatStorage.victims.merge(container); + } + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - if (souls == 0) { - return "Your depths hold no souls."; - } else { - if (macro.brutality > 0) { - return "Your depths bubble and boil with energy, slowly digesting " + (souls > 1 ? souls + " souls." : "a lonely soul"); + if (prey.count == 0) { + return "Your bowels are empty."; } else { - return "You feel " + (souls > 1 ? souls + " souls " : "a soul ") + "trapped in your depths."; + if (macro.brutality > 0) { + return ( + "Your bowels groan ominously as they clench around " + + prey.describeSimple(verbose || flat) + + ", slowly absorbing them into your musky depths." + ); + } else { + return ( + "Your bowels bulge with " + + prey.describeSimple(verbose || flat) + + "." + ); + } } + }, + contents: [], + stages: 3, + }, + + get femcumDigestFactor() { + if (this.femcumScaleWithSize) { + return this.baseFemcumDigestFactor * this.scale; + } else { + return this.baseFemcumDigestFactor; } }, - "contents": [], - "stages": 3 - }, - "goo": { - "name": "goo", - "setup": function (owner) { - this.owner = owner; + womb: { + name: "womb", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest( + owner, + this, + owner.unbirthDigestTime, + owner.unbirthDigestAuto + ); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container, vol) { + return describe("womb", container, this.owner, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); + }, + fill: function (owner, container) { + let amount = + (container.sum_property("mass") * owner.femcumDigestFactor) / 1e3; + owner.femcumStorage.amount += amount; + return amount; + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); + if (prey.count == 0) { + return "Your lower belly is flat."; + } else { + if (macro.brutality > 0) { + return ( + "Your womb tingles as its rhythmically grinds down on " + + prey.describeSimple(verbose || flat) + + ", turning them soft and wet as they start to dissolve into femcum." + ); + } else { + return ( + "Your womb clenches around " + + prey.describeSimple(verbose || flat) + + "." + ); + } + } + }, + contents: [], + stages: 3, + }, - if (owner.gooDigestion) { - owner.digest(owner, this, owner.gooDigestTime, owner.gooDigestAuto); + get cumDigestFactor() { + if (this.cumScaleWithSize) { + return this.baseCumDigestFactor * this.scale; + } else { + return this.baseCumDigestFactor; } - - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); }, - "describeDigestion": function (container) { - add_victim_people("goo", container); - return describe("goo-digest", container, this.owner, verbose, flat); - }, - "fill": function (owner, container) { + balls: { + name: "balls", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.cockDigestTime, owner.cockDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container, vol) { + return describe("balls", container, this.owner, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); + }, + fill: function (owner, container) { + let amount = + (container.sum_property("mass") * owner.cumDigestFactor) / 1e3; + owner.cumStorage.amount += amount; + return amount; + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } + + if (prey.count == 0) { + return "Your balls are smooth."; + } else { + if (macro.brutality > 0) { + return ( + "Your balls slosh and bulge as they work to convert " + + prey.describeSimple(verbose || flat) + + " into hot cum." + ); + } else { + return ( + "Your balls slosh about, loaded down with " + + prey.describeSimple(verbose || flat) + + "." + ); + } + } + }, + contents: [], + stages: 3, }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); + get milkDigestFactor() { + if (this.milkScaleWithSize) { + return this.baseMilkDigestFactor * this.scale; + } else { + return this.baseMilkDigestFactor; } + }, - if (prey.count == 0) { - return "You contain no prey."; - } else { - if (macro.gooDigestion) { - return "Your gooey body contains " + prey.describeSimple(verbose || flat) + ", gradually absorbing them into your bulk."; + breasts: { + name: "breasts", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest( + owner, + this, + owner.breastDigestTime, + owner.breastDigestAuto + ); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container, vol) { + return describe( + "breasts", + container, + this.owner, + verbose, + flat + ).replace("$VOLUME", volume(vol, unit, false)); + }, + fill: function (owner, container) { + if (macro.lactationEnabled) { + let amount = + (container.sum_property("mass") * owner.milkDigestFactor) / 1e3; + owner.milkStorage.amount += amount; + return amount; + } + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } + + if (prey.count == 0) { + return "Your breasts are smooth."; } else { - return "Your gooey body contains " + prey.describeSimple(verbose || flat) + "."; + if (macro.brutality > 0) { + return ( + "Your breasts slosh from side to side, " + + prey.describeSimple(verbose || flat) + + " slowly digesting into creamy milk." + ); + } else { + return ( + "Your breasts bulge with " + + prey.describeSimple(verbose || flat) + + "." + ); + } } + }, + contents: [], + stages: 3, + }, + get pissDigestFactor() { + if (this.pissScaleWithSize) { + return this.basePissDigestFactor * this.scale; + } else { + return this.basePissDigestFactor; } }, - "contents": [], - "stages": 3 - }, - get breathArea() { return this.scaling(this.baseBreathArea, macro.breathScale * this.scale, 2); }, + bladder: { + name: "bladder", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest( + owner, + this, + owner.bladderDigestTime, + owner.bladderDigestAuto + ); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container, vol) { + return describe( + "bladder", + container, + this.owner, + verbose, + flat + ).replace("$VOLUME", volume(vol, unit, false)); + }, + fill: function (owner, container) { + let amount = + (container.sum_property("mass") * owner.pissDigestFactor) / 1e3; + owner.pissStorage.amount += amount; + return amount; + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - "pawsVore": { - "name": "paws", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.pawDigestTime, owner.pawDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); - }, - "describeDigestion": function (container) { - return describe("paws", container, this.owner, verbose, flat); + if (prey.count == 0) { + return "Your bladder has nobody in it."; + } else { + if (macro.brutality > 0) { + return ( + "Your bladder bulges, " + + prey.describeSimple(verbose || flat) + + " dissolving in your acrid piss." + ); + } else { + return ( + "Your bladder bulges with " + + prey.describeSimple(verbose || flat) + + "." + ); + } + } + }, + contents: [], + stages: 3, }, - "fill": function (owner, container) { + souls: { + name: "souls", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.soulDigestTime, owner.soulDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + if (get_living_prey(prey.sum()) > 0) + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container) { + return describe("soul-digest", container, this.owner, verbose, flat); + }, + fill: function (owner, container) { + add_victim_people("soul-digest", container); + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + let souls = get_living_prey(prey.sum()); + + if (souls == 0) { + return "Your depths hold no souls."; + } else { + if (macro.brutality > 0) { + return ( + "Your depths bubble and boil with energy, slowly digesting " + + (souls > 1 ? souls + " souls." : "a lonely soul") + ); + } else { + return ( + "You feel " + + (souls > 1 ? souls + " souls " : "a soul ") + + "trapped in your depths." + ); + } + } + }, + contents: [], + stages: 3, }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); - } + goo: { + name: "goo", + setup: function (owner) { + this.owner = owner; - if (prey.count == 0) { - return "Your " + this.owner.footOnlyDesc(true) + " don't contain any prey."; - } else { - return "Your " + this.owner.footOnlyDesc(true) + " have enveloped " + prey.describeSimple(verbose || flat); - } - }, - "contents": [], - "stages": 3 - }, + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); - "crop": { - "name": "crop", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.cropTransferTime, owner.cropTransferAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); - }, - "describeDigestion": function (container) { - return describe("crop-transfer", container, this.owner, verbose, flat); - }, - "describeMove": function (container) { - return describe("crop-transfer", container, this.owner, verbose, flat); + if (owner.gooDigestion) { + owner.digest(owner, this, owner.gooDigestTime, owner.gooDigestAuto); + } + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container) { + add_victim_people("goo", container); + return describe("goo-digest", container, this.owner, verbose, flat); + }, + fill: function (owner, container) {}, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } + + if (prey.count == 0) { + return "You contain no prey."; + } else { + if (macro.gooDigestion) { + return ( + "Your gooey body contains " + + prey.describeSimple(verbose || flat) + + ", gradually absorbing them into your bulk." + ); + } else { + return ( + "Your gooey body contains " + + prey.describeSimple(verbose || flat) + + "." + ); + } + } + }, + contents: [], + stages: 3, }, - "fill": function (owner, container) { + get breathArea() { + return this.scaling( + this.baseBreathArea, + macro.breathScale * this.scale, + 2 + ); }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); - } + pawsVore: { + name: "paws", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.pawDigestTime, owner.pawDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container) { + return describe("paws", container, this.owner, verbose, flat); + }, + fill: function (owner, container) {}, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - if (prey.count == 0) { - return "Your crop don't contain any prey."; - } else { - return "Your crop bulges with " + prey.describeSimple(verbose || flat) + "."; - } + if (prey.count == 0) { + return ( + "Your " + this.owner.footOnlyDesc(true) + " don't contain any prey." + ); + } else { + return ( + "Your " + + this.owner.footOnlyDesc(true) + + " have enveloped " + + prey.describeSimple(verbose || flat) + ); + } + }, + contents: [], + stages: 3, }, - "contents": [], - "stages": 3 - }, - "wings": { - "name": "wings", - "setup": function (owner) { - this.owner = owner; - for (let i = 0; i < this.stages; i++) - this.contents.push(new Container()); - owner.digest(owner, this, owner.wingDigestTime, owner.wingDigestAuto); - }, - "feed": function (prey) { - this.feedFunc(prey, this, this.owner); - }, - "feedFunc": function (prey, self, owner) { - this.contents[0] = this.contents[0].merge(prey); - }, - "describeMove": function (container) { - return describe("wings-to-stomach", container, this.owner, verbose, flat); - }, - "describeDigestion": function (container) { - return describe("wings", container, this.owner, verbose, flat); - }, - "fill": function (owner, container) { - // no-op + crop: { + name: "crop", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest( + owner, + this, + owner.cropTransferTime, + owner.cropTransferAuto + ); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeDigestion: function (container) { + return describe("crop-transfer", container, this.owner, verbose, flat); + }, + describeMove: function (container) { + return describe("crop-transfer", container, this.owner, verbose, flat); + }, + fill: function (owner, container) {}, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } + + if (prey.count == 0) { + return "Your crop don't contain any prey."; + } else { + return ( + "Your crop bulges with " + + prey.describeSimple(verbose || flat) + + "." + ); + } + }, + contents: [], + stages: 3, }, - get description() { - let prey = new Container(); - this.contents.forEach(function (x) { - prey = prey.merge(x); - }); - if (verbose || flat) { - prey = flatten(prey); - } + wings: { + name: "wings", + setup: function (owner) { + this.owner = owner; + for (let i = 0; i < this.stages; i++) + this.contents.push(new Container()); + owner.digest(owner, this, owner.wingDigestTime, owner.wingDigestAuto); + }, + feed: function (prey) { + this.feedFunc(prey, this, this.owner); + }, + feedFunc: function (prey, self, owner) { + this.contents[0] = this.contents[0].merge(prey); + }, + describeMove: function (container) { + return describe( + "wings-to-stomach", + container, + this.owner, + verbose, + flat + ); + }, + describeDigestion: function (container) { + return describe("wings", container, this.owner, verbose, flat); + }, + fill: function (owner, container) { + // no-op + }, + get description() { + let prey = new Container(); + this.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (verbose || flat) { + prey = flatten(prey); + } - if (prey.count == 0) { - return "Your don't have anyone trapped in your " + macro.wingDesc + " wings."; - } else { - if (macro.brutality > 0) { - return "Your " + macro.wingDesc + " wings bulge as they squeeze in on " + prey.describeSimple(verbose || flat) + ", slowly breaking them down."; + if (prey.count == 0) { + return ( + "Your don't have anyone trapped in your " + + macro.wingDesc + + " wings." + ); } else { - return "Your " + macro.wingDesc + " wings bulge with " + prey.describeSimple(verbose || flat) + "."; + if (macro.brutality > 0) { + return ( + "Your " + + macro.wingDesc + + " wings bulge as they squeeze in on " + + prey.describeSimple(verbose || flat) + + ", slowly breaking them down." + ); + } else { + return ( + "Your " + + macro.wingDesc + + " wings bulge with " + + prey.describeSimple(verbose || flat) + + "." + ); + } } - } + }, + contents: [], + stages: 3, }, - "contents": [], - "stages": 3 - }, - // holding spots + // holding spots - "pouch": { - "name": "pouch", - "container": new Container(), - get description() { - let prey = this.container; + pouch: { + name: "pouch", + container: new Container(), + get description() { + let prey = this.container; - if (verbose || flat) { - prey = flatten(prey); - } + if (verbose || flat) { + prey = flatten(prey); + } - if (this.container.count == 0) - return "Your pouch is empty"; - else - return "Your pouch contains " + this.container.describeSimple(verbose || flat); + if (this.container.count == 0) return "Your pouch is empty"; + else + return ( + "Your pouch contains " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "sheath": { - "name": "sheath", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "Your sheath is empty"; - else - return "Your sheath contains " + this.container.describeSimple(verbose || flat); + sheath: { + name: "sheath", + container: new Container(), + get description() { + if (this.container.count == 0) return "Your sheath is empty"; + else + return ( + "Your sheath contains " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "foreskin": { - "name": "foreskin", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "Your foreskin is wrapped tightly around your shaft."; - else - return "Your foreskin bulges with " + this.container.describeSimple(verbose || flat); + foreskin: { + name: "foreskin", + container: new Container(), + get description() { + if (this.container.count == 0) + return "Your foreskin is wrapped tightly around your shaft."; + else + return ( + "Your foreskin bulges with " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "cleavage": { - "name": "cleavage", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "Your breasts don't have anyone stuck between them"; - else - return "Your cleavage contains " + this.container.describeSimple(verbose || flat); + cleavage: { + name: "cleavage", + container: new Container(), + get description() { + if (this.container.count == 0) + return "Your breasts don't have anyone stuck between them"; + else + return ( + "Your cleavage contains " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "shoeTrapped": new Container(), - "sockTrapped": new Container(), + shoeTrapped: new Container(), + sockTrapped: new Container(), - "shoe": { - "name": "shoe", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "Your " + macro.shoeDesc(true) + " are empty."; - else - return "Your " + macro.shoeDesc(true) + " contain " + this.container.describeSimple(verbose || flat); + shoe: { + name: "shoe", + container: new Container(), + get description() { + if (this.container.count == 0) + return "Your " + macro.shoeDesc(true) + " are empty."; + else + return ( + "Your " + + macro.shoeDesc(true) + + " contain " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "sock": { - "name": "sock", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "Your " + macro.sockDesc(true) + " are empty."; - else - return "Your " + macro.sockDesc(true) + " contain " + this.container.describeSimple(verbose || flat); + sock: { + name: "sock", + container: new Container(), + get description() { + if (this.container.count == 0) + return "Your " + macro.sockDesc(true) + " are empty."; + else + return ( + "Your " + + macro.sockDesc(true) + + " contain " + + this.container.describeSimple(verbose || flat) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "paws": { - "name": "paws", - "container": new Container(), - get description() { - if (this.container.count == 0) - return "You don't have anyone stuck between your " + this.owner.toeDesc(true); - else - return "You have " + this.container.describeSimple(verbose || flat) + " wedged between your " + this.owner.toeDesc(true); + paws: { + name: "paws", + container: new Container(), + get description() { + if (this.container.count == 0) + return ( + "You don't have anyone stuck between your " + + this.owner.toeDesc(true) + ); + else + return ( + "You have " + + this.container.describeSimple(verbose || flat) + + " wedged between your " + + this.owner.toeDesc(true) + ); + }, + add: function (victims) { + this.container = this.container.merge(victims); + }, }, - "add": function (victims) { - this.container = this.container.merge(victims); - } - }, - "init": function () { - this.stomach.setup(this); - this.bowels.setup(this); - this.tail.setup(this); - this.womb.setup(this); - this.balls.setup(this); - this.breasts.setup(this); - this.bladder.setup(this); - this.souls.setup(this); - this.goo.setup(this); - this.pawsVore.setup(this); - this.crop.setup(this); - this.wings.setup(this); - this.cumStorage.owner = this; - this.femcumStorage.owner = this; - this.milkStorage.owner = this; - this.gasStorage.owner = this; - this.pissStorage.owner = this; - this.scatStorage.owner = this; - - this.paws.owner = this; - - if (this.analVoreToStomach) { - this.bowels.moves = this.stomach; - } + init: function () { + this.stomach.setup(this); + this.bowels.setup(this); + this.tail.setup(this); + this.womb.setup(this); + this.balls.setup(this); + this.breasts.setup(this); + this.bladder.setup(this); + this.souls.setup(this); + this.goo.setup(this); + this.pawsVore.setup(this); + this.crop.setup(this); + this.wings.setup(this); + this.cumStorage.owner = this; + this.femcumStorage.owner = this; + this.milkStorage.owner = this; + this.gasStorage.owner = this; + this.pissStorage.owner = this; + this.scatStorage.owner = this; + + this.paws.owner = this; + + if (this.analVoreToStomach) { + this.bowels.moves = this.stomach; + } - if (this.tailVoreToStomach) { - this.tail.moves = this.stomach; - } + if (this.tailVoreToStomach) { + this.tail.moves = this.stomach; + } - if (this.wingVoreToStomach) { - this.wings.moves = this.stomach; - } + if (this.wingVoreToStomach) { + this.wings.moves = this.stomach; + } - this.crop.moves = this.stomach; + this.crop.moves = this.stomach; - if (this.maleParts) - this.fillCum(this); - if (this.femaleParts) - this.fillFemcum(this); - if (this.lactationEnabled && this.hasBreasts) - this.fillBreasts(this); + if (this.maleParts) this.fillCum(this); + if (this.femaleParts) this.fillFemcum(this); + if (this.lactationEnabled && this.hasBreasts) this.fillBreasts(this); - this.quenchExcess(this); + this.quenchExcess(this); - if (this.gasEnabled) - this.fillGas(this); - if (this.pissEnabled) - this.fillPiss(this); - if (this.scatEnabled) - this.fillScat(this); - }, + if (this.gasEnabled) this.fillGas(this); + if (this.pissEnabled) this.fillPiss(this); + if (this.scatEnabled) this.fillScat(this); + }, - "fillCum": function (self) { - self.cumStorage.amount += self.cumStorage.limit * self.baseCumProduction * fillPeriod / 1000; - if (self.cumStorage.amount > self.cumStorage.limit) - self.arouse(1 * (self.cumStorage.amount / self.cumStorage.limit - 1)); - setTimeout(function () { self.fillCum(self); }, fillPeriod); - }, + fillCum: function (self) { + self.cumStorage.amount += + (self.cumStorage.limit * self.baseCumProduction * fillPeriod) / 1000; + if (self.cumStorage.amount > self.cumStorage.limit) + self.arouse(1 * (self.cumStorage.amount / self.cumStorage.limit - 1)); + setTimeout(function () { + self.fillCum(self); + }, fillPeriod); + }, - "fillFemcum": function (self) { - self.femcumStorage.amount += self.femcumStorage.limit * self.baseFemcumProduction * fillPeriod / 1000; - if (self.femcumStorage.amount > self.femcumStorage.limit) - self.arouse(1 * (self.femcumStorage.amount / self.femcumStorage.limit - 1)); - setTimeout(function () { self.fillFemcum(self); }, fillPeriod); - }, + fillFemcum: function (self) { + self.femcumStorage.amount += + (self.femcumStorage.limit * self.baseFemcumProduction * fillPeriod) / + 1000; + if (self.femcumStorage.amount > self.femcumStorage.limit) + self.arouse( + 1 * (self.femcumStorage.amount / self.femcumStorage.limit - 1) + ); + setTimeout(function () { + self.fillFemcum(self); + }, fillPeriod); + }, - "fillBreasts": function (self) { - self.milkStorage.amount += self.milkStorage.limit * self.baseLactationProduction * fillPeriod / 1000; + fillBreasts: function (self) { + self.milkStorage.amount += + (self.milkStorage.limit * self.baseLactationProduction * fillPeriod) / + 1000; - if (self.milkStorage.amount > self.milkStorage.limit) { - breast_milk(self.milkStorage.amount - self.milkStorage.limit / 2); - } + if (self.milkStorage.amount > self.milkStorage.limit) { + breast_milk(self.milkStorage.amount - self.milkStorage.limit / 2); + } - if (self.milkStorage.amount > self.milkStorage.limit) { - self.milkStorage.amount = self.milkStorage.limit; - } - setTimeout(function () { self.fillBreasts(self); }, fillPeriod); - }, + if (self.milkStorage.amount > self.milkStorage.limit) { + self.milkStorage.amount = self.milkStorage.limit; + } + setTimeout(function () { + self.fillBreasts(self); + }, fillPeriod); + }, - "fillGas": function (self) { - self.gasStorage.amount += self.gasStorage.limit * self.baseGasProduction * fillPeriod / 1000; + fillGas: function (self) { + self.gasStorage.amount += + (self.gasStorage.limit * self.baseGasProduction * fillPeriod) / 1000; - let ratio = self.gasStorage.amount / self.gasStorage.limit; + let ratio = self.gasStorage.amount / self.gasStorage.limit; - if (ratio > 1 && Math.random() * 100 < ratio || ratio > 2) { - let amount = self.gasStorage.amount - self.gasStorage.limit * 3 / 4; - if (self.belchEnabled && self.fartEnabled) { - if (Math.random() < 0.5) + if ((ratio > 1 && Math.random() * 100 < ratio) || ratio > 2) { + let amount = self.gasStorage.amount - (self.gasStorage.limit * 3) / 4; + if (self.belchEnabled && self.fartEnabled) { + if (Math.random() < 0.5) belch(amount, false); + else fart(amount, false); + } else if (self.belchEnabled) { belch(amount, false); - else + } else if (self.fartEnabled) { fart(amount, false); - } else if (self.belchEnabled) { - belch(amount, false); - } else if (self.fartEnabled) { - fart(amount, false); + } } + setTimeout(function () { + self.fillGas(self); + }, fillPeriod); + }, - } - setTimeout(function () { self.fillGas(self); }, fillPeriod); - }, - - get urethraDiameter() { - return this.scaling(this.baseUrethraDiameter, this.scale, 1); - }, - get urethraStretchDiameter() { - return this.urethraDiameter * this.urethraStretchiness; - }, - get urethraStretchArea() { - return (this.urethraStretchDiameter * this.urethraStretchDiameter / 4) * Math.PI; - }, + get urethraDiameter() { + return this.scaling(this.baseUrethraDiameter, this.scale, 1); + }, + get urethraStretchDiameter() { + return this.urethraDiameter * this.urethraStretchiness; + }, + get urethraStretchArea() { + return ( + ((this.urethraStretchDiameter * this.urethraStretchDiameter) / 4) * + Math.PI + ); + }, - "fillPiss": function (self) { - self.pissStorage.amount += self.pissStorage.limit * self.basePissProduction * fillPeriod / 1000; + fillPiss: function (self) { + self.pissStorage.amount += + (self.pissStorage.limit * self.basePissProduction * fillPeriod) / 1000; - if (self.pissStorage.amount > self.pissStorage.limit * 2) - piss(self.pissStorage.amount, false); - setTimeout(function () { self.fillPiss(self); }, fillPeriod); - }, + if (self.pissStorage.amount > self.pissStorage.limit * 2) + piss(self.pissStorage.amount, false); + setTimeout(function () { + self.fillPiss(self); + }, fillPeriod); + }, - "fillScat": function (self) { - self.scatStorage.amount += self.scatStorage.limit * self.baseScatProduction * fillPeriod / 1000; + fillScat: function (self) { + self.scatStorage.amount += + (self.scatStorage.limit * self.baseScatProduction * fillPeriod) / 1000; - if (self.scatStorage.amount > self.scatStorage.limit * 2) - scat(self.scatStorage.amount, false); - setTimeout(function () { self.fillScat(self); }, fillPeriod); - }, + if (self.scatStorage.amount > self.scatStorage.limit * 2) + scat(self.scatStorage.amount, false); + setTimeout(function () { + self.fillScat(self); + }, fillPeriod); + }, - "cumStorage": { - "amount": 0, - get limit() { - return this.owner.ballVolume * this.owner.cumStorageScale * 2; - } - }, + cumStorage: { + amount: 0, + get limit() { + return this.owner.ballVolume * this.owner.cumStorageScale * 2; + }, + }, - "femcumStorage": { - "amount": 0, - get limit() { - return this.owner.wombVolume * this.owner.femcumStorageScale; - } - }, + femcumStorage: { + amount: 0, + get limit() { + return this.owner.wombVolume * this.owner.femcumStorageScale; + }, + }, - "milkStorage": { - "amount": 0, - get limit() { - return this.owner.breastVolume * 2 * this.owner.milkStorageScale; - } - }, + milkStorage: { + amount: 0, + get limit() { + return this.owner.breastVolume * 2 * this.owner.milkStorageScale; + }, + }, - "gasStorage": { - "amount": 0, - get limit() { - return Math.pow(this.owner.scale, 3) / 1000 * this.owner.gasStorageScale; - } - }, + gasStorage: { + amount: 0, + get limit() { + return ( + (Math.pow(this.owner.scale, 3) / 1000) * this.owner.gasStorageScale + ); + }, + }, - "pissStorage": { - "amount": 0, - get limit() { - return Math.pow(this.owner.scale, 3) / 5000 * this.owner.pissStorageScale; - } - }, + pissStorage: { + amount: 0, + get limit() { + return ( + (Math.pow(this.owner.scale, 3) / 5000) * this.owner.pissStorageScale + ); + }, + }, - "scatStorage": { - "amount": 0, - "victims": new Container(), - get limit() { - return Math.pow(this.owner.scale, 3) / 1000 * this.owner.scatStorageScale; - } - }, + scatStorage: { + amount: 0, + victims: new Container(), + get limit() { + return ( + (Math.pow(this.owner.scale, 3) / 1000) * this.owner.scatStorageScale + ); + }, + }, - get pawStenchArea() { - return this.pawArea * this.basePawStenchArea * this.stenchScale; - }, + get pawStenchArea() { + return this.pawArea * this.basePawStenchArea * this.stenchScale; + }, - get assStenchArea() { - return this.assArea * this.baseAssStenchArea * this.stenchScale; - }, + get assStenchArea() { + return this.assArea * this.baseAssStenchArea * this.stenchScale; + }, - get gasDigestFactor() { - if (this.gasScaleWithSize) { - return this.baseGasDigestFactor * this.scale; - } else { - return this.baseGasDigestFactor; - } - }, + get gasDigestFactor() { + if (this.gasScaleWithSize) { + return this.baseGasDigestFactor * this.scale; + } else { + return this.baseGasDigestFactor; + } + }, - "arouse": function (amount) { - if (!this.arousalEnabled) - return; + arouse: function (amount) { + if (!this.arousalEnabled) return; - if (this.afterglow) - return; + if (this.afterglow) return; - if (this.orgasm) - amount /= 5; + if (this.orgasm) amount /= 5; - this.arousal += amount * this.arousalFactor; + this.arousal += amount * this.arousalFactor; - if (this.arousal >= 200) { - this.arousal = 200; + if (this.arousal >= 200) { + this.arousal = 200; - if (!this.orgasm) { - this.orgasm = true; - update(["You shudder as ecstasy races up your spine", newline], false); - if (this.maleParts) { - this.maleOrgasm(this); - if (this.sheath.container.count > 0) - sheath_crush(); - if (this.foreskin.container.count > 0) - foreskin_crush(); - } - if (this.femaleParts) { - this.femaleOrgasm(this); - } - if (!this.maleParts && !this.femaleParts) { - this.nullOrgasm(this); + if (!this.orgasm) { + this.orgasm = true; + update( + ["You shudder as ecstasy races up your spine", newline], + false + ); + if (this.maleParts) { + this.maleOrgasm(this); + if (this.sheath.container.count > 0) sheath_crush(); + if (this.foreskin.container.count > 0) foreskin_crush(); + } + if (this.femaleParts) { + this.femaleOrgasm(this); + } + if (!this.maleParts && !this.femaleParts) { + this.nullOrgasm(this); + } } } - } - }, + }, - "quench": function (amount) { - if (!this.arousalEnabled) - return; + quench: function (amount) { + if (!this.arousalEnabled) return; - this.arousal -= amount; + this.arousal -= amount; - if (this.arousal <= 100) { - if (this.orgasm) { - this.orgasm = false; - this.afterglow = true; + if (this.arousal <= 100) { + if (this.orgasm) { + this.orgasm = false; + this.afterglow = true; + } } - } - if (this.arousal < 0) { - this.arousal = 0; - this.afterglow = false; - } - }, + if (this.arousal < 0) { + this.arousal = 0; + this.afterglow = false; + } + }, - "quenchExcess": function (self) { - if (self.arousalEnabled) { - if (self.arousal > 100 && !self.orgasm) { - self.arousal = Math.max(100, self.arousal - 1); - self.edge += Math.sqrt((self.arousal - 100)) / 500 * macro.edgeFactor; - self.edge = Math.min(1, self.edge); - - if (self.maleParts) - self.maleSpurt += ((self.arousal - 100) / 100 + Math.random()) / 25 * (self.edge); - if (self.femaleParts) - self.femaleSpurt += ((self.arousal - 100) / 100 + Math.random()) / 25 * (self.edge); - - if (self.maleSpurt > 1) { - male_spurt(macro.cumVolume * (0.1 + Math.random() / 10), false); - self.maleSpurt = 0; - } - if (self.femaleSpurt > 1) { - female_spurt(macro.femcumVolume * (0.1 + Math.random() / 10), false); - self.femaleSpurt = 0; + quenchExcess: function (self) { + if (self.arousalEnabled) { + if (self.arousal > 100 && !self.orgasm) { + self.arousal = Math.max(100, self.arousal - 1); + self.edge += (Math.sqrt(self.arousal - 100) / 500) * macro.edgeFactor; + self.edge = Math.min(1, self.edge); + + if (self.maleParts) + self.maleSpurt += + (((self.arousal - 100) / 100 + Math.random()) / 25) * self.edge; + if (self.femaleParts) + self.femaleSpurt += + (((self.arousal - 100) / 100 + Math.random()) / 25) * self.edge; + + if (self.maleSpurt > 1) { + male_spurt(macro.cumVolume * (0.1 + Math.random() / 10), false); + self.maleSpurt = 0; + } + if (self.femaleSpurt > 1) { + female_spurt( + macro.femcumVolume * (0.1 + Math.random() / 10), + false + ); + self.femaleSpurt = 0; + } + } else if (self.orgasm) { + self.quench(1); + } else if (self.afterglow) { + self.quench(0.5); + self.edge = Math.max(0, self.edge - 0.01); } - } else if (self.orgasm) { - self.quench(1); - } else if (self.afterglow) { - self.quench(0.5); - self.edge = Math.max(0, self.edge - 0.01); } - } - setTimeout(function () { self.quenchExcess(self); }, 200); - }, + setTimeout(function () { + self.quenchExcess(self); + }, 200); + }, - "maleOrgasm": function (self, times = 0) { - if (!this.arousalEnabled) - return; + maleOrgasm: function (self, times = 0) { + if (!this.arousalEnabled) return; - if (self.orgasm) { - let spurt = Math.min(this.cumVolume, this.cumStorage.amount); + if (self.orgasm) { + let spurt = Math.min(this.cumVolume, this.cumStorage.amount); - if (spurt == this.cumVolume) { - let excess = this.cumStorage.amount - this.cumVolume; - spurt += excess * 3 / 4; + if (spurt == this.cumVolume) { + let excess = this.cumStorage.amount - this.cumVolume; + spurt += (excess * 3) / 4; + } + this.cumStorage.amount -= spurt; + male_orgasm(spurt, false); + setTimeout(function () { + self.maleOrgasm(self); + }, 5000); } - this.cumStorage.amount -= spurt; - male_orgasm(spurt, false); - setTimeout(function () { self.maleOrgasm(self); }, 5000); - } - }, - - "femaleOrgasm": function (self) { - if (!this.arousalEnabled) - return; - - if (this.orgasm) { - let spurt = Math.min(this.femcumVolume, this.femcumStorage.amount); + }, - if (spurt == this.femcumVolume) { - let excess = this.femcumStorage.amount - this.femcumVolume; - spurt += excess * 3 / 4; - } + femaleOrgasm: function (self) { + if (!this.arousalEnabled) return; - this.femcumStorage.amount -= spurt; - female_orgasm(spurt, false); - setTimeout(function () { self.femaleOrgasm(self); }, 5000); - } - }, + if (this.orgasm) { + let spurt = Math.min(this.femcumVolume, this.femcumStorage.amount); - "nullOrgasm": function (self) { - if (!this.arousalEnabled) - return; + if (spurt == this.femcumVolume) { + let excess = this.femcumStorage.amount - this.femcumVolume; + spurt += (excess * 3) / 4; + } - if (this.orgasm) { - setTimeout(function () { self.nullOrgasm(self); }, 2000); - } - }, + this.femcumStorage.amount -= spurt; + female_orgasm(spurt, false); + setTimeout(function () { + self.femaleOrgasm(self); + }, 5000); + } + }, - get totalMass() { - let base = Math.pow(this.scale, 3) * this.baseMass; + nullOrgasm: function (self) { + if (!this.arousalEnabled) return; - if (this.hasTail) { - base += this.tailMass * this.tailCount; - } + if (this.orgasm) { + setTimeout(function () { + self.nullOrgasm(self); + }, 2000); + } + }, - if (this.maleParts) { - base += this.dickMass; - base += this.ballMass * 2; - } + get totalMass() { + let base = Math.pow(this.scale, 3) * this.baseMass; - if (this.hasBreasts) { - base += this.breastMass * 2; - } + if (this.hasTail) { + base += this.tailMass * this.tailCount; + } - return base; - }, + if (this.maleParts) { + base += this.dickMass; + base += this.ballMass * 2; + } - get description() { - let result = []; + if (this.hasBreasts) { + base += this.breastMass * 2; + } - let line = "You are " + (macro.name == "" ? "" : macro.name + ", ") + "a " + length(macro.height, unit, true) + " tall " + macro.species + ". You weigh " + mass(macro.mass, unit) + "."; + return base; + }, - result.push(line); + get description() { + let result = []; + + let line = + "You are " + + (macro.name == "" ? "" : macro.name + ", ") + + "a " + + length(macro.height, unit, true) + + " tall " + + macro.species + + ". You weigh " + + mass(macro.mass, unit) + + "."; - result.push(macro.stomach.description); + result.push(line); - if (this.analVore) { - result.push(macro.bowels.description); - } + result.push(macro.stomach.description); - if (this.hasTail) { - line = "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails sway as you walk. " : " tail sways as you walk. "); - if (this.tailMaw) { - line += (macro.tailCount > 1 ? "Their maws are drooling" : "Its maw is drooling"); + if (this.analVore) { + result.push(macro.bowels.description); } - result.push(line); - if (this.tailMaw) { - result.push(this.tail.description); + if (this.hasTail) { + line = + "Your " + + macro.describeTail + + (macro.tailCount > 1 + ? " tails sway as you walk. " + : " tail sways as you walk. "); + if (this.tailMaw) { + line += + macro.tailCount > 1 + ? "Their maws are drooling" + : "Its maw is drooling"; + } + result.push(line); + + if (this.tailMaw) { + result.push(this.tail.description); + } } - } - if (this.arousalEnabled) { - if (this.afterglow) { - result.push("You're basking in the afterglow of a powerful orgasm."); + if (this.arousalEnabled) { + if (this.afterglow) { + result.push("You're basking in the afterglow of a powerful orgasm."); + } else if (this.orgasm) { + result.push("You're cumming!"); + } else if (this.arousal < 25) { + result.push("You're not at all aroused."); + } else if (this.arousal < 75) { + result.push("You're feeling a little aroused."); + } else if (this.arousal < 150) { + result.push("You're feeling aroused."); + } else if (this.arousal < 200) { + result.push("You're on the edge of an orgasm!"); + } } - else if (this.orgasm) { - result.push("You're cumming!"); - } else if (this.arousal < 25) { - result.push("You're not at all aroused."); - } else if (this.arousal < 75) { - result.push("You're feeling a little aroused."); - } else if (this.arousal < 150) { - result.push("You're feeling aroused."); - } else if (this.arousal < 200) { - result.push("You're on the edge of an orgasm!"); + 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."; + } 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."; + } + result.push(line); + result.push(macro.balls.description); } - } - 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."; - } 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."; + if (this.femaleParts) { + line = + "Your " + + this.describeVagina + + " slit peeks out from between your legs."; + result.push(line); + result.push(macro.womb.description); } - result.push(line); - result.push(macro.balls.description); - } - - if (this.femaleParts) { - line = "Your " + this.describeVagina + " slit peeks out from between your legs."; - result.push(line); - result.push(macro.womb.description); - } - - if (this.hasBreasts) { - line = "You have two " + length(this.breastDiameter, unit, true) + " wide breasts that weigh " + mass(macro.breastMass, unit) + " apiece."; - if (this.lactationEnabled) { - line += " They slosh with " + volume(this.milkStorage.amount, unit, false) + " of creamy milk."; + if (this.hasBreasts) { + line = + "You have two " + + length(this.breastDiameter, unit, true) + + " wide breasts that weigh " + + mass(macro.breastMass, unit) + + " apiece."; + + if (this.lactationEnabled) { + line += + " They slosh with " + + volume(this.milkStorage.amount, unit, false) + + " of creamy milk."; + } + if (this.cleavage.container.count > 0) + line += + " Between them are " + + this.cleavage.container.describeSimple(verbose || flat) + + "."; + + result.push(line); + if (this.breastVore) { + result.push(this.breasts.description); + } } - if (this.cleavage.container.count > 0) - line += " Between them are " + this.cleavage.container.describeSimple(verbose || flat) + "."; - result.push(line); - if (this.breastVore) { - result.push(this.breasts.description); + if (this.soulVoreEnabled) { + result.push(this.souls.description); } - } - - if (this.soulVoreEnabled) { - result.push(this.souls.description); - } - if (this.wingVoreEnabled) { - result.push(this.wings.description); - } - - if (this.hasPouch) { - result.push(this.pouch.description); - } + if (this.wingVoreEnabled) { + result.push(this.wings.description); + } - line = "Your two " + length(macro.pawLength, unit, true) + " by " + length(macro.pawWidth, unit, true) + " " + this.footDesc(true) + " shake the earth."; + if (this.hasPouch) { + result.push(this.pouch.description); + } - if (this.footShoeWorn && this.shoe.container.count > 0) { - line += " Within " + (this.shoe.container.count > 1 ? "are" : "is") + " " + this.shoe.container.describeSimple(verbose || flat); - if (this.footSockWorn && this.sock.container.count > 0) { - line += " and " + this.sock.container.describeSimple(verbose || flat) + " in your socks."; + 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); + if (this.footSockWorn && this.sock.container.count > 0) { + line += + " and " + + this.sock.container.describeSimple(verbose || flat) + + " in your socks."; + } + } else if (this.footSockWorn && this.sock.container.count > 0) { + line += + " Within " + + (this.sock.container.count > 1 ? "are" : "is") + + " " + + this.sock.container.describeSimple(verbose || flat); } - } else if (this.footSockWorn && this.sock.container.count > 0) { - line += " Within " + (this.sock.container.count > 1 ? "are" : "is") + " " + this.sock.container.describeSimple(verbose || flat); - } - if (this.paws.container.count > 0) { - line += " You have " + this.paws.container.describeSimple(verbose || flat) + " wedged between your " + macro.toeDesc(true); - } + if (this.paws.container.count > 0) { + line += + " You have " + + this.paws.container.describeSimple(verbose || flat) + + " wedged between your " + + macro.toeDesc(true); + } - result.push(line); + result.push(line); - if (this.gooMolten) { - result.push(this.goo.description); - } + if (this.gooMolten) { + result.push(this.goo.description); + } - if (this.pawVoreEnabled) { - result.push(this.pawsVore.description); - } + if (this.pawVoreEnabled) { + result.push(this.pawsVore.description); + } - return result; - }, + return result; + }, - get describeTail() { - return (this.tailCount > 1 ? this.tailCount + " " : "") + length(this.tailLength, unit, true) + " long " + this.tailType; - }, + get describeTail() { + return ( + (this.tailCount > 1 ? this.tailCount + " " : "") + + length(this.tailLength, unit, true) + + " long " + + this.tailType + ); + }, - get describeDick() { - let state = ""; - if (!this.arousalEnabled) { - state = "limp"; - } else if (this.orgasm) { - state = "spurting"; - } else { - if (this.arousal < 25) { + get describeDick() { + let state = ""; + if (!this.arousalEnabled) { state = "limp"; - } else if (this.arousal < 75) { - state = "swelling"; - } else if (this.arousal < 100) { - state = "erect"; - } else if (this.arousal < 150) { - state = "erect, throbbing"; - } else if (this.arousal < 200) { - state = "erect, throbbing, pre-soaked"; + } else if (this.orgasm) { + state = "spurting"; + } else { + if (this.arousal < 25) { + state = "limp"; + } else if (this.arousal < 75) { + state = "swelling"; + } else if (this.arousal < 100) { + state = "erect"; + } else if (this.arousal < 150) { + state = "erect, throbbing"; + } else if (this.arousal < 200) { + state = "erect, throbbing, pre-soaked"; + } } - } - return length(this.dickLength, unit, true) + " long " + state + " " + this.dickType + " " + pickString("cock", "shaft", "rod", "member", "dick"); - }, + return ( + length(this.dickLength, unit, true) + + " long " + + state + + " " + + this.dickType + + " " + + pickString("cock", "shaft", "rod", "member", "dick") + ); + }, - get describeVagina() { - let state = ""; - if (!this.arousalEnabled) { - state = ""; - } else if (this.orgasm) { - state = " gushing, quivering"; - } else { - if (this.arousal < 25) { + get describeVagina() { + let state = ""; + if (!this.arousalEnabled) { state = ""; - } else if (this.arousal < 75) { - state = " moist"; - } else if (this.arousal < 100) { - state = " glistening"; - } else if (this.arousal < 150) { - state = " dripping"; - } else if (this.arousal < 200) { - state = " dripping, quivering"; + } else if (this.orgasm) { + state = " gushing, quivering"; + } else { + if (this.arousal < 25) { + state = ""; + } else if (this.arousal < 75) { + state = " moist"; + } else if (this.arousal < 100) { + state = " glistening"; + } else if (this.arousal < 150) { + state = " dripping"; + } else if (this.arousal < 200) { + state = " dripping, quivering"; + } } - } - return length(this.vaginaLength, unit, true) + " long" + state; - }, -}; + return length(this.vaginaLength, unit, true) + " long" + state; + }, + }; // //------END OF MACRO FUCTION----------------------------------------------------------------------------------------------- @@ -1803,146 +2253,218 @@ 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, - "Train": 0.005, - "Tram": 0.01, + 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, + Train: 0.005, + Tram: 0.01, "Parking Garage": 0.003, "Small Skyscraper": 0.05, "Large Skyscraper": 0.05, - "City": 0.00005 - } + 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, - "Tram": 0.03, - "Business": 0.075, + biomeWeights: { + //Weights determine if and how often you run into something while inside of a biome + Car: 0.1, + Bus: 0.05, + Tram: 0.03, + Business: 0.075, "Parking Garage": 0.003, "Small Skyscraper": 0.06, - "City": 0.00005 - } + 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.005, - "House": 0.1, - "Barn": 0.08, - "Car": 0.1, - "Train": 0.002, - "Business": 0.075, - "Ranch": 0.01, - "Airstrip": 0.002, - "Airport": 0.002, - "Town": 0.00001 - } + biomeWeights: { + //Weights determine if and how often you run into something while inside of a biome + Cow: 0.005, + House: 0.1, + Barn: 0.08, + Car: 0.1, + Train: 0.002, + Business: 0.075, + Ranch: 0.01, + Airstrip: 0.002, + Airport: 0.002, + 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 - } - } + 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 || macro.changingBiomes == false) { //stops function from running once it stops being relevant - return +function updateBiome(forceNew = false, specifyBiome) { + //handles stepping between biomes + if (macro.height > 1e12 || macro.changingBiomes == false) { + //stops function from running once it stops being relevant + return; } - let strideSize = macro.height * .4; //adjust step size based on height + let strideSize = macro.height * 0.4; //adjust step size based on height position += strideSize; //adds distance from step into total disance traveled through biome - if (position > biomeSize || forceNew == true) { //if player steps out of biome, generates a new one + if (position > biomeSize || forceNew == true) { + //if player steps out of biome, generates a new one position = 0; let oldBiome = biome; 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 = 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 + 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 + 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 + if (oldBiome !== biome) { + //only alerts player if the biome type actually changed look(true); } } } -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 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 -{ - +function look(onlyBiome = false) { + //onlyBiome means don't include player description when looking at surroundings let playerDesc = macro.description; let areaDesc = ""; - if (macro.height > 1e12) - areaDesc = "You're pretty much everywhere at once."; + if (macro.height > 1e12) areaDesc = "You're pretty much everywhere at once."; else if (macro.height > 1e6) - areaDesc = "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 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.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; + 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; + 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; + 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; + 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; + 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; + 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) { - 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; + 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) { - areaDesc = "Your broad frame fills the street of the city center. 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) { - 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; + 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 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; + 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) { - 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; + 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 { - 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; + 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; } } - if (onlyBiome == true) { update([areaDesc, newline]); } else { @@ -1952,7 +2474,9 @@ function look(onlyBiome = false) //onlyBiome means don't include player descript } function toggle_auto(e) { - switch (strolling) { //Changes how fast player is moving, if player is running, sets player back to standing + 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"; @@ -1985,40 +2509,69 @@ function toggle_auto(e) { function toggle_units(e) { switch (unit) { - case "metric": unit = "SI"; break; - case "SI": unit = "customary"; break; - case "customary": unit = "US"; break; - case "US": unit = "approx"; break; - case "approx": unit = "metric"; break; + case "metric": + unit = "SI"; + break; + case "SI": + unit = "customary"; + break; + case "customary": + unit = "US"; + break; + case "US": + unit = "approx"; + break; + case "approx": + unit = "metric"; + break; } - e.target.innerText = "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); + e.target.innerText = + "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); update(); } function toggle_units_options(e) { switch (unit) { - case "metric": unit = "SI"; break; - case "SI": unit = "customary"; break; - case "customary": unit = "US"; break; - case "US": unit = "metric"; break; + case "metric": + unit = "SI"; + break; + case "SI": + unit = "customary"; + break; + case "customary": + unit = "US"; + break; + case "US": + unit = "metric"; + break; } - e.target.innerText = "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); + e.target.innerText = + "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); updateAllPreviews(); } function toggle_numbers(e) { switch (numbers) { - case "full": numbers = "prefix"; break; - case "prefix": numbers = "words"; break; - case "words": numbers = "scientific"; break; - case "scientific": numbers = "full"; break; + case "full": + numbers = "prefix"; + break; + case "prefix": + numbers = "words"; + break; + case "words": + numbers = "scientific"; + break; + case "scientific": + numbers = "full"; + break; } - e.target.innerText = "Numbers: " + numbers.charAt(0).toUpperCase() + numbers.slice(1); + e.target.innerText = + "Numbers: " + numbers.charAt(0).toUpperCase() + numbers.slice(1); update(); } @@ -2049,19 +2602,19 @@ function toggle_verbose(e) { function toggle_arousal(e) { macro.arousalEnabled = !macro.arousalEnabled; - e.target.innerText = (macro.arousalEnabled ? "Arousal On" : "Arousal Off"); + e.target.innerText = macro.arousalEnabled ? "Arousal On" : "Arousal Off"; if (macro.arousalEnabled) { document.getElementById("arousal").style.display = "block"; document.getElementById("edge").style.display = "block"; - document.querySelector("#arousalMeter").style.display = 'inline-block'; - document.querySelector("#orgasmMeter").style.display = 'inline-block'; - document.querySelector("#edgeMeter").style.display = 'inline-block'; + document.querySelector("#arousalMeter").style.display = "inline-block"; + document.querySelector("#orgasmMeter").style.display = "inline-block"; + document.querySelector("#edgeMeter").style.display = "inline-block"; } else { document.getElementById("arousal").style.display = "none"; document.getElementById("edge").style.display = "none"; - document.querySelector("#arousalMeter").style.display = 'none'; - document.querySelector("#orgasmMeter").style.display = 'none'; - document.querySelector("#edgeMeter").style.display = 'none'; + document.querySelector("#arousalMeter").style.display = "none"; + document.querySelector("#orgasmMeter").style.display = "none"; + document.querySelector("#edgeMeter").style.display = "none"; } macro.orgasm = false; @@ -2069,19 +2622,15 @@ function toggle_arousal(e) { enable_victim("cum-flood", "Flooded by cum"); enable_victim("femcum-flood", "Flooded by femcum"); - } // lists out total people function summarize(sum, fatal = true) { let word; let count = get_living_prey(sum); - if (fatal && macro.brutality > 0) - word = count != 1 ? "kills" : "kill"; - else if (!fatal && macro.brutality > 0) - word = "prey"; - else - word = count != 1 ? "victims" : "victim"; + if (fatal && macro.brutality > 0) word = count != 1 ? "kills" : "kill"; + else if (!fatal && macro.brutality > 0) word = "prey"; + else word = count != 1 ? "victims" : "victim"; return "(" + count + " " + word + ")"; } @@ -2117,10 +2666,8 @@ function getOnePrey(biome, area, sameSize = true) { } } - if (sameSize) - return new Container([new things["Person"]["Person"](1)]); - else - return new Container(); + if (sameSize) return new Container([new things["Person"]["Person"](1)]); + else return new Container(); } //set weights(how often a thing is encountered) function getWeights(region, area) { @@ -2128,44 +2675,41 @@ function getWeights(region, area) { if (area > things["Planet"].area) { weights = { - "Planet": 1.47e-3, - "Star": 1.7713746e-3, + Planet: 1.47e-3, + Star: 1.7713746e-3, "Solar System": 4e-4, - "Galaxy": 0.1, - "Cluster": 0.5, - "Universe": 1, - "Multiverse": 1, - "Timeline": 1, - "Pantheon": 1, - "Reality": 1, + Galaxy: 0.1, + Cluster: 0.5, + Universe: 1, + Multiverse: 1, + Timeline: 1, + Pantheon: 1, + Reality: 1, }; - } - else if (area > things["Town"].area) { + } else if (area > things["Town"].area) { weights = { - "Town": 0.001, - "City": 0.0005, - "Continent": 0.5, + Town: 0.001, + City: 0.0005, + Continent: 0.5, }; - } - else { + } else { try { - weights = region.biomeWeights - } - catch (err) { + weights = region.biomeWeights; + } catch (err) { weights = { - "House": 0.1, - "Car": 0.07, - "Bus": 0.02, - "Tram": 0.02, - "Train": 0.005, - "Business": 0.075, + House: 0.1, + Car: 0.07, + Bus: 0.02, + Tram: 0.02, + Train: 0.005, + Business: 0.075, "Parking Garage": 0.003, "Small Skyscraper": 0.05, "Large Skyscraper": 0.025, - "Town": 0.00001, - "City": 0.00005, - "Continent": 0.0005, - "Planet": 0.0001 + Town: 0.00001, + City: 0.00005, + Continent: 0.0005, + Planet: 0.0001, }; } @@ -2182,27 +2726,26 @@ function getWeights(region, area) { weights["Soldier"] = 0.08; weights["Tank"] = 0.07; weights["Artillery"] = 0.06; - weights["Military Helicopter"] = 0.05, - weights["Squad"] = .04; - weights["Platoon"] = .2, - weights["Company"] = .3, - weights["Battalion"] = .4, - weights["Brigade"] = .5; + (weights["Military Helicopter"] = 0.05), (weights["Squad"] = 0.04); + (weights["Platoon"] = 0.2), + (weights["Company"] = 0.3), + (weights["Battalion"] = 0.4), + (weights["Brigade"] = 0.5); } else if (macro.height < 5000) { weights["Tank"] = 0.0002; weights["Artillery"] = 0.001; - weights["Squad"] = .0001; - weights["Platoon"] = .0005, - weights["Company"] = .001, - weights["Battalion"] = .002, - weights["Brigade"] = .003; - weights["Division"] = .002, - weights["Tank Division"] = .001, - weights["Army"] = .001; + weights["Squad"] = 0.0001; + (weights["Platoon"] = 0.0005), + (weights["Company"] = 0.001), + (weights["Battalion"] = 0.002), + (weights["Brigade"] = 0.003); + (weights["Division"] = 0.002), + (weights["Tank Division"] = 0.001), + (weights["Army"] = 0.001); } else { - weights["Division"] = .02, - weights["Tank Division"] = .01, - weights["Army"] = .01; + (weights["Division"] = 0.02), + (weights["Tank Division"] = 0.01), + (weights["Army"] = 0.01); } } if (macro.victimsMicros) { @@ -2215,7 +2758,7 @@ function getWeights(region, area) { } if (macro.singleVictimType != "Disabled") { - weights = {} + weights = {}; weights[macro.singleVictimType] = 0.25; } @@ -2232,8 +2775,7 @@ function getPrey(region, area, sameSize = false) { var prey = fill_area(area, weights); - if (prey.count == 0 && sameSize) - return getOnePrey(biome, area, true); + if (prey.count == 0 && sameSize) return getOnePrey(biome, area, true); return prey; } @@ -2264,7 +2806,10 @@ function do_digestion(owner, organ, container, active = false) { grow_automatic(container.sum_property("mass"), organ.name); let digested = container.sum(); for (let key in victims[organ.name]) { - if (victims[organ.name].hasOwnProperty(key) && digested.hasOwnProperty(key)) { + if ( + victims[organ.name].hasOwnProperty(key) && + digested.hasOwnProperty(key) + ) { victims["digested"][key] += digested[key]; victims[organ.name][key] -= digested[key]; } @@ -2274,7 +2819,8 @@ function do_digestion(owner, organ, container, active = false) { let vol = organ.fill(owner, container); let line = organ.describeDigestion(container, vol); - let lethal = macro.brutality != 0 && (!macro.soulVoreEnabled || organ.name === "souls"); + let lethal = + macro.brutality != 0 && (!macro.soulVoreEnabled || organ.name === "souls"); let summary = summarize(container.sum(), lethal); if (macro.soulVoreEnabled && organ.name != "souls") { @@ -2282,16 +2828,17 @@ function do_digestion(owner, organ, container, active = false) { let soulCount = container.sum()["Person"]; let soulLine = ""; if (soulCount > 0) - soulLine = "Their " + (soulCount == 1 ? "soul is" : "souls are") + " trapped in your depths!"; - else - soulLine = "No souls, though..."; + soulLine = + "Their " + + (soulCount == 1 ? "soul is" : "souls are") + + " trapped in your depths!"; + else soulLine = "No souls, though..."; update([sound, line, summary, soulLine, newline], active); } else { update([sound, line, summary, newline], active); } } - function digest_stomach() { digest_all(macro.stomach, true); } @@ -2409,7 +2956,10 @@ function drool() { if (prey.count == 0) { return; } - let line = describe("drool", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("drool", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -2496,22 +3046,18 @@ function stomp(active = true) { } function stomp_wedge(active = true) { - if (macro.footType == "hoof") - return; + if (macro.footType == "hoof") return; let area = 0; if (!macro.footWear || (!macro.footSockWorn && !macro.footShoeWorn)) area = macro.pawArea / 10; - else if (macro.footShoeWorn) - area = macro.pawArea / 25; - else - area = macro.pawArea / 50; + else if (macro.footShoeWorn) area = macro.pawArea / 25; + else area = macro.pawArea / 50; let prey = getPrey(biome, area, false); - if (prey.count == 0) - return; + if (prey.count == 0) return; let line = describe("stomp-wedge", prey, macro, verbose, flat); let linesummary = summarize(prey.sum(), false); @@ -2553,14 +3099,12 @@ function stomp_goo() { } function flex_toes() { - let prey = new Container(); if (!macro.footWear || (!macro.footSockWorn && !macro.footShoeWorn)) { prey = macro.paws.container; macro.paws.container = new Container(); - } - else if (macro.footSockWorn && macro.footShoeWorn) { + } else if (macro.footSockWorn && macro.footShoeWorn) { prey = macro.shoe.container.merge(macro.sock.container); if (macro.brutality > 0) { macro.shoe.container = new Container(); @@ -2593,7 +3137,6 @@ function flex_toes() { } function paw_stench() { - let area = macro.pawStenchArea; let prey = getPrey(biome, area); let line = describe("paw-stench", prey, macro, verbose, flat); @@ -2601,8 +3144,7 @@ function paw_stench() { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -2616,10 +3158,8 @@ function paw_stench() { function grind(active = true) { let area = macro.assArea / 2; - if (macro.maleParts) - area += macro.dickArea; - if (macro.femaleParts) - area += macro.vaginaArea; + if (macro.maleParts) area += macro.dickArea; + if (macro.femaleParts) area += macro.vaginaArea; let prey = getPrey(biome, area); @@ -2639,7 +3179,7 @@ function grind(active = true) { macro.arouse(20); if (macro.maleMuskEnabled) { - male_musk(area * macro.baseMaleMuskArea * macro.muskScale / 2, active); + male_musk((area * macro.baseMaleMuskArea * macro.muskScale) / 2, active); } if (macro.femaleMuskEnabled) { @@ -2668,7 +3208,7 @@ function ass_grind(active = true) { macro.arouse(15); if (macro.maleMuskEnabled) { - male_musk(area * macro.baseMaleMuskArea * macro.muskScale / 2, active); + male_musk((area * macro.baseMaleMuskArea * macro.muskScale) / 2, active); } if (macro.femaleMuskEnabled) { @@ -2752,7 +3292,6 @@ function sit_goo() { } function ass_stench() { - let area = macro.assStenchArea; let prey = getPrey(biome, area); let line = describe("ass-stench", prey, macro, verbose, flat); @@ -2760,8 +3299,7 @@ function ass_stench() { let people = get_living_prey(prey.sum()); - if (prey.sum()["Person"] == undefined) - return; + if (prey.sum()["Person"] == undefined) return; let preyMass = prey.sum_property("mass"); @@ -2807,7 +3345,7 @@ function cleavage_crush() { update([sound, line, linesummary, newline]); - macro.arouse((preyMass > 0 ? 20 : 10)); + macro.arouse(preyMass > 0 ? 20 : 10); } function cleavage_drop() { @@ -2825,7 +3363,7 @@ function cleavage_drop() { add_victim_people("cleavage-drop", prey); update([sound, line, linesummary, newline]); - macro.arouse((preyMass > 0 ? 15 : 5)); + macro.arouse(preyMass > 0 ? 15 : 5); } function cleavage_absorb() { @@ -2843,7 +3381,7 @@ function cleavage_absorb() { add_victim_people("cleavage-absorb", prey); update([sound, line, linesummary, newline]); - macro.arouse((preyMass > 0 ? 15 : 5)); + macro.arouse(preyMass > 0 ? 15 : 5); if (preyMass > 0) { grow_automatic(preyMass, "breasts"); @@ -2881,8 +3419,15 @@ function breast_crush() { update([sound, line, linesummary, newline]); - if (macro.lactationEnabled && macro.milkStorage.amount / macro.milkStorage.limit > 0.5) { - let amount = Math.min(macro.lactationVolume, (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * macro.milkStorage.limit); + if ( + macro.lactationEnabled && + macro.milkStorage.amount / macro.milkStorage.limit > 0.5 + ) { + let amount = Math.min( + macro.lactationVolume, + (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * + macro.milkStorage.limit + ); breast_milk(amount); } @@ -2907,8 +3452,15 @@ function breast_vore() { update([sound, line, linesummary, newline]); - if (macro.lactationEnabled && macro.milkStorage.amount / macro.milkStorage.limit > 0.5) { - let amount = Math.min(macro.lactationVolume, (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * macro.milkStorage.limit); + if ( + macro.lactationEnabled && + macro.milkStorage.amount / macro.milkStorage.limit > 0.5 + ) { + let amount = Math.min( + macro.lactationVolume, + (macro.milkStorage.amount / macro.milkStorage.limit - 0.5) * + macro.milkStorage.limit + ); breast_milk(amount); } @@ -2925,7 +3477,10 @@ function breast_milk(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("breast-milk", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("breast-milk", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3170,7 +3725,7 @@ function cockslap(active = true) { macro.arouse(15); if (macro.maleMuskEnabled) { - male_musk(area * macro.baseMaleMuskArea * macro.muskScale / 2, active); + male_musk((area * macro.baseMaleMuskArea * macro.muskScale) / 2, active); } } @@ -3194,7 +3749,7 @@ function cock_vore(active = true) { macro.arouse(20); if (macro.maleMuskEnabled) { - male_musk(area * macro.baseMaleMuskArea * macro.muskScale / 2, active); + male_musk((area * macro.baseMaleMuskArea * macro.muskScale) / 2, active); } } @@ -3227,8 +3782,7 @@ function male_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3241,7 +3795,10 @@ 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, vol).replace("$VOLUME", volume(vol, unit, true)); + 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()); @@ -3266,8 +3823,7 @@ function male_spurt_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3282,7 +3838,10 @@ 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, vol).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()); @@ -3307,8 +3866,7 @@ function male_orgasm_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3326,8 +3884,7 @@ function female_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3342,7 +3899,10 @@ function female_spurt(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("female-spurt", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("female-spurt", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3356,7 +3916,10 @@ function female_spurt(vol, active = true) { update([sound, line, linesummary, newline], active); if (macro.femaleMuskEnabled) { - female_spurt_musk(area * macro.baseFemaleMuskArea * macro.muskScale, active); + female_spurt_musk( + area * macro.baseFemaleMuskArea * macro.muskScale, + active + ); } } @@ -3367,8 +3930,7 @@ function female_spurt_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3383,7 +3945,10 @@ function female_orgasm(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("female-orgasm", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("female-orgasm", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3397,7 +3962,10 @@ function female_orgasm(vol, active = true) { update([sound, line, linesummary, newline], active); if (macro.femaleMuskEnabled) { - female_orgasm_musk(area * macro.baseFemaleMuskArea * macro.muskScale, active); + female_orgasm_musk( + area * macro.baseFemaleMuskArea * macro.muskScale, + active + ); } } @@ -3408,8 +3976,7 @@ function female_orgasm_musk(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3481,7 +4048,10 @@ function tail_vore(count) { totalPrey = totalPrey.merge(prey); } - let line = describe("tails-vore", totalPrey, macro, verbose, flat).replace("$COUNT", macro.tailCount); + let line = describe("tails-vore", totalPrey, macro, verbose, flat).replace( + "$COUNT", + macro.tailCount + ); lines.push(line); } @@ -3623,7 +4193,10 @@ function belch(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("belch", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("belch", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3647,7 +4220,10 @@ function fart(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("fart", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("fart", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3664,7 +4240,12 @@ function fart(vol, active = true) { function wear_shoes() { macro.shoe.container = macro.shoe.container.merge(macro.paws.container); - let line = describe("wear-shoe", macro.shoe.container.merge(macro.paws.container, flat), macro, verbose); + let line = describe( + "wear-shoe", + macro.shoe.container.merge(macro.paws.container, flat), + macro, + verbose + ); macro.paws.container = new Container(); let summary = summarize(macro.shoe.container.sum(), false); @@ -3684,7 +4265,13 @@ function remove_shoes() { macro.shoeTrapped = macro.paws.container; macro.paws.container = new Container(); - let line = describe("remove-shoe", macro.shoe.container, macro, verbose, flat); + let line = describe( + "remove-shoe", + macro.shoe.container, + macro, + verbose, + flat + ); let summary = summarize(macro.shoe.container.sum(), false); footwearUpdate(); @@ -3704,8 +4291,7 @@ function remove_shoes_stench() { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3739,7 +4325,13 @@ function remove_socks() { macro.sockTrapped = macro.paws.container; macro.paws.container = new Container(); - let line = describe("remove-sock", macro.sock.container, macro, verbose, flat); + let line = describe( + "remove-sock", + macro.sock.container, + macro, + verbose, + flat + ); let summary = summarize(macro.sock.container.sum(), false); footwearUpdate(); @@ -3759,8 +4351,7 @@ function remove_socks_stench() { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3861,7 +4452,10 @@ function piss(vol, active = true) { let area = Math.pow(vol, 2 / 3); let prey = getPrey(biome, area); - let line = describe("piss", prey, macro, verbose, flat).replace("$VOLUME", volume(vol, unit, false)); + let line = describe("piss", prey, macro, verbose, flat).replace( + "$VOLUME", + volume(vol, unit, false) + ); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3887,8 +4481,7 @@ function piss_stench(area, active = true) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -3900,7 +4493,11 @@ function piss_stench(area, active = true) { } function bladder_vore() { - let prey = getPrey(biome, macro.urethraStretchArea, macro.sameSizeBladderVore); + let prey = getPrey( + biome, + macro.urethraStretchArea, + macro.sameSizeBladderVore + ); let line = describe("bladder-vore", prey, macro, verbose, flat); let linesummary = summarize(prey.sum(), false); @@ -3928,7 +4525,9 @@ function scat(vol, active = true) { let scatLength = Math.pow(vol, 1 / 3) * 4; let prey = getPrey(biome, area); - let line = describe("scat", prey, macro, verbose, flat).replace("$MASS", mass(vol * 1000, unit, true)).replace("$LENGTH", length(scatLength, unit, true)); + let line = describe("scat", prey, macro, verbose, flat) + .replace("$MASS", mass(vol * 1000, unit, true)) + .replace("$LENGTH", length(scatLength, unit, true)); let linesummary = summarize(prey.sum(), true); let people = get_living_prey(prey.sum()); @@ -3957,8 +4556,7 @@ function scat_stench(area) { let people = get_living_prey(prey.sum()); - if (get_living_prey(prey.sum()) == 0) - return; + if (get_living_prey(prey.sum()) == 0) return; let preyMass = prey.sum_property("mass"); @@ -4197,7 +4795,10 @@ function paw_vore() { let lines = []; - if ((!macro.footShoeEnabled || !macro.footShoeWorn) && (!macro.footSockEnabled || !macro.footSockWorn)) { + if ( + (!macro.footShoeEnabled || !macro.footShoeWorn) && + (!macro.footSockEnabled || !macro.footSockWorn) + ) { let area = macro.pawArea; prey = prey.merge(getPrey(biome, area, macro.sameSizePawVore)); @@ -4206,29 +4807,52 @@ function paw_vore() { if (macro.paws.container.count > 0) { prey = prey.merge(macro.paws.container); - lines.push(describe("paw-vore-toes", macro.paws.container, macro, verbose, flat)); + lines.push( + describe("paw-vore-toes", macro.paws.container, macro, verbose, flat) + ); macro.paws.container = new Container(); } - if (macro.shoe.container.count > 0 && macro.footShoeWorn && (!macro.footSockEnabled || !macro.footSockWorn)) { + if ( + macro.shoe.container.count > 0 && + macro.footShoeWorn && + (!macro.footSockEnabled || !macro.footSockWorn) + ) { prey = prey.merge(macro.shoe.container); - lines.push(describe("paw-vore-toes", macro.shoe.container, macro, verbose, flat)); + lines.push( + describe("paw-vore-toes", macro.shoe.container, macro, verbose, flat) + ); macro.shoe.container = new Container(); } if (macro.sock.container.count > 0 && macro.footSockWorn) { prey = prey.merge(macro.sock.container); - lines.push(describe("paw-vore-toes", macro.sock.container, macro, verbose, flat)); + lines.push( + describe("paw-vore-toes", macro.sock.container, macro, verbose, flat) + ); macro.sock.container = new Container(); } if (lines.length == 0) { if (macro.footSockWorn) { - update(["Your " + macro.footOnlyDesc(true) + " have no prey to absorb in your socks.", newline]); + update([ + "Your " + + macro.footOnlyDesc(true) + + " have no prey to absorb in your socks.", + newline, + ]); } else if (macro.footShoeWorn) { - update(["Your " + macro.footOnlyDesc(true) + " have no prey to absorb in your " + macro.footDesc(true) + ".", newline]); + update([ + "Your " + + macro.footOnlyDesc(true) + + " have no prey to absorb in your " + + macro.footDesc(true) + + ".", + newline, + ]); + } else { + update(["Nothing happens...", newline]); } - else { update(["Nothing happens...", newline]); } return; } @@ -4311,10 +4935,14 @@ function breath_cone() { function magic_shrink() { let prey = new Container(); - prey = getPrey(biome, macro.magicScale * macro.height * macro.height * 100, true); + prey = getPrey( + biome, + macro.magicScale * macro.height * macro.height * 100, + true + ); macro.shrunkPrey = prey; - macro.shrunkPrey.mod_property("mass", x => x/1e2) + macro.shrunkPrey.mod_property("mass", (x) => x / 1e2); let line = describe("magic-shrink", prey, macro, false, flat); let linesummary = summarize(prey.sum(), false); @@ -4334,7 +4962,11 @@ function magic_fast_digestion() { } macro.fastDigestFactor = Math.log10(macro.magicScale) * 3; - macro.fastDigestTimer = setTimeout(function () { macro.fastDigestFactor = 1; macro.fastDigestTimer = null; update(["The digestion magic wears off...", newline]); }, 30000); + macro.fastDigestTimer = setTimeout(function () { + macro.fastDigestFactor = 1; + macro.fastDigestTimer = null; + update(["The digestion magic wears off...", newline]); + }, 30000); update([line, newline]); } @@ -4356,7 +4988,6 @@ function magic_arousal() { let line = "Ooo"; if (macro.maleParts && macro.femaleParts) { - } update([line, newline]); @@ -4366,7 +4997,7 @@ function magic_arousal() { function macro_arousal_execute(remaining, max) { if (remaining > 0) { - macro.arouse(2 * remaining / max); + macro.arouse((2 * remaining) / max); setTimeout(() => macro_arousal_execute(remaining - 1, max), 25); } } @@ -4381,10 +5012,12 @@ function magic_fill_sexual() { function macro_fill_sexual_execute(remaining, max) { if (macro.maleParts) { - macro.cumStorage.amount += macro.cumStorage.limit * 0.02 * remaining / max; + macro.cumStorage.amount += + (macro.cumStorage.limit * 0.02 * remaining) / max; } if (macro.femaleParts) { - macro.femcumStorage.amount += macro.femcumStorage.limit * 0.02 * remaining / max; + macro.femcumStorage.amount += + (macro.femcumStorage.limit * 0.02 * remaining) / max; } if (remaining > 0) { @@ -4453,19 +5086,34 @@ function cooldown(category, time, timestart) { } else { let button = document.getElementById("action-part-" + category); - let amount = Math.round((timestart - time) / timestart * 100); + let amount = Math.round(((timestart - time) / timestart) * 100); let unselect = dark ? "#111" : "#ddd"; let select = dark ? "#444" : "#555"; - button.style.setProperty("background", "linear-gradient(to right, " + select + " 0%, " + select + " " + amount + "%, " + unselect + " " + amount + "%, " + unselect + " 100%"); - setTimeout(function () { cooldown(category, time - 1, timestart); }, 20); + button.style.setProperty( + "background", + "linear-gradient(to right, " + + select + + " 0%, " + + select + + " " + + amount + + "%, " + + unselect + + " " + + amount + + "%, " + + unselect + + " 100%" + ); + setTimeout(function () { + cooldown(category, time - 1, timestart); + }, 20); } - } function cooldown_end(category) { - let button = document.getElementById("action-part-" + category); button.style.setProperty("background", null); @@ -4479,16 +5127,22 @@ function cooldown_end(category) { } function transformNumbers(line, fixed = undefined) { - return line.toString().replace(/[0-9]+(\.[0-9]+)?(e\+[0-9]+)?/g, function (text) { return number(text, numbers, fixed); }); + return line + .toString() + .replace(/[0-9]+(\.[0-9]+)?(e\+[0-9]+)?/g, function (text) { + return number(text, numbers, fixed); + }); } function update(lines = [], active = true) { - let log = active ? document.getElementById("log") : document.getElementById("react-log"); + let log = active + ? document.getElementById("log") + : document.getElementById("react-log"); let oldHeight = log.scrollHeight; lines.forEach(function (x) { - let line = document.createElement('div'); + let line = document.createElement("div"); line.innerHTML = transformNumbers(x); log.appendChild(line); }); @@ -4503,15 +5157,18 @@ function update(lines = [], active = true) { autoVerbose = false; let button = document.querySelector("#button-option-toggle_verbose"); - toggle_verbose({ "target": button }); + toggle_verbose({ target: button }); } } - document.getElementById("height").innerHTML = "Height: " + transformNumbers(length(macro.height, unit)); - document.getElementById("mass").innerHTML = "Mass: " + transformNumbers(mass(macro.totalMass, unit)); + document.getElementById("height").innerHTML = + "Height: " + transformNumbers(length(macro.height, unit)); + document.getElementById("mass").innerHTML = + "Mass: " + transformNumbers(mass(macro.totalMass, unit)); if (macro.difficulty > 0) { - document.getElementById("growth-points").innerHTML = "Growth points: " + macro.growthPoints; + document.getElementById("growth-points").innerHTML = + "Growth points: " + macro.growthPoints; } applyPercentage("arousal", 150 - macro.arousal * 1.5); applyPercentage("orgasm", 150 - (macro.arousal - 100) * 1.5); @@ -4526,7 +5183,12 @@ function update(lines = [], active = true) { function applyPercentage(name, meterPos) { meterPos = meterPos < 0 ? 0 : meterPos; - document.querySelector("#" + name + "Meter .fill").style.setProperty("transform", "translate(0px, " + Math.round(meterPos) + "px)"); + document + .querySelector("#" + name + "Meter .fill") + .style.setProperty( + "transform", + "translate(0px, " + Math.round(meterPos) + "px)" + ); let meter = document.querySelector("#" + name + "Meter"); if (meterPos == 0) { @@ -4537,8 +5199,9 @@ function applyPercentage(name, meterPos) { } function stylePercentage(name, storage) { - document.getElementById(name).innerHTML = name + ": " + transformNumbers(volume(storage.amount, unit, false), 2); - let meterPos = 150 - storage.amount / storage.limit * 150; + document.getElementById(name).innerHTML = + name + ": " + transformNumbers(volume(storage.amount, unit, false), 2); + let meterPos = 150 - (storage.amount / storage.limit) * 150; applyPercentage(name, meterPos); } @@ -4551,18 +5214,20 @@ function pick_move() { moving = false; break; case strollingEnum.Strolling: - stepTime = (1 * (1 / walkSpeed) * 2000 * (1 + Math.log10(macro.scale))) + 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))) + 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))) + stepTime = + (1 / 3) * (1 / walkSpeed) * 2000 * (1 + Math.log10(macro.scale)); moving = true; break; - }; + } setTimeout(pick_move, stepTime); if (!moving) { return; @@ -4575,51 +5240,79 @@ function pick_move() { function grow_automatic(preyMass, part) { if (macro.automaticGrowthEnabled == true) { - let preyMassBody = (preyMass * macro.preyGrowthFactor); + let preyMassBody = preyMass * macro.preyGrowthFactor; if (part === "tail" && macro.tailGrowthFactor > 0) { - preyMassBody = ((1 - macro.tailGrowthFactor) * macro.preyGrowthFactor * preyMass); //if growth factor is greater than 1, this function will behave oddly - grow_tail((macro.tailGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + preyMassBody = + (1 - macro.tailGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_tail( + macro.tailGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "cock" && macro.cockGrowthFactor > 0) { - preyMassBody = ((1 - macro.cockGrowthFactor) * macro.preyGrowthFactor * preyMass); //if growth factor is greater than 1, this function will behave oddly - grow_dick((macro.cockGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + preyMassBody = + (1 - macro.cockGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_dick( + macro.cockGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "balls" && macro.ballGrowthFactor > 0) { - preyMassBody = (1 - macro.ballGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly - grow_balls((macro.ballGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + preyMassBody = + (1 - macro.ballGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_balls( + macro.ballGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "bowels" && macro.assGrowthFactor > 0) { - preyMassBody = (1 - macro.assGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly - grow_ass((macro.assGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + preyMassBody = + (1 - macro.assGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_ass( + macro.assGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "breasts" && macro.breastGrowthFactor > 0) { - let preyMassBody = (1 - macro.breastGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly - grow_breasts((macro.breastGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + let preyMassBody = + (1 - macro.breastGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_breasts( + macro.breastGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "womb") { if (macro.wombGrowthFactor > 0) { - preyMassBody = ((1 - macro.wombGrowthFactor) * macro.preyGrowthFactor * preyMass); //if growth factor is greater than 1, this function will behave oddly - grow_womb((macro.wombGrowthFactor * macro.preyGrowthFactor * preyMass), false); - - } if (macro.vaginaGrowthFactor > 0) { - preyMassBody = ((1 - macro.vaginaGrowthFactor) * macro.preyGrowthFactor * preyMassBody); //if growth factor is greater than 1, this function will behave oddly - grow_vagina((macro.vaginaGrowthFactor * macro.preyGrowthFactor * preyMass), false); + preyMassBody = + (1 - macro.wombGrowthFactor) * macro.preyGrowthFactor * preyMass; //if growth factor is greater than 1, this function will behave oddly + grow_womb( + macro.wombGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); + } + if (macro.vaginaGrowthFactor > 0) { + preyMassBody = + (1 - macro.vaginaGrowthFactor) * + macro.preyGrowthFactor * + preyMassBody; //if growth factor is greater than 1, this function will behave oddly + grow_vagina( + macro.vaginaGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } } else if (part === "paws" && macro.pawGrowthFactor > 0) { - preyMassBody = ((1 - macro.pawGrowthFactor) * macro.preyGrowthFactor * preyMassBody); // if growth factor is greater than 1, this function will behave oddly - grow_paws((macro.pawGrowthFactor * macro.preyGrowthFactor * preyMass), false); - + preyMassBody = + (1 - macro.pawGrowthFactor) * macro.preyGrowthFactor * preyMassBody; // if growth factor is greater than 1, this function will behave oddly + grow_paws( + macro.pawGrowthFactor * macro.preyGrowthFactor * preyMass, + false + ); } else if (part === "souls" && macro.soulGrowthFactor > 0) { preyMassBody = 0; //keeps body growth from running - grow((preyMass * macro.soulGrowthFactor), false); - + grow(preyMass * macro.soulGrowthFactor, false); } else if (part === "goo" && macro.gooGrowthFactor > 0) { preyMassBody = 0; //keeps body growth from running - grow((preyMass * macro.gooGrowthFactor), false); + grow(preyMass * macro.gooGrowthFactor, false); //Body, runs after organ specific growth so organ specific growth factor kicks in. Doesn't run after goo or soul related growth - } if (preyMassBody > 0) { + } + if (preyMassBody > 0) { grow(preyMassBody, false); } } @@ -4627,7 +5320,9 @@ function grow_automatic(preyMass, part) { //Manual Growth function grow_part_pick(id) { - document.querySelector(".growth-part-active").classList.remove("growth-part-active"); + document + .querySelector(".growth-part-active") + .classList.remove("growth-part-active"); document.querySelector("#" + id).classList.add("growth-part-active"); } @@ -4635,7 +5330,10 @@ function grow_pick(times) { const select = document.querySelector("#growth-part-select"); const chosenPart = select.value; if (macro.difficulty > 0 && macro.growthPoints < (times - 1) * 10) { - update(["You need " + times * 10 + " growth points to grow that much.", newline]); + update([ + "You need " + times * 10 + " growth points to grow that much.", + newline, + ]); } else { if (macro.difficulty > 0) { macro.growthPoints -= (times - 1) * 10; @@ -4644,72 +5342,147 @@ function grow_pick(times) { times /= 10; switch (chosenPart) { - case "body": grow(times); break; - case "paws": grow_paws(times); break; - case "tail": grow_tail(times); break; - case "ass": grow_ass(times); break; - case "dick": grow_dick(times); break; - case "balls": grow_balls(times); break; - case "slit": grow_vagina(times); break; - case "womb": grow_womb(times); break; - case "breasts": grow_breasts(times); break; - case "wings": grow_wings(times); break; - case "musk": grow_musk(times); break; - case "stench": grow_stench(times); break; - case "breath": grow_breath(times); break; - case "magic": grow_magic(times); break; + case "body": + grow(times); + break; + case "paws": + grow_paws(times); + break; + case "tail": + grow_tail(times); + break; + case "ass": + grow_ass(times); + break; + case "dick": + grow_dick(times); + break; + case "balls": + grow_balls(times); + break; + case "slit": + grow_vagina(times); + break; + case "womb": + grow_womb(times); + break; + case "breasts": + grow_breasts(times); + break; + case "wings": + grow_wings(times); + break; + case "musk": + grow_musk(times); + break; + case "stench": + grow_stench(times); + break; + case "breath": + grow_breath(times); + break; + case "magic": + grow_magic(times); + break; } } } function grow(factor = 1, simpleCalc = true) { - let oldHeight = macro.height; let oldMass = macro.mass; if (simpleCalc == true) { macro.scale *= factor; } else { - macro.scale = Math.pow(((macro.mass + factor) / macro.baseMass), 1 / 3); + macro.scale = Math.pow((macro.mass + factor) / macro.baseMass, 1 / 3); } let heightDelta = macro.height - oldHeight; let massDelta = macro.mass - oldMass; - 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]); + 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) { - let oldArea = macro.pawArea; if (simpleCalc == true) { macro.pawScale *= factor; } else { - let volumeChangerPart = (((Math.pow(macro.pawWidth, 2) * macro.pawLength * macro.pawDensity) + factor) / (3 * macro.pawDensity)); + let volumeChangerPart = + (Math.pow(macro.pawWidth, 2) * macro.pawLength * macro.pawDensity + + factor) / + (3 * macro.pawDensity); //mass = volume*density. Since we know what we want our mass to be, we can figure out how much volume the final paw should have - let scaleChangerPart = ((3 * volumeChangerPart) / (Math.pow(macro.basePawWidth, 2) * macro.basePawLength)); - macro.pawScale = (Math.pow(scaleChangerPart, 1 / 3) / macro.scale); + let scaleChangerPart = + (3 * volumeChangerPart) / + (Math.pow(macro.basePawWidth, 2) * macro.basePawLength); + macro.pawScale = Math.pow(scaleChangerPart, 1 / 3) / macro.scale; // volume = 1/3 basewidth^2 * baselength *scale^3 *pawscale^3 } let areaDelta = macro.pawArea - oldArea; - 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]); + 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) { - let oldLength = macro.tailLength; let oldMass = macro.tailMass; if (simpleCalc == true) { macro.tailScale *= factor; } else { - let volumeChangerPart = (macro.tailMass + (factor / macro.tailCount)) / macro.tailDensity; - let scaleChangerPart = (volumeChangerPart / ((Math.pow(macro.baseTailDiameter / 2, 2)) * Math.PI * macro.baseTailLength * (Math.pow(macro.scale, 3)))); + let volumeChangerPart = + (macro.tailMass + factor / macro.tailCount) / macro.tailDensity; + let scaleChangerPart = + volumeChangerPart / + (Math.pow(macro.baseTailDiameter / 2, 2) * + Math.PI * + macro.baseTailLength * + Math.pow(macro.scale, 3)); macro.tailScale = Math.pow(scaleChangerPart, 1 / 3); // (tailVolume/((macro.baseTailDiameter/2)^2 * Math.PI * macro.baseTailLength * macro.scale^3)) = macro.tailScale^3 } @@ -4717,19 +5490,42 @@ function grow_tail(factor, simpleCalc = true) { let lengthDelta = macro.tailLength - oldLength; let massDelta = macro.tailMass - oldMass; - 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]); + 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) { - let oldLength = macro.dickLength; let oldMass = macro.dickMass; if (simpleCalc == true) { macro.dickScale *= factor; } else { - let volumeChangerPart = ((macro.dickMass + factor) / macro.dickDensity); - let scaleChangerPart = (volumeChangerPart / (Math.pow(macro.baseDickDiameter / 2, 2) * Math.PI * Math.pow(macro.scale, 3) * macro.baseDickLength * Math.pow(macro.arousalDickFactor, 3))); + let volumeChangerPart = (macro.dickMass + factor) / macro.dickDensity; + let scaleChangerPart = + volumeChangerPart / + (Math.pow(macro.baseDickDiameter / 2, 2) * + Math.PI * + Math.pow(macro.scale, 3) * + macro.baseDickLength * + Math.pow(macro.arousalDickFactor, 3)); macro.dickScale = Math.pow(scaleChangerPart, 1 / 3); // dickScale^3 = volume/ pi * baseDickRadius^2 * macro.scale^3 * baseDickLength * arousalDickFactor^3 } @@ -4737,11 +5533,28 @@ function grow_dick(factor, simpleCalc = true) { let lengthDelta = macro.dickLength - oldLength; let massDelta = macro.dickMass - oldMass; - 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]); + 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) { - let oldDiameter = macro.ballDiameter; let oldMass = macro.ballMass; @@ -4749,7 +5562,7 @@ function grow_balls(factor, simpleCalc = true) { macro.ballScale *= factor; } else { let volumeChangerPart = (macro.ballMass + factor) / macro.ballDensity; - let scaleChangerPart = Math.pow((6 * volumeChangerPart / Math.PI), 1 / 3) + let scaleChangerPart = Math.pow((6 * volumeChangerPart) / Math.PI, 1 / 3); macro.ballScale = scaleChangerPart / (macro.baseBallDiameter * macro.scale); // (6 * volume / pi)^1/3 = base ball diam * scale *ballScale } @@ -4757,11 +5570,27 @@ function grow_balls(factor, simpleCalc = true) { let diameterDelta = macro.ballDiameter - oldDiameter; let massDelta = macro.ballMass - oldMass; - 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]); + 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) { - let oldDiameter = macro.breastDiameter; let oldMass = macro.breastMass; @@ -4769,61 +5598,105 @@ function grow_breasts(factor, simpleCalc = true) { macro.breastScale *= factor; } else { let volumeChangerPart = (factor + macro.breastMass) / macro.breastDensity; - let scaleChangerPart = Math.pow((6 * volumeChangerPart / Math.PI), 1 / 3) - macro.breastScale = scaleChangerPart / (macro.baseBreastDiameter * macro.scale); + let scaleChangerPart = Math.pow((6 * volumeChangerPart) / Math.PI, 1 / 3); + macro.breastScale = + scaleChangerPart / (macro.baseBreastDiameter * macro.scale); // (6 * volume / pi)^1/3 = base ball diam * scale * ballScale } let diameterDelta = macro.breastDiameter - oldDiameter; let massDelta = macro.breastMass - oldMass; - 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]); + 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) { - let oldLength = macro.vaginaLength; if (simpleCalc == true) { macro.vaginaScale *= factor; } else { - let volumeChangerPart = ((macro.vaginaVolume * macro.wombDensity) + factor) / macro.wombDensity; - let scaleChangerPart = (volumeChangerPart / (Math.pow(macro.baseVaginaWidth, 2) * macro.baseVaginaLength)); - macro.vaginaScale = (Math.pow(scaleChangerPart, 1 / 3) / macro.scale); + let volumeChangerPart = + (macro.vaginaVolume * macro.wombDensity + factor) / macro.wombDensity; + let scaleChangerPart = + volumeChangerPart / + (Math.pow(macro.baseVaginaWidth, 2) * macro.baseVaginaLength); + macro.vaginaScale = Math.pow(scaleChangerPart, 1 / 3) / macro.scale; //vaginaVolume = baseVaginaWidth^2 * baseVaginaLength * (vaginaScale * macro.scale)^3 } let lengthDelta = macro.vaginaLength - oldLength; - 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]); + 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) { - let oldVolume = macro.wombVolume; if (simpleCalc == true) { macro.wombScale *= factor; } else { - let volumeChangerPart = ((macro.wombVolume * macro.wombDensity) + factor) / macro.wombDensity; - let scaleChangerPart = (volumeChangerPart / macro.baseWombVolume); - macro.wombScale = (Math.pow(scaleChangerPart, 1 / 3) / macro.scale); + let volumeChangerPart = + (macro.wombVolume * macro.wombDensity + factor) / macro.wombDensity; + let scaleChangerPart = volumeChangerPart / macro.baseWombVolume; + macro.wombScale = Math.pow(scaleChangerPart, 1 / 3) / macro.scale; //wombVolume = baseWombVolume * (wombScale * macro.scale)^3 } let volumeDelta = macro.wombVolume - oldVolume; - 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]); + 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) { - let oldDiameter = Math.pow(macro.assArea, 1 / 2); if (simpleCalc == true) { macro.assScale *= factor; } else { - macro.assScale = (macro.assScale + (factor / macro.mass)); //this is a hack, but the commented out block below doesn't work + macro.assScale = macro.assScale + factor / macro.mass; //this is a hack, but the commented out block below doesn't work //This Code is broken and I dont know why: //let radiusPart = Math.pow((macro.assArea/(4 * Math.PI)), 1/2); @@ -4836,82 +5709,152 @@ function grow_ass(factor, simpleCalc = true) { let diameterDelta = Math.pow(macro.assArea, 1 / 2) - oldDiameter; - 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]); + 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) { - let oldLength = macro.wingLength; if (simpleCalc == true) { macro.wingScale *= factor; } else { - macro.wingScale = (macro.wingScale + (factor / macro.mass)) + macro.wingScale = macro.wingScale + factor / macro.mass; } let lengthDelta = macro.wingLength - oldLength; - update([pickString("Power surges through you", "Energy flows into you", "Your back muscles fight for space", "Your muscles tense", "A crackling fills the air", "Your balance shifts", "You feel a buzz of power", "A warm sensation fills you") + " as your " + macro.wingDesc + " wings 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 crackling fills the air", + "Your balance shifts", + "You feel a buzz of power", + "A warm sensation fills you" + ) + + " as your " + + macro.wingDesc + + " wings grow, gaining " + + length(2 * lengthDelta, unit, false) + + " of wingspan.", + newline, + ]); } function grow_musk(factor, simpleCalc = true) { - let oldScale = macro.muskScale; if (simpleCalc == true) { macro.muskScale *= factor; } else { - macro.muskScale = (macro.muskScale + (factor / Math.pow(macro.mass, 1 / 3))) + macro.muskScale = macro.muskScale + factor / Math.pow(macro.mass, 1 / 3); } let scaleDelta = macro.muskScale - oldScale; - update([pickString("Power surges through you", "Energy flows into you", "A crackling fills the air", "Your balance shifts", "You feel a buzz of power", "A warm sensation fills you") + " as your musk thickens, growing more potent.", newline]); + update([ + pickString( + "Power surges through you", + "Energy flows into you", + "A crackling fills the air", + "Your balance shifts", + "You feel a buzz of power", + "A warm sensation fills you" + ) + " as your musk thickens, growing more potent.", + newline, + ]); } function grow_stench(factor, simpleCalc = true) { - let oldScale = macro.muskScale; if (simpleCalc == true) { macro.stenchScale *= factor; } else { - macro.stenchScale = (macro.stenchScale + (factor / Math.pow(macro.mass, 1 / 3))) + macro.stenchScale = + macro.stenchScale + factor / Math.pow(macro.mass, 1 / 3); } let scaleDelta = macro.stenchScale - oldScale; - update([pickString("Power surges through you", "Energy flows into you", "A crackling fills the air", "Your balance shifts", "You feel a buzz of power", "A warm sensation fills you") + " as your stench thickens, growing more potent.", newline]); + update([ + pickString( + "Power surges through you", + "Energy flows into you", + "A crackling fills the air", + "Your balance shifts", + "You feel a buzz of power", + "A warm sensation fills you" + ) + " as your stench thickens, growing more potent.", + newline, + ]); } function grow_breath(factor, simpleCalc = true) { - let oldScale = macro.breathScale; if (simpleCalc == true) { macro.breathScale *= factor; } else { - macro.breathScale = (macro.breathScale + (factor / Math.pow(macro.mass, 1 / 3))) + macro.breathScale = + macro.breathScale + factor / Math.pow(macro.mass, 1 / 3); } let scaleDelta = macro.breathScale - oldScale; - update([pickString("Power surges through you", "Energy flows into you", "A crackling fills the air", "Your balance shifts", "You feel a buzz of power", "A warm sensation fills you") + " as your breath weapon grows more potent.", newline]); + update([ + pickString( + "Power surges through you", + "Energy flows into you", + "A crackling fills the air", + "Your balance shifts", + "You feel a buzz of power", + "A warm sensation fills you" + ) + " as your breath weapon grows more potent.", + newline, + ]); } function grow_magic(factor, simpleCalc = true) { - let oldScale = macro.magicScale; if (simpleCalc == true) { macro.magicScale *= factor; } else { - macro.magicScale = (macro.magicScale + (factor / Math.pow(macro.mass, 1 / 3))) + macro.magicScale = macro.magicScale + factor / Math.pow(macro.mass, 1 / 3); } let scaleDelta = macro.magicScale - oldScale; - update([pickString("Power surges through you", "Energy flows into you", "A crackling fills the air", "Your balance shifts", "You feel a buzz of power", "A warm sensation fills you") + " as your magical powers grow.", newline]); + update([ + pickString( + "Power surges through you", + "Energy flows into you", + "A crackling fills the air", + "Your balance shifts", + "You feel a buzz of power", + "A warm sensation fills you" + ) + " as your magical powers grow.", + newline, + ]); } function resetSettings() { @@ -4929,13 +5872,10 @@ function loadPreset() { } function grabFormData(form, warnings, panels, buttons, stats, parts) { - // verify that this input box is in something we enabled - let parent = form.parentElement; - while (true) { if (parent.id == "custom-species") { break; @@ -4950,7 +5890,6 @@ function grabFormData(form, warnings, panels, buttons, stats, parts) { } parent = parent.parentElement; - } if (form.hasAttribute("data-warning")) { @@ -4962,7 +5901,7 @@ function grabFormData(form, warnings, panels, buttons, stats, parts) { text.split(",").forEach(function (token) { buttons.push(token); - }) + }); } if (form.hasAttribute("data-panels")) { @@ -4970,7 +5909,7 @@ function grabFormData(form, warnings, panels, buttons, stats, parts) { text.split(",").forEach(function (token) { panels.push(token); - }) + }); } if (form.hasAttribute("data-stats")) { @@ -4978,7 +5917,7 @@ function grabFormData(form, warnings, panels, buttons, stats, parts) { text.split(",").forEach(function (token) { stats.push(token); - }) + }); } if (form.hasAttribute("data-parts")) { @@ -4986,7 +5925,7 @@ function grabFormData(form, warnings, panels, buttons, stats, parts) { text.split(",").forEach(function (token) { parts.push(token); - }) + }); } } @@ -5005,8 +5944,7 @@ function generateSettings(diff = false) { for (let i = 0; i < form.length; i++) { let value = form[i].value == "" ? form[i].placeholder : form[i].value; - if (form[i].type == "text") - settings[form[i].name] = value; + if (form[i].type == "text") settings[form[i].name] = value; else if (form[i].type == "number") { if (form[i].dataset.unit == "percentage") { settings[form[i].name] = parseFloat(value) / 100; @@ -5015,42 +5953,44 @@ function generateSettings(diff = false) { } else { settings[form[i].name] = parseFloat(value); } - } - else if (form[i].type == "checkbox") { + } else if (form[i].type == "checkbox") { settings[form[i].name] = form[i].checked; if (form[i].checked) { grabFormData(form[i], warnings, panels, buttons, stats, parts); } - - } else if (form[i].type == "radio") { let name = form[i].name; if (form[i].checked) { settings[name] = form[i].value; grabFormData(form[i], warnings, panels, buttons, stats, parts); } - } else if (form[i].type == "select-one") { settings[form[i].name] = form[i][form[i].selectedIndex].value; - grabFormData(form[i][form[i].selectedIndex], warnings, panels, buttons, stats, parts); + grabFormData( + form[i][form[i].selectedIndex], + warnings, + panels, + buttons, + stats, + parts + ); } - } if (diff) { - options.forEach(panel => { + options.forEach((panel) => { recurseDeletePanel(settings, panel); - }) + }); } return { - "settings": settings, - "warnings": warnings, - "panels": panels, - "buttons": buttons, - "stats": stats, - "parts": parts + settings: settings, + warnings: warnings, + panels: panels, + buttons: buttons, + stats: stats, + parts: parts, }; } @@ -5058,33 +5998,35 @@ function recurseDeletePanel(settings, panel) { if (panel.id && panel.optional && !settings[panel.id]) { delete settings[panel.id]; } - panel.entries.forEach(option => { + panel.entries.forEach((option) => { if (option.type == "subcategory") { - if (settings[option.id] == option.default || (!settings[option.id] && option.default === undefined)) { + if ( + settings[option.id] == option.default || + (!settings[option.id] && option.default === undefined) + ) { delete settings[option.id]; } recurseDeletePanel(settings, option); } else if (settings[option.id] == undefined) { delete settings[option.id]; - } else if (option.type == "checkbox" && !settings[option.id] && option.default === undefined) { + } else if ( + option.type == "checkbox" && + !settings[option.id] && + option.default === undefined + ) { delete settings[option.id]; } else { if (option.unit == "percentage") { if (settings[option.id] * 100 == option.default) delete settings[option.id]; - } - - else if (option.unit == "volume") { + } else if (option.unit == "volume") { if (settings[option.id] * 1000 == option.default) delete settings[option.id]; - } - - else if (settings[option.id] == option.default && option.id != "name") { + } else if (settings[option.id] == option.default && option.id != "name") { delete settings[option.id]; } } - }) - + }); } function clearExport() { document.getElementById("export-area").value = ""; @@ -5124,7 +6066,9 @@ function updateCustomCharacters() { return name; }); - names.sort(function (x, y) { return x.localeCompare(y); }); + names.sort(function (x, y) { + return x.localeCompare(y); + }); if (Object.keys(saves).length == 0) { let none = document.createElement("option"); @@ -5153,7 +6097,7 @@ function saveSettings() { saves[settings.name] = settings; - storage.setItem('custom-characters', JSON.stringify(saves)); + storage.setItem("custom-characters", JSON.stringify(saves)); updateCustomCharacters(); } @@ -5162,10 +6106,10 @@ function deleteSettings() { let select = document.querySelector("#custom-characters"); let name = select.options[select.selectedIndex].value; - let settings = JSON.parse(storage.getItem('custom-characters')); + let settings = JSON.parse(storage.getItem("custom-characters")); if (settings[name] != undefined && confirm("Really delete " + name + "?")) { - let settings = JSON.parse(storage.getItem('custom-characters')); + let settings = JSON.parse(storage.getItem("custom-characters")); delete settings[name]; localStorage.setItem("custom-characters", JSON.stringify(settings)); updateCustomCharacters(); @@ -5173,23 +6117,20 @@ function deleteSettings() { } function loadAutosave() { - if (window.localStorage.getItem('autosave') == null) - return; + if (window.localStorage.getItem("autosave") == null) return; - loadSettings(JSON.parse(window.localStorage.getItem('autosave'))); + loadSettings(JSON.parse(window.localStorage.getItem("autosave"))); } function loadSettings(settings = null) { - if (settings == null) { - let storage = window.localStorage; let select = document.querySelector("#custom-characters"); let name = select.options[select.selectedIndex].value; - settings = JSON.parse(storage.getItem('custom-characters'))[name]; + settings = JSON.parse(storage.getItem("custom-characters"))[name]; if (settings == undefined) { return; @@ -5204,8 +6145,7 @@ function loadSettings(settings = null) { for (let i = 0; i < form.length; i++) { if (settings[form[i].name] != undefined) { - if (form[i].type == "text") - form[i].value = settings[form[i].name]; + if (form[i].type == "text") form[i].value = settings[form[i].name]; else if (form[i].type == "number") { if (form[i].dataset.unit == "percentage") { form[i].value = settings[form[i].name] * 100; @@ -5214,19 +6154,24 @@ function loadSettings(settings = null) { } else { form[i].value = settings[form[i].name]; } - } - - else if (form[i].type == "checkbox") { + } else if (form[i].type == "checkbox") { form[i].checked = settings[form[i].name]; - options.forEach(option => { - if (option.group && option.group != "main" && option.id == form[i].name && settings[form[i].name]) { - document.querySelector("#group-toggle-" + option.group).checked = true; + options.forEach((option) => { + if ( + option.group && + option.group != "main" && + option.id == form[i].name && + settings[form[i].name] + ) { + document.querySelector( + "#group-toggle-" + option.group + ).checked = true; } - }) + }); } else if (form[i].type == "radio") { let name = form[i].name; - form[i].checked = (settings[name] == form[i].value); + form[i].checked = settings[name] == form[i].value; } else if (form[i].type == "select-one") { for (let j = 0; j < form[i].length; j++) { if (form[i][j].value == settings[form[i].name]) { @@ -5244,7 +6189,8 @@ function loadSettings(settings = null) { function add_victim_people(category, prey) { victims[category]["people"] += get_living_prey(prey.sum()); - macro.growthPoints += get_living_prey(prey.sum()) * 100 / (1 + Math.log10(macro.scale)); + macro.growthPoints += + (get_living_prey(prey.sum()) * 100) / (1 + Math.log10(macro.scale)); } function enable_victim(category) { @@ -5265,12 +6211,12 @@ function enable_panel(name) { } function enable_stat(name) { - document.getElementById(name).style.display = 'block'; - document.querySelector("#" + name + "Meter").style.display = 'inline-block'; + document.getElementById(name).style.display = "block"; + document.querySelector("#" + name + "Meter").style.display = "inline-block"; } function enable_growth_part(name) { - document.querySelector("#option-growth-" + name).style.display = 'block'; + document.querySelector("#option-growth-" + name).style.display = "block"; } function disable_button(name) { @@ -5282,12 +6228,14 @@ function disable_panel(name) { } function startGame(e) { - if (started) - return; + if (started) return; started = true; - window.localStorage.setItem('autosave', JSON.stringify(generateSettings()["settings"])); + window.localStorage.setItem( + "autosave", + JSON.stringify(generateSettings()["settings"]) + ); let info = generateSettings(); @@ -5330,11 +6278,11 @@ function startGame(e) { enable_growth_part("paws"); - document.querySelector(".game-area").style.display = 'grid'; - document.getElementById("log").style.display = 'inline'; - document.getElementById("react-log").style.display = 'inline'; - document.getElementById("character-build-area").style.display = 'none'; - document.getElementById("action-panel").style.display = 'flex'; + document.querySelector(".game-area").style.display = "grid"; + document.getElementById("log").style.display = "inline"; + document.getElementById("react-log").style.display = "inline"; + document.getElementById("character-build-area").style.display = "none"; + document.getElementById("action-panel").style.display = "flex"; enable_panel("options"); @@ -5349,21 +6297,18 @@ function startGame(e) { enable_button("grind"); enable_button("ass_grind"); - if (macro.footType != "hoof") - enable_button("flex_toes"); - + if (macro.footType != "hoof") enable_button("flex_toes"); enable_growth_part("body"); enable_growth_part("ass"); if (macro.arousalEnabled) { - document.querySelector("#arousalMeter").style.display = 'inline-block'; - document.querySelector("#orgasmMeter").style.display = 'inline-block'; - document.querySelector("#edgeMeter").style.display = 'inline-block'; + document.querySelector("#arousalMeter").style.display = "inline-block"; + document.querySelector("#orgasmMeter").style.display = "inline-block"; + document.querySelector("#edgeMeter").style.display = "inline-block"; } if (macro.oralVore) { - if (macro.brutality > 0) { enable_button("chew"); } @@ -5402,13 +6347,15 @@ function startGame(e) { macro.gooMolten = false; } - document.getElementById("button-option-toggle_arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off"); + document.getElementById("button-option-toggle_arousal").innerHTML = + macro.arousalEnabled ? "Arousal On" : "Arousal Off"; if (!macro.arousalEnabled) { document.getElementById("arousal").style.display = "none"; document.getElementById("edge").style.display = "none"; } - document.getElementById("button-option-toggle_units").innerText = "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); //sets units button to display selected unit on start + document.getElementById("button-option-toggle_units").innerText = + "Units:\n" + unit.charAt(0).toUpperCase() + unit.slice(1); //sets units button to display selected unit on start if (macro.victimsHuman) { // eh this is ok @@ -5423,7 +6370,9 @@ function startGame(e) { macro.init(); - switch (macro.defaultBiome) { //sets starting biome as defined by player + switch ( + macro.defaultBiome //sets starting biome as defined by player + ) { case "City": biome = biomeEnum.City; break; @@ -5446,8 +6395,8 @@ function startGame(e) { update([newline]); } - document.getElementById("actions-body").style.display = 'flex'; - document.getElementById("stat-container").style.display = 'flex'; + document.getElementById("actions-body").style.display = "flex"; + document.getElementById("stat-container").style.display = "flex"; repeatUpdate(); @@ -5464,9 +6413,11 @@ function actionTab(e) { let target = "actions-" + name.replace(/action-part-/, ""); - document.querySelectorAll(".action-part-button.active").forEach(function (element) { - element.classList.remove("active"); - }); + document + .querySelectorAll(".action-part-button.active") + .forEach(function (element) { + element.classList.remove("active"); + }); document.querySelectorAll(".action-tab").forEach(function (element) { element.style.display = "none"; }); @@ -5484,7 +6435,7 @@ function showStats() { if (victims[key]["people"] > 0) { lines.push([ victims[key]["people"] + " " + describeVictim("victim-" + key, macro), - victims[key]["people"] + victims[key]["people"], ]); total += victims[key]["people"]; } @@ -5529,11 +6480,15 @@ function registerActions() { let name = button.id; name = name.replace(/button-action-/, ""); if (macro.difficulty > 0) { - button.addEventListener("click", function () { cooldown_start(name); performAction(name) }); + button.addEventListener("click", function () { + cooldown_start(name); + performAction(name); + }); } else { - button.addEventListener("click", function () { performAction(name) }); + button.addEventListener("click", function () { + performAction(name); + }); } - }); } @@ -5543,8 +6498,9 @@ function registerOptions() { buttons.forEach(function (button) { let name = button.id; name = name.replace(/button-option-/, ""); - button.addEventListener("click", function (e) { window[name](e); }); - + button.addEventListener("click", function (e) { + window[name](e); + }); }); } @@ -5557,35 +6513,28 @@ function updateAllPreviews() { function updatePreview(name) { let scale = document.getElementById("scale").value; - if (scale == "") - scale = document.getElementById("scale").placeholder; + if (scale == "") scale = document.getElementById("scale").placeholder; let element = document.getElementById(name); - if (element == undefined) - return; + if (element == undefined) return; let value = element.value; let unitType = document.getElementById(name).dataset.unit; - if (value == "") - value = document.getElementById(name).placeholder; + if (value == "") value = document.getElementById(name).placeholder; let result = ""; - if (unitType == undefined) - return; + if (unitType == undefined) return; - if (unitType == "length") - result = length(value * scale, unit); - else if (unitType == "area") - result = area(value * scale * scale, unit); + if (unitType == "length") result = length(value * scale, unit); + else if (unitType == "area") result = area(value * scale * scale, unit); else if (unitType == "volume") - result = volume(value * scale * scale * scale / 1000, unit); + result = volume((value * scale * scale * scale) / 1000, unit); else if (unitType == "mass") result = mass(value * scale * scale * scale, unit); - else if (unitType == "percentage") - result = value + "%"; + else if (unitType == "percentage") result = value + "%"; document.getElementById(name + "Preview").innerHTML = result; } @@ -5595,30 +6544,39 @@ function toggleTextFade() { const button = document.querySelector("#button-option-toggleTextFade"); button.innerText = textFade.name; - document.querySelectorAll(".log").forEach(log => log.style.setProperty("--fade-animation", textFade.animation)); - + document + .querySelectorAll(".log") + .forEach((log) => + log.style.setProperty("--fade-animation", textFade.animation) + ); } function debugLog() { console.log("Your character settings:"); console.log(JSON.stringify(generateSettings()["settings"])); console.log("Current macro state:"); - console.log(JSON.stringify(macro, function (key, value) { - if (key == 'owner') { return "owner"; } - else { return value; } - })); - alert("Debug info has been logged to console. Press F12, click \"Console\", and copy all the text"); + console.log( + JSON.stringify(macro, function (key, value) { + if (key == "owner") { + return "owner"; + } else { + return value; + } + }) + ); + alert( + 'Debug info has been logged to console. Press F12, click "Console", and copy all the text' + ); } -window.addEventListener('load', function (event) { - +window.addEventListener("load", function (event) { (function () { let storage = window.localStorage; if (storage.getItem("dark-mode") != null) { setDarkMode(storage.getItem("dark-mode") === "true"); } - }()); + })(); if (storage.getItem("custom-characters") == undefined) { storage.setItem("custom-characters", JSON.stringify({})); @@ -5633,7 +6591,7 @@ window.addEventListener('load', function (event) { saves[character.name] = character; localStorage.setItem("custom-characters", JSON.stringify(saves)); - localStorage.removeItem("settings") + localStorage.removeItem("settings"); } updateCustomCharacters(); @@ -5645,10 +6603,14 @@ window.addEventListener('load', function (event) { construct_options(); construct_panels(); - document.querySelector("#save-version").setAttribute("placeholder", migrations.length); + document + .querySelector("#save-version") + .setAttribute("placeholder", migrations.length); document.querySelectorAll("input[type='number']").forEach(function (x) { - x.addEventListener("input", function () { updatePreview(x.id); }); + x.addEventListener("input", function () { + updatePreview(x.id); + }); }); updateAllPreviews(); @@ -5664,12 +6626,11 @@ window.addEventListener('load', function (event) { } else { return x.name.localeCompare(y.name); } - }); let category_list = document.getElementById("character-preset-categories"); - presetCategories.forEach(name => { + presetCategories.forEach((name) => { let opt = document.createElement("option"); opt.innerHTML = name; opt.value = name; @@ -5699,7 +6660,7 @@ function updatePresets(e) { const list = document.getElementById("character-presets"); const category_list = document.getElementById("character-preset-categories"); - Array.from(list.options).forEach(x => { + Array.from(list.options).forEach((x) => { if (x.dataset.category == category_list.value) { x.style.display = "block"; } else { @@ -5715,29 +6676,25 @@ function updatePresets(e) { } } } -}; +} function reset_visible_groups() { - groups.forEach(group => { + groups.forEach((group) => { document.querySelector("#group-toggle-" + group).checked = false; }); update_visible_groups(); } function update_visible_groups() { - - groups.forEach(group => { + groups.forEach((group) => { const state = document.querySelector("#group-toggle-" + group).checked; - document.querySelectorAll(".sheet-group-" + group).forEach(category => { - if (state) - category.style.display = ""; - else - category.style.display = "none"; + document.querySelectorAll(".sheet-group-" + group).forEach((category) => { + if (state) category.style.display = ""; + else category.style.display = "none"; }); }); } function register_buttons() { - document.querySelectorAll(".action-part-button").forEach(function (element) { element.addEventListener("click", actionTab); }); @@ -5745,35 +6702,89 @@ function register_buttons() { document.getElementById("button-look").addEventListener("click", look); document.getElementById("button-stats").addEventListener("click", showStats); - document.getElementById("button-dark-mode-options").addEventListener("click", toggleDarkMode); + document + .getElementById("button-dark-mode-options") + .addEventListener("click", toggleDarkMode); document.querySelectorAll(".growth-part").forEach(function (button) { - button.addEventListener("select", function () { grow_part_pick(button.id); }); + button.addEventListener("select", function () { + grow_part_pick(button.id); + }); }); - document.getElementById("button-growth-1.1").addEventListener("click", function () { grow_pick(11); }); - document.getElementById("button-growth-1.5").addEventListener("click", function () { grow_pick(15); }); - document.getElementById("button-growth-2").addEventListener("click", function () { grow_pick(20); }); - document.getElementById("button-growth-5").addEventListener("click", function () { grow_pick(50); }); - document.getElementById("button-growth-20").addEventListener("click", function () { grow_pick(200); }); - document.getElementById("button-growth-100").addEventListener("click", function () { grow_pick(1000); }); - - document.getElementById("button-load-preset").addEventListener("click", loadPreset); - - document.getElementById("button-export-clear").addEventListener("click", clearExport); - document.getElementById("button-export-preset").addEventListener("click", exportSettings); - document.getElementById("button-import-preset").addEventListener("click", importSettings); - - document.getElementById("button-reset-custom").addEventListener("click", resetSettings); - document.getElementById("button-load-autosave").addEventListener("click", loadAutosave); + document + .getElementById("button-growth-1.1") + .addEventListener("click", function () { + grow_pick(11); + }); + document + .getElementById("button-growth-1.5") + .addEventListener("click", function () { + grow_pick(15); + }); + document + .getElementById("button-growth-2") + .addEventListener("click", function () { + grow_pick(20); + }); + document + .getElementById("button-growth-5") + .addEventListener("click", function () { + grow_pick(50); + }); + document + .getElementById("button-growth-20") + .addEventListener("click", function () { + grow_pick(200); + }); + document + .getElementById("button-growth-100") + .addEventListener("click", function () { + grow_pick(1000); + }); - document.getElementById("button-units-options").addEventListener("click", toggle_units_options) + document + .getElementById("button-load-preset") + .addEventListener("click", loadPreset); + + document + .getElementById("button-export-clear") + .addEventListener("click", clearExport); + document + .getElementById("button-export-preset") + .addEventListener("click", exportSettings); + document + .getElementById("button-import-preset") + .addEventListener("click", importSettings); + + document + .getElementById("button-reset-custom") + .addEventListener("click", resetSettings); + document + .getElementById("button-load-autosave") + .addEventListener("click", loadAutosave); + + document + .getElementById("button-units-options") + .addEventListener("click", toggle_units_options); // note to self - the anonymous function is so that // loadSettings doesn't receive the mouseEvent! - document.getElementById("button-load-custom").addEventListener("click", function () { loadSettings(); }); - document.getElementById("button-save-custom").addEventListener("click", function () { saveSettings(); }); - document.getElementById("button-delete-custom").addEventListener("click", function () { deleteSettings(); }); + document + .getElementById("button-load-custom") + .addEventListener("click", function () { + loadSettings(); + }); + document + .getElementById("button-save-custom") + .addEventListener("click", function () { + saveSettings(); + }); + document + .getElementById("button-delete-custom") + .addEventListener("click", function () { + deleteSettings(); + }); document.getElementById("button-start").addEventListener("click", startGame); } function render_text_option(li, option) { @@ -5809,12 +6820,10 @@ function render_number_option(li, option, type) { input.setAttribute("step", "any"); } - if (option.default) { input.setAttribute("placeholder", option.default); } - let label = document.createElement("label"); label.setAttribute("for", option.id); label.innerText = option.name; @@ -5866,10 +6875,10 @@ function render_radio_option(options_div, option) { label.setAttribute("for", option.id + "-" + choice.value); label.innerText = choice.name; - label.classList.add("solo") + label.classList.add("solo"); if (choice.tooltip) { - label.classList.add("has-tooltip") + label.classList.add("has-tooltip"); label.title = choice.tooltip; } @@ -5878,13 +6887,11 @@ function render_radio_option(options_div, option) { li.appendChild(input); li.appendChild(label); options_div.appendChild(li); - }); } //sets up style for "checkbox" in features.js function render_checkbox_option(li, option) { - let input = document.createElement("input"); input.setAttribute("autocomplete", "off"); input.setAttribute("id", option.id); @@ -6063,7 +7070,6 @@ function render_category(root, category) { header.setAttribute("for", category.id); attach_form_data(input, category); - } else { header = document.createElement("div"); header.classList.add("custom-header-static"); @@ -6075,7 +7081,7 @@ function render_category(root, category) { header.innerText = name; - let options_div = document.createElement("div") + let options_div = document.createElement("div"); if (category.optional) { options_div.classList.add("reveal-if-active"); @@ -6095,7 +7101,7 @@ function render_category(root, category) { function construct_options() { let group_holder = document.getElementById("group-button-holder"); - groups.forEach(group => { + groups.forEach((group) => { const label = document.createElement("label"); const input = document.createElement("input"); @@ -6114,8 +7120,7 @@ function construct_options() { group_holder.appendChild(input); group_holder.appendChild(label); group_holder.appendChild(document.createElement("br")); - - }) + }); let root = document.getElementById("character-flex-outer"); @@ -6123,7 +7128,7 @@ function construct_options() { render_category(root, category); }); - groups.forEach(group => { + groups.forEach((group) => { let div = document.createElement("div"); div.classList.add("group-banner"); @@ -6197,5 +7202,4 @@ function construct_panels() { root.appendChild(buttons); }); - } diff --git a/migrations.js b/migrations.js index 829b7d4..9a1fe90 100644 --- a/migrations.js +++ b/migrations.js @@ -2,40 +2,27 @@ migrations = [ // 0 -> 1 - + // does nothing - save => { - }, + (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; + (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; }, // 2 -> 3 @@ -43,23 +30,17 @@ migrations = [ // passive production is now written as percentage points; // old values won't make sense anymore, so we'll just // erase them - save => { - if (save.baseCumProduction) - delete save.baseCumProduction; - if (save.baseFemcumProduction) - delete save.baseFemcumProduction; - if (save.baseLactationProduction) - delete save.baseLactationProduction; - if (save.baseGasProduction) - delete save.baseGasProduction; - if (save.basePissProduction) - delete save.basePissProduction; - if (save.baseScatProduction) - delete save.baseScatProduction; - } + (save) => { + if (save.baseCumProduction) delete save.baseCumProduction; + if (save.baseFemcumProduction) delete save.baseFemcumProduction; + if (save.baseLactationProduction) delete save.baseLactationProduction; + if (save.baseGasProduction) delete save.baseGasProduction; + if (save.basePissProduction) delete save.basePissProduction; + if (save.baseScatProduction) delete save.baseScatProduction; + }, ]; -function migrate(save, target=null) { +function migrate(save, target = null) { if (target == null) { target = migrations.length; } @@ -67,13 +48,17 @@ function migrate(save, target=null) { let version = save.version; if (version == undefined) { - alert("This save is from before versioning was added. It can't be automatically updated, and it might lose some settings. Double check that everything's there! Any subsequent saves will work correctly."); + alert( + "This save is from before versioning was added. It can't be automatically updated, and it might lose some settings. Double check that everything's there! Any subsequent saves will work correctly." + ); save["version"] = migrations.length; return false; } - if (version == 0 ) { - alert("This save is from before v1.0. It can't be automatically migrated, so it may lose some settings. Double check the resulting character. Subsequent saves will function correctly."); + if (version == 0) { + alert( + "This save is from before v1.0. It can't be automatically migrated, so it may lose some settings. Double check the resulting character. Subsequent saves will function correctly." + ); save["version"] = migrations.length; return false; } diff --git a/presets.js b/presets.js index 595dd1e..655bc34 100644 --- a/presets.js +++ b/presets.js @@ -1,754 +1,998 @@ -let presetCategories = [ - "default", - "neopuc", - "special" -] +let presetCategories = ["default", "neopuc", "special"]; let presetInfo = { default: { - name: "Default" + name: "Default", }, neopuc: { - name: "Neopuc's Chars" + name: "Neopuc's Chars", }, special: { - name: "Extra Special" - } -} + name: "Extra Special", + }, +}; let presets = [ { - "version": 3, - "name": "Fen", - "scale": 15, - "priority": 1, - "brutality": "2", - "oralVore": true, - "analVore": true, - "analVoreToStomach": true, - "hasTail": true, - "tailType": "twisted", - "baseTailLength": 2, - "baseTailDiameter": 0.4 + version: 3, + name: "Fen", + scale: 15, + priority: 1, + brutality: "2", + oralVore: true, + analVore: true, + analVoreToStomach: true, + hasTail: true, + tailType: "twisted", + baseTailLength: 2, + baseTailDiameter: 0.4, + }, + { + version: 3, + name: "Special Fen", + category: "special", + bio: "He's VERY fluffy", + scale: 15, + priority: 1, + brutality: "2", + oralVore: true, + analVore: true, + analVoreToStomach: true, + hasTail: true, + tailType: "twisted", + baseTailLength: 2, + baseTailDiameter: 0.4, + }, + { + version: 3, + 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: 3, + 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: 3, + 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, + oralDigestAuto: false, + analDigestAuto: false, + pawDigestAuto: false, + }, + { + version: 3, + 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: 3, + 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: 3, + 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": 3, - "name": "Special Fen", - "category": "special", - "bio": "He's VERY fluffy", - "scale": 15, - "priority": 1, - "brutality": "2", - "oralVore": true, - "analVore": true, - "analVoreToStomach": true, - "hasTail": true, - "tailType": "twisted", - "baseTailLength": 2, - "baseTailDiameter": 0.4 + version: 3, + 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": 3, - "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: 3, + 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": 3, - "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: 3, + 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": 3, - "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, - "oralDigestAuto": false, - "analDigestAuto": false, - "pawDigestAuto": false + version: 3, + 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, + baseScatDigestFactor: 0.3, + scatStorageScale: 1.5, + scatScaleWithSize: true, + magicEnabled: true, }, { - "version": 3, - "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: 3, + 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": 3, - "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: 3, + 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": 3, - "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: 3, + name: "Ona", + scale: 100, + baseHeight: 3, + baseMass: 125, + basePawLength: 0.45, + basePawWidth: 0.25, + baseHandLength: 0.3, + baseHandWidth: 0.2, + baseAssArea: 0.5, + sameSizeStomp: true, + species: "Raven", + footType: "avian", + jawType: "beak", + automaticGrowthEnabled: true, + biomes: true, + changingBiomes: true, + brutality: "3", + victimsMilitary: true, + victimsMacros: true, + oralVore: true, + analVore: true, + footWear: true, + footShoeEnabled: true, + footShoe: "heel", + arousalEnabled: true, + hasTail: true, + tailType: "Feathery", + baseTailDiameter: 0.5, + tailStretchiness: 1, + baseCumVolume: 0.1, + dickStretchiness: 1, + hasSheath: true, + femaleParts: true, + baseVaginaLength: 0.3, + baseVaginaWidth: 0.15, + baseWombVolume: 0.1, + femcumStorageScale: 10, + unbirthEnabled: true, + vaginaStretchiness: 2, + femcumScaleWithSize: true, + femaleMuskEnabled: true, + hasBreasts: true, + lactationEnabled: true, + breastVore: true, + breastStretchiness: 1, + milkScaleWithSize: true, + baseAssStenchArea: 1, + gasEnabled: true, + belchEnabled: true, + fartEnabled: true, + gasScaleWithSize: true, + soulVoreEnabled: true, + soulVoreType: "release", + pissEnabled: true, + scatEnabled: true, + scatScaleWithSize: true, + cropEnabled: true, + breathEnabled: true, + breathSmoke: true, + droolBaseVolume: 0.01, + magicEnabled: true, + hasWings: true, + baseWingWidth: 2, + baseWingLength: 4, }, { - "version": 3, - "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: 3, + 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": 3, - "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: 3, + 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": 3, - "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: 3, + 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, }, { - "version": 3, - "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, - "baseScatDigestFactor": 0.3, - "scatStorageScale": 1.5, - "scatScaleWithSize": true, - "magicEnabled": true + version: 3, + name: "Cinnamon", + baseHeight: 1.25, + baseMass: 100, + baseAssArea: 1, + species: "Dragon", + automaticGrowth: true, + automaticGrowthEnabled: true, + basePreyGrowthFactor: 1, + growthScaleWithSize: true, + biomes: true, + changingBiomes: true, + defaultBiome: "Downtown", + ruralEnabled: false, + brutality: "3", + oralVore: true, + arousalEnabled: true, + maleParts: true, + baseDickLength: 1.25, + baseDickDiameter: 0.3, + dickType: "equine", + baseBallDiameter: 0.3, + baseCumVolume: 1892.71, + cockGrowthFactor: 1, + ballGrowthFactor: 1, + cockVoreEnabled: true, + dickStretchiness: 25, + cumScaleWithSize: true, + maleMuskEnabled: true, + baseMaleMuskArea: 1, + droolEnabled: true, }, { - "version": 3, - "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: 3, + name: "Rai", + scale: 1.65, + baseMass: 33, + basePawLength: 0.19, + basePawWidth: 0.19, + baseHandLength: 0.2, + baseHandWidth: 0.2, + baseAssArea: 1, + species: "Wolf", + victimsHuman: true, + victimsMilitary: true, + victimsMicros: true, + oralVore: true, + analVoreToStomach: true, + hasTail: true, + tailType: "Fluffy", + hasBreasts: true, + baseBreastDiameter: 0.12, + soulVoreEnabled: true, + soulVoreType: "oblivion", + breathEnabled: true, + breathElectric: true, + droolEnabled: true, + magicEnabled: true, }, { - "version": 3, - "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: 3, + name: "Elbial", + category: "neopuc", + priority: 4, + scale: 200, + bio: "Delights in tormenting mortals, devilishly mischievous, very arrogant and cocky.", + species: "hybrid demon", + automaticGrowthEnabled: true, + brutality: "2", + victimsMacros: true, + oralVore: true, + oralDigestTime: 5, + oralDigestManual: true, + analVore: true, + analDigestTime: 10, + analVoreToStomach: true, + arousalEnabled: true, + hasTail: true, + maleParts: true, + baseDickDiameter: 0.06, + dickType: "demonic", + baseBallDiameter: 0.06, + cockVoreEnabled: true, + cockDigestTime: 5, + cockDigestManual: true, + hasSheath: true, + sheathAbsorptionEnabled: true, + femaleParts: true, + unbirthEnabled: true, + unbirthDigestTime: 5, + unbirthDigestManual: true, + sexualMagicEnabled: true, + hasBreasts: true, + lactationEnabled: true, + breastVore: true, + soulVoreEnabled: true, + magicEnabled: true, }, - {"version":3,"name":"Ona","scale":100,"baseHeight":3,"baseMass":125,"basePawLength":0.45,"basePawWidth":0.25,"baseHandLength":0.3,"baseHandWidth":0.2,"baseAssArea":0.5,"sameSizeStomp":true,"species":"Raven","footType":"avian","jawType":"beak","automaticGrowthEnabled":true,"biomes":true,"changingBiomes":true,"brutality":"3","victimsMilitary":true,"victimsMacros":true,"oralVore":true,"analVore":true,"footWear":true,"footShoeEnabled":true,"footShoe":"heel","arousalEnabled":true,"hasTail":true,"tailType":"Feathery","baseTailDiameter":0.5,"tailStretchiness":1,"baseCumVolume":0.1,"dickStretchiness":1,"hasSheath":true,"femaleParts":true,"baseVaginaLength":0.3,"baseVaginaWidth":0.15,"baseWombVolume":0.1,"femcumStorageScale":10,"unbirthEnabled":true,"vaginaStretchiness":2,"femcumScaleWithSize":true,"femaleMuskEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"breastStretchiness":1,"milkScaleWithSize":true,"baseAssStenchArea":1,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasScaleWithSize":true,"soulVoreEnabled":true,"soulVoreType":"release","pissEnabled":true,"scatEnabled":true,"scatScaleWithSize":true,"cropEnabled":true,"breathEnabled":true,"breathSmoke":true,"droolBaseVolume":0.01,"magicEnabled":true,"hasWings":true,"baseWingWidth":2,"baseWingLength":4}, { - "version": 3, - "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: 3, + name: "Mira", + category: "neopuc", + priority: 4, + scale: 5000, + bio: "Mira is a touch on the arrogant side and can be fairly greedy. She believes anything and anyone smaller than herself belongs to her. Considering she is a size shifter that can reach mind boggling proportions that means just about ever ything is smaller than herself and she lays claim to a significant portion of her universe.", + species: "dragon", + brutality: "2", + victimsMilitary: true, + victimsMacros: true, + oralVore: true, + arousalEnabled: true, + hasTail: true, + tailType: "draconic", + baseTailLength: 2, + femaleParts: true, + hasBreasts: true, + hasWings: true, + wingDesc: "draconic", }, { - "version": 3, - "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: 3, + name: "Carmine", + category: "neopuc", + priority: 3, + scale: 28500, + bio: "Always smiling, but the smile hides a cruel personality. Never truly as happy as when he is tormenting those smaller than himself.", + species: "otter", + brutality: "3", + victimsMilitary: true, + victimsMacros: true, + oralVore: true, + analVore: true, + footWear: true, + footShoeEnabled: true, + footShoe: "boot", + arousalEnabled: true, + hasTail: true, + tailType: "rudder", + baseTailLength: 2.2, + maleParts: true, + cockVoreEnabled: true, + hasSheath: true, + sheathAbsorptionEnabled: true, }, { - "version": 3, - "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 + version: 3, + name: "Jennifer", + category: "neopuc", + priority: 3, + scale: 24.5, + bio: "Assertive in all things. She goes out and takes the things she likes, especially when they are people. Only feels the need to have a small select group of friends. Can be fairly uncaring towards the fate of little folk even though she does think they are cute.", + species: "rat ifrit", + footType: "foot", + arousalEnabled: true, + hasTail: true, + tailType: "skinny", + baseTailLength: 2, + femaleParts: true, + unbirthEnabled: true, + hasBreasts: true, + magicEnabled: true, }, { - "version": 3, - "name": "Cinnamon", - "baseHeight": 1.25, - "baseMass": 100, - "baseAssArea": 1, - "species": "Dragon", - "automaticGrowth": true, - "automaticGrowthEnabled": true, - "basePreyGrowthFactor": 1, - "growthScaleWithSize": true, - "biomes": true, - "changingBiomes": true, - "defaultBiome": "Downtown", - "ruralEnabled": false, - "brutality": "3", - "oralVore": true, - "arousalEnabled": true, - "maleParts": true, - "baseDickLength": 1.25, - "baseDickDiameter": 0.3, - "dickType": "equine", - "baseBallDiameter": 0.3, - "baseCumVolume": 1892.71, - "cockGrowthFactor": 1, - "ballGrowthFactor": 1, - "cockVoreEnabled": true, - "dickStretchiness": 25, - "cumScaleWithSize": true, - "maleMuskEnabled": true, - "baseMaleMuskArea": 1, - "droolEnabled": true + version: 3, + name: "Porter", + category: "neopuc", + priority: 2, + scale: 1.58, + bio: "Devilishly charismatic, but secretly holds most people in contempt. Wildly in love Holly. Dominant Personality.", + species: "Bernese mountain dog", + brutality: "2", + victimsMicros: true, + oralVore: true, + oralDigestManual: true, + arousalEnabled: true, + hasTail: true, + maleParts: true, + baseDickLength: 0.35, + cockVoreEnabled: true, + cockDigestManual: true, + hasSheath: true, + sheathAbsorptionEnabled: true, + sexualMagicEnabled: true, + magicEnabled: true, }, { - "version": 3, - "name": "Rai", - "scale": 1.65, - "baseMass": 33, - "basePawLength": 0.19, - "basePawWidth": 0.19, - "baseHandLength": 0.2, - "baseHandWidth": 0.2, - "baseAssArea": 1, - "species": "Wolf", - "victimsHuman": true, - "victimsMilitary": true, - "victimsMicros": true, - "oralVore": true, - "analVoreToStomach": true, - "hasTail": true, - "tailType": "Fluffy", - "hasBreasts": true, - "baseBreastDiameter": 0.12, - "soulVoreEnabled": true, - "soulVoreType": "oblivion", - "breathEnabled": true, - "breathElectric": true, - "droolEnabled": true, - "magicEnabled": true + version: 3, + name: "Rat jeice", + baseHeight: 2, + baseMass: 200, + basePawLength: 0.5, + basePawWidth: 0.27, + baseHandLength: 0.19, + baseHandWidth: 0.29, + baseAssArea: 0.5, + species: "Rat", + biomes: true, + changingBiomes: true, + brutality: "0", + victimsHuman: true, + victimsMacros: true, + oralVore: true, + oralDigestAuto: false, + oralDigestTime: 0, + oralDigestManual: true, + analVore: true, + baseAnalVoreDiameter: 0.23, + analDigestAuto: false, + analDigestTime: 0, + analDigestManual: true, + hasTail: true, + tailType: "sinewy hungry", + baseTailLength: 1.5, + baseTailDiameter: 0.1, + tailMaw: true, + tailStretchiness: 2, + tailDigestAuto: false, + tailDigestManual: true, + maleParts: true, + baseDickLength: 0.4, + baseDickDiameter: 0.2, + dickType: "meaty", + baseBallDiameter: 0.1, + baseCumVolume: 0.004, + baseCumProduction: 0.004, + cumStorageScale: 10, + cockVoreEnabled: true, + dickStretchiness: 4, + baseCumDigestFactor: 0, + cockDigestAuto: false, + cockDigestTime: 0, + cockDigestManual: true, + sheathAbsorptionEnabled: true, + hasForeskin: true, + gasEnabled: true, + belchEnabled: true, + fartEnabled: true, + gasStorageScale: 7, + baseGasDigestFactor: 7, + gasScaleWithSize: true, + gooEnabled: true, + gooDigestion: true, + gooGrowthFactor: 0.3, + gooDigestAuto: false, + gooDigestTime: 0, + gooDigestManual: true, }, - {"version":3,"name":"Elbial","category": "neopuc", "priority": 4, "scale":200,"bio":"Delights in tormenting mortals, devilishly mischievous, very arrogant and cocky.","species":"hybrid demon","automaticGrowthEnabled":true,"brutality":"2","victimsMacros":true,"oralVore":true,"oralDigestTime":5,"oralDigestManual":true,"analVore":true,"analDigestTime":10,"analVoreToStomach":true,"arousalEnabled":true,"hasTail":true,"maleParts":true,"baseDickDiameter":0.06,"dickType":"demonic","baseBallDiameter":0.06,"cockVoreEnabled":true,"cockDigestTime":5,"cockDigestManual":true,"hasSheath":true,"sheathAbsorptionEnabled":true,"femaleParts":true,"unbirthEnabled":true,"unbirthDigestTime":5,"unbirthDigestManual":true,"sexualMagicEnabled":true,"hasBreasts":true,"lactationEnabled":true,"breastVore":true,"soulVoreEnabled":true,"magicEnabled":true}, - {"version":3,"name":"Mira","category": "neopuc", "priority": 4, "scale":5000,"bio":"Mira is a touch on the arrogant side and can be fairly greedy. She believes anything and anyone smaller than herself belongs to her. Considering she is a size shifter that can reach mind boggling proportions that means just about ever ything is smaller than herself and she lays claim to a significant portion of her universe.","species":"dragon","brutality":"2","victimsMilitary":true,"victimsMacros":true,"oralVore":true,"arousalEnabled":true,"hasTail":true,"tailType":"draconic","baseTailLength":2,"femaleParts":true,"hasBreasts":true,"hasWings":true,"wingDesc":"draconic"}, - {"version":3,"name":"Carmine","category": "neopuc", "priority": 3, "scale":28500,"bio":"Always smiling, but the smile hides a cruel personality. Never truly as happy as when he is tormenting those smaller than himself.","species":"otter","brutality":"3","victimsMilitary":true,"victimsMacros":true,"oralVore":true,"analVore":true,"footWear":true,"footShoeEnabled":true,"footShoe":"boot","arousalEnabled":true,"hasTail":true,"tailType":"rudder","baseTailLength":2.2,"maleParts":true,"cockVoreEnabled":true,"hasSheath":true,"sheathAbsorptionEnabled":true}, - {"version":3,"name":"Jennifer","category": "neopuc", "priority": 3, "scale":24.5,"bio":"Assertive in all things. She goes out and takes the things she likes, especially when they are people. Only feels the need to have a small select group of friends. Can be fairly uncaring towards the fate of little folk even though she does think they are cute.","species":"rat ifrit","footType":"foot","arousalEnabled":true,"hasTail":true,"tailType":"skinny","baseTailLength":2,"femaleParts":true,"unbirthEnabled":true,"hasBreasts":true,"magicEnabled":true}, - {"version":3,"name":"Porter","category": "neopuc", "priority": 2, "scale":1.58,"bio":"Devilishly charismatic, but secretly holds most people in contempt. Wildly in love Holly. Dominant Personality.","species":"Bernese mountain dog","brutality":"2","victimsMicros":true,"oralVore":true,"oralDigestManual":true,"arousalEnabled":true,"hasTail":true,"maleParts":true,"baseDickLength":0.35,"cockVoreEnabled":true,"cockDigestManual":true,"hasSheath":true,"sheathAbsorptionEnabled":true,"sexualMagicEnabled":true,"magicEnabled":true}, - {"version":3,"name":"Rat jeice","baseHeight":2,"baseMass":200,"basePawLength":0.5,"basePawWidth":0.27,"baseHandLength":0.19,"baseHandWidth":0.29,"baseAssArea":0.5,"species":"Rat","biomes":true,"changingBiomes":true,"brutality":"0","victimsHuman":true,"victimsMacros":true,"oralVore":true,"oralDigestAuto":false,"oralDigestTime":0,"oralDigestManual":true,"analVore":true,"baseAnalVoreDiameter":0.23,"analDigestAuto":false,"analDigestTime":0,"analDigestManual":true,"hasTail":true,"tailType":"sinewy hungry","baseTailLength":1.5,"baseTailDiameter":0.1,"tailMaw":true,"tailStretchiness":2,"tailDigestAuto":false,"tailDigestManual":true,"maleParts":true,"baseDickLength":0.4,"baseDickDiameter":0.2,"dickType":"meaty","baseBallDiameter":0.1,"baseCumVolume":0.004,"baseCumProduction":0.004,"cumStorageScale":10,"cockVoreEnabled":true,"dickStretchiness":4,"baseCumDigestFactor":0,"cockDigestAuto":false,"cockDigestTime":0,"cockDigestManual":true,"sheathAbsorptionEnabled":true,"hasForeskin":true,"gasEnabled":true,"belchEnabled":true,"fartEnabled":true,"gasStorageScale":7,"baseGasDigestFactor":7,"gasScaleWithSize":true,"gooEnabled":true,"gooDigestion":true,"gooGrowthFactor":0.3,"gooDigestAuto":false,"gooDigestTime":0,"gooDigestManual":true} -] \ No newline at end of file +]; diff --git a/recursive-desc.js b/recursive-desc.js index 2291c68..89d502c 100644 --- a/recursive-desc.js +++ b/recursive-desc.js @@ -1,4 +1,4 @@ -'use strict'; +"use strict"; /*jshint browser: true*/ @@ -12,9 +12,18 @@ const synonyms = { gulp: ["gulp", "gluk", "glrk", "glp"], swallow: ["swallow", "gulp"], looming: ["looming", "imposing", "awe-inspiring", "menacing"], - putrid: ["putrid", "foul", "wretched", "choking", "rancid", "utterly foul", "miasma-shrouded", "eye-wateringly foul"], - moan: ["moan", "gasp", "growl"] -} + putrid: [ + "putrid", + "foul", + "wretched", + "choking", + "rancid", + "utterly foul", + "miasma-shrouded", + "eye-wateringly foul", + ], + moan: ["moan", "gasp", "growl"], +}; function plural(quantity, singular, plural) { return quantity > 1 ? plural : singular; @@ -32,9 +41,191 @@ function getDefaultVictim(name) { return defaults[name]; } -var action_keys = ["eat", "chew", "vomit", "hand-crush", "foot-crush", "stomp", "stomp-wedge", "flex-toes", "kick", "anal-vore", "ass-crush", "ass-grind", "tail-slap", "tail-vore", "tails-vore", "cleavage-stuff", "cleavage-crush", "cleavage-drop", "cleavage-absorb", "breast-crush", "breast-vore", "breast-milk", "unbirth", "sheath-stuff", "sheath-clench", "sheath-crush", "sheath-absorb", "foreskin-stuff", "foreskin-clench", "foreskin-crush", "foreskin-absorb", "cock-vore", "cockslap", "ball-smother", "male-spurt", "male-orgasm", "female-spurt", "female-orgasm", "grind", "pouch-stuff", "pouch-rub", "pouch-eat", "pouch-absorb", "soul-vore", "soul-absorb-paw", "paw-stench", "ass-stench", "piss-stench", "scat-stench", "male-musk", "female-musk", "male-orgasm-musk", "female-orgasm-musk", "male-spurt-musk", "female-spurt-musk", "belch", "fart", "stomach", "tail", "tail-to-stomach", "womb", "balls", "bowels", "bowels-to-stomach", "breasts", "bladder", "soul-digest", "wings", "wings-to-stomach", "wear-shoe", "remove-shoe", "wear-sock", "remove-sock", "stuff-shoe", "dump-shoe", "stuff-sock", "dump-sock", "piss", "bladder-vore", "scat", "sheath-toy", "foreskin-toy", "slit-toy", "breast-toy", "melt", "solidify", "flood", "stomp-goo", "goo-digest", "ass-goo", "goo-stomach-pull", "goo-stomach-push", "goo-bowels-pull", "goo-bowels-push", "goo-womb-pull", "goo-womb-push", "goo-balls-pull", "goo-balls-push", "goo-breasts-pull", "goo-breasts-push", "goo-tail-pull", "goo-tail-push", "goo-paws-pull", "goo-paws-push", "paw-vore", "paw-vore-toes", "paws", "crop-swallow", "crop-transfer", "breath-fire", "breath-ice", "breath-electric", "breath-smoke", "breath-radiation", "breath-foul", "drool", "magic-shrink", "magic-hypnotize", "wings-flap", "wings-vore"]; - -var victim_keys = ["victim-cum-flood", "victim-femcum-flood", "victim-crushed-hand", "victim-crushed-foot", "victim-stomped", "victim-flex-toes", "victim-eaten", "victim-ass-crush", "victim-ass-ground", "victim-humped", "victim-vomit", "victim-chew", "victim-drool", "victim-anal-vore", "victim-tail-slap", "victim-tail-vore", "victim-cock-slap", "victim-cock-vore", "victim-ball-smother", "victim-sheath-crush", "victim-sheath-absorb", "victim-foreskin-crush", "victim-foreskin-absorb", "victim-cum-flood", "victim-male-musk", "victim-male-spurt-musk", "victim-male-orgasm-musk", "victim-unbirth", "victim-femcum-flood", "victim-female-musk", "victim-female-spurt-musk", "victim-female-orgasm-musk", "victim-breast-crush", "victim-cleavage-crush", "victim-cleavage-absorb", "victim-cleavage-drop", "victim-milk-flood", "victim-breast-vore", "victim-pouch-absorb", "victim-soul-digest", "victim-soul-paw", "victim-paw-stench", "victim-ass-stench", "victim-gas-belch", "victim-gas-fart", "victim-piss", "victim-bladder-vore", "victim-piss-stench", "victim-scat", "victim-scat-stench", "victim-goo", "victim-paw-vore", "victim-breath-fire", "victim-breath-ice", "victim-breath-electric", "victim-breath-smoke", "victim-breath-radiation", "victim-breath-foul", "victim-wings-flap", "victim-wings-vore"] +var action_keys = [ + "eat", + "chew", + "vomit", + "hand-crush", + "foot-crush", + "stomp", + "stomp-wedge", + "flex-toes", + "kick", + "anal-vore", + "ass-crush", + "ass-grind", + "tail-slap", + "tail-vore", + "tails-vore", + "cleavage-stuff", + "cleavage-crush", + "cleavage-drop", + "cleavage-absorb", + "breast-crush", + "breast-vore", + "breast-milk", + "unbirth", + "sheath-stuff", + "sheath-clench", + "sheath-crush", + "sheath-absorb", + "foreskin-stuff", + "foreskin-clench", + "foreskin-crush", + "foreskin-absorb", + "cock-vore", + "cockslap", + "ball-smother", + "male-spurt", + "male-orgasm", + "female-spurt", + "female-orgasm", + "grind", + "pouch-stuff", + "pouch-rub", + "pouch-eat", + "pouch-absorb", + "soul-vore", + "soul-absorb-paw", + "paw-stench", + "ass-stench", + "piss-stench", + "scat-stench", + "male-musk", + "female-musk", + "male-orgasm-musk", + "female-orgasm-musk", + "male-spurt-musk", + "female-spurt-musk", + "belch", + "fart", + "stomach", + "tail", + "tail-to-stomach", + "womb", + "balls", + "bowels", + "bowels-to-stomach", + "breasts", + "bladder", + "soul-digest", + "wings", + "wings-to-stomach", + "wear-shoe", + "remove-shoe", + "wear-sock", + "remove-sock", + "stuff-shoe", + "dump-shoe", + "stuff-sock", + "dump-sock", + "piss", + "bladder-vore", + "scat", + "sheath-toy", + "foreskin-toy", + "slit-toy", + "breast-toy", + "melt", + "solidify", + "flood", + "stomp-goo", + "goo-digest", + "ass-goo", + "goo-stomach-pull", + "goo-stomach-push", + "goo-bowels-pull", + "goo-bowels-push", + "goo-womb-pull", + "goo-womb-push", + "goo-balls-pull", + "goo-balls-push", + "goo-breasts-pull", + "goo-breasts-push", + "goo-tail-pull", + "goo-tail-push", + "goo-paws-pull", + "goo-paws-push", + "paw-vore", + "paw-vore-toes", + "paws", + "crop-swallow", + "crop-transfer", + "breath-fire", + "breath-ice", + "breath-electric", + "breath-smoke", + "breath-radiation", + "breath-foul", + "drool", + "magic-shrink", + "magic-hypnotize", + "wings-flap", + "wings-vore", +]; + +var victim_keys = [ + "victim-cum-flood", + "victim-femcum-flood", + "victim-crushed-hand", + "victim-crushed-foot", + "victim-stomped", + "victim-flex-toes", + "victim-eaten", + "victim-ass-crush", + "victim-ass-ground", + "victim-humped", + "victim-vomit", + "victim-chew", + "victim-drool", + "victim-anal-vore", + "victim-tail-slap", + "victim-tail-vore", + "victim-cock-slap", + "victim-cock-vore", + "victim-ball-smother", + "victim-sheath-crush", + "victim-sheath-absorb", + "victim-foreskin-crush", + "victim-foreskin-absorb", + "victim-cum-flood", + "victim-male-musk", + "victim-male-spurt-musk", + "victim-male-orgasm-musk", + "victim-unbirth", + "victim-femcum-flood", + "victim-female-musk", + "victim-female-spurt-musk", + "victim-female-orgasm-musk", + "victim-breast-crush", + "victim-cleavage-crush", + "victim-cleavage-absorb", + "victim-cleavage-drop", + "victim-milk-flood", + "victim-breast-vore", + "victim-pouch-absorb", + "victim-soul-digest", + "victim-soul-paw", + "victim-paw-stench", + "victim-ass-stench", + "victim-gas-belch", + "victim-gas-fart", + "victim-piss", + "victim-bladder-vore", + "victim-piss-stench", + "victim-scat", + "victim-scat-stench", + "victim-goo", + "victim-paw-vore", + "victim-breath-fire", + "victim-breath-ice", + "victim-breath-electric", + "victim-breath-smoke", + "victim-breath-radiation", + "victim-breath-foul", + "victim-wings-flap", + "victim-wings-vore", +]; for (let i = 0; i < action_keys.length; i++) { rules[action_keys[i]] = []; @@ -58,8 +249,7 @@ function isSadistic(macro) { function hasNothing(container, thing, amount) { for (var key in container.contents) { - if (container.contents.hasOwnProperty(key)) - return false; + if (container.contents.hasOwnProperty(key)) return false; } return true; @@ -67,33 +257,36 @@ function hasNothing(container, thing, amount) { function hasLessThan(container, thing, amount) { if (container.contents.hasOwnProperty(thing)) - if (container.contents[thing].count < amount && container.contents[thing].count > 0) + if ( + container.contents[thing].count < amount && + container.contents[thing].count > 0 + ) return true; 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. +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; + if (container.contents[thing].count >= amount) return true; return false; } function hasExactly(container, thing, amount) { - if (!container.contents.hasOwnProperty(thing) && amount == 0) - return true; - if (container.contents.hasOwnProperty(thing) && container.contents[thing].count == 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 hasOnly(container, things) { - if (!hasNothingElse(container, things)) - return false; + if (!hasNothingElse(container, things)) return false; for (var i = 0; i < things.length; i++) { - if (!container.contents.hasOwnProperty(things[i])) - return false; + if (!container.contents.hasOwnProperty(things[i])) return false; } return true; @@ -102,8 +295,7 @@ function hasOnly(container, things) { function hasNothingElse(container, things) { for (var key in container.contents) { if (container.contents.hasOwnProperty(key)) - if (!things.includes(key)) - return false; + if (!things.includes(key)) return false; } return true; @@ -112,13 +304,19 @@ function hasNothingElse(container, things) { function nothingLarger(container, thing) { for (var key in container.contents) if (container.contents.hasOwnProperty(key)) - if (things[key].area > things[thing].area) - return false; + if (things[key].area > things[thing].area) return false; return true; } -function describe(action, container, macro, verbose = true, flat = false, extra1 = 0) { +function describe( + action, + container, + macro, + verbose = true, + flat = false, + extra1 = 0 +) { var options = []; for (var i = 0; i < rules[action].length; i++) { @@ -131,11 +329,10 @@ function describe(action, container, macro, verbose = true, flat = false, extra1 container = flatten(container); } - if (options.length > 0 && Math.random() > (1 / (2 + options.length))) { + if (options.length > 0 && Math.random() > 1 / (2 + options.length)) { let choice = Math.floor(Math.random() * options.length); return options[choice](container, macro, verbose, flat, extra1); - } - else { + } else { return getDefault(action)(container, macro, verbose, flat, extra1); } } @@ -154,4162 +351,6939 @@ function pickStringChance(chance, ...array) { if (Math.random() < chance) { return pickString(...array); } else { - return "" + return ""; } } // DEFAULTS { -defaults["eat"] = function (container, macro, verbose, flat) { - console.log(verbose); - if (container.count == 0) - return "You reach down for a delicious treat and grab - oh, nothing."; - else - return pickString([ - "You", - pickString("snatch up", "grab", "pluck up", "seize", "catch"), - container.describe(verbose) + ",", - "then", - pickString("swallow", "devour", "consume"), - (container.count > 1 ? "them" : "it"), - "whole." - ], [ - "Your maw envelops", - container.describe(verbose), - "in a tight embrace of flesh.", - (container.count > 1 ? "They sink" : "Your victim sinks"), - "down deep with a little gulp." - ]).join(" "); -} - -defaults["chew"] = function (container, macro, verbose, flat) { - let pronoun = (container.count > 1 ? "them" : "it"); - if (container.count == 0) - return "You reach down for a delicious treat and grab - oh, nothing."; - else if (isSadistic(macro)) - return "Your greedy fingers gather up " + container.describe(verbose) + ", stuffing " + pronoun + " into your " + macro.jawDesc(true) + ". A slow, lazy bite " + macro.biteDesc(true) + " " + pronoun + ", rending flesh, snapping bone, and crushing everything between your savage " + macro.jawDesc(true) + ". You tip back your head and swallow...consigning the gory remains to your roiling gut."; - else if (isNonFatal(macro)) - return defaultEat(container, macro, verbose, flat); - else { - return "You scoop up " + container.describe(verbose) + " and " + macro.biteDesc() + " " + pronoun + " with your " + macro.jawDesc(true) + ", then swallow them down."; - } -} - -defaults["vomit"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You retch, but nothing happens."; - } else if (isSadistic(macro)) { - return "You gag and lean over, vomiting up " + container.describeSimple(flat) + ". A thick, hissing slurry of molten meat and acid drenches your still-writhing prey, searing flesh and ensuring their wretched, rancid deaths."; - } else if (isGory(macro)) { - return "You retch and vomit up " + container.describeSimple(flat) + ", spewing them out amidst a thick slurry of chyme and leaving them to melt."; - } else if (isFatal(macro)) { - return "You vomit up " + container.describeSimple(flat) + ", leaving them to stew in your stomach juices."; - } else { - return "You hack up " + container.describeSimple(flat) + "."; - } -} - -defaults["hand-crush"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) { - return [ - "You grab", - container.describe(false), - "and, with a sharp squeeze, crush", - (container.count > 1 ? "them" : "it") + "." - ].join(" "); - } else { - return [ - "You grab", - container.describe(false), - "and, after giving", - (container.count > 1 ? "them" : "it"), - "a playful squeeze, set", - (container.count > 1 ? "them" : "it"), - "back down." - ].join(" "); - } -} - -defaults["foot-crush"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) { - return [ - "Your", - macro.footDesc(false), - "snatches up", - container.describe(false) + ";", - "you crush it", - (container.count > 1 ? "them" : "it"), - "in your", - macro.toeDesc(true), - "with ease." - ].join(" "); - } else { + defaults["eat"] = function (container, macro, verbose, flat) { + console.log(verbose); + if (container.count == 0) + return "You reach down for a delicious treat and grab - oh, nothing."; + else + return pickString( + [ + "You", + pickString("snatch up", "grab", "pluck up", "seize", "catch"), + container.describe(verbose) + ",", + "then", + pickString("swallow", "devour", "consume"), + container.count > 1 ? "them" : "it", + "whole.", + ], + [ + "Your maw envelops", + container.describe(verbose), + "in a tight embrace of flesh.", + container.count > 1 ? "They sink" : "Your victim sinks", + "down deep with a little gulp.", + ] + ).join(" "); + }; + + defaults["chew"] = function (container, macro, verbose, flat) { + let pronoun = container.count > 1 ? "them" : "it"; + if (container.count == 0) + return "You reach down for a delicious treat and grab - oh, nothing."; + else if (isSadistic(macro)) + return ( + "Your greedy fingers gather up " + + container.describe(verbose) + + ", stuffing " + + pronoun + + " into your " + + macro.jawDesc(true) + + ". A slow, lazy bite " + + macro.biteDesc(true) + + " " + + pronoun + + ", rending flesh, snapping bone, and crushing everything between your savage " + + macro.jawDesc(true) + + ". You tip back your head and swallow...consigning the gory remains to your roiling gut." + ); + else if (isNonFatal(macro)) + return defaultEat(container, macro, verbose, flat); + else { + return ( + "You scoop up " + + container.describe(verbose) + + " and " + + macro.biteDesc() + + " " + + pronoun + + " with your " + + macro.jawDesc(true) + + ", then swallow them down." + ); + } + }; + + defaults["vomit"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You retch, but nothing happens."; + } else if (isSadistic(macro)) { + return ( + "You gag and lean over, vomiting up " + + container.describeSimple(flat) + + ". A thick, hissing slurry of molten meat and acid drenches your still-writhing prey, searing flesh and ensuring their wretched, rancid deaths." + ); + } else if (isGory(macro)) { + return ( + "You retch and vomit up " + + container.describeSimple(flat) + + ", spewing them out amidst a thick slurry of chyme and leaving them to melt." + ); + } else if (isFatal(macro)) { + return ( + "You vomit up " + + container.describeSimple(flat) + + ", leaving them to stew in your stomach juices." + ); + } else { + return "You hack up " + container.describeSimple(flat) + "."; + } + }; + + defaults["hand-crush"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) { + return [ + "You grab", + container.describe(false), + "and, with a sharp squeeze, crush", + (container.count > 1 ? "them" : "it") + ".", + ].join(" "); + } else { + return [ + "You grab", + container.describe(false), + "and, after giving", + container.count > 1 ? "them" : "it", + "a playful squeeze, set", + container.count > 1 ? "them" : "it", + "back down.", + ].join(" "); + } + }; + + defaults["foot-crush"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) { + return [ + "Your", + macro.footDesc(false), + "snatches up", + container.describe(false) + ";", + "you crush it", + container.count > 1 ? "them" : "it", + "in your", + macro.toeDesc(true), + "with ease.", + ].join(" "); + } else { + return [ + "Your", + macro.footDesc(false), + "snatches up", + container.describe(false) + ".", + "You give", + container.count > 1 ? "them" : "it", + "a friendly squeeze before dropping", + container.count > 1 ? "them" : "it", + "from your", + macro.toeDesc(true) + ".", + ].join(" "); + } + }; + + defaults["stomp"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your " + macro.footDesc() + " thumps the ground."; + else if (isSadistic(macro)) + return ( + "Your " + + macro.footDesc(false) + + " comes down on " + + container.describe(verbose) + + ", crushing your prey into gore and rubble with ease as your " + + macro.toeDesc(true) + + " shear bone and snap metal." + ); + else if (isFatal(macro)) + return pickString( + [ + "You", + pickString("crush", "smash", "flatten"), + container.describe(verbose), + pickString("under", "beneath", "with"), + "your", + macro.stenchEnabled ? pickString(...synonyms.putrid) + "," : "", + pickStringChance(0.4, ...synonyms.looming), + macro.footDesc(false, false, true) + ".", + ], + [ + capitalize(container.describe(verbose)), + container.count > 1 ? "are" : "is", + pickString("crushed", "flattened"), + pickString("under", "beneath"), + "your", + macro.stenchEnabled + ? pickString(...synonyms.putrid) + : pickString("heavy", "weighty", "powerful"), + macro.footDesc(false, false, true) + ".", + ], + [ + "A swift stroke of your", + macro.footDesc(false, false, true), + pickString("crushes", "smashes", "flattens"), + container.describe(verbose), + ] + ) + .filter(Boolean) + .join(" "); + else return "You step on " + container.describe(verbose) + "."; + }; + + defaults["stomp-wedge"] = function (container, macro, verbose, flat) { return [ - "Your", - macro.footDesc(false), - "snatches up", - container.describe(false) + ".", - "You give", - (container.count > 1 ? "them" : "it"), - "a friendly squeeze before dropping", - (container.count > 1 ? "them" : "it"), - "from your", - macro.toeDesc(true) + "." - ].join(" "); - } - -} - -defaults["stomp"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your " + macro.footDesc() + " thumps the ground."; - else if (isSadistic(macro)) - return "Your " + macro.footDesc(false) + " comes down on " + container.describe(verbose) + ", crushing your prey into gore and rubble with ease as your " + macro.toeDesc(true) + " shear bone and snap metal."; - else if (isFatal(macro)) - return pickString([ - "You", - pickString("crush", "smash", "flatten"), - container.describe(verbose), - pickString("under", "beneath", "with"), - "your", - (macro.stenchEnabled ? pickString(...synonyms.putrid) + "," : ""), - pickStringChance(0.4, ...synonyms.looming), - macro.footDesc(false, false, true) + "." - ], [ capitalize(container.describe(verbose)), - (container.count > 1 ? "are" : "is"), - pickString("crushed", "flattened"), - pickString("under", "beneath"), + container.count > 1 ? "are" : "is", + pickString("wedged", "trapped", "left stuck", "jammed"), + pickString("in", "between", "within"), "your", - (macro.stenchEnabled ? pickString(...synonyms.putrid) : pickString("heavy", "weighty", "powerful")), - macro.footDesc(false, false, true) + "." - ], [ - "A swift stroke of your", - macro.footDesc(false, false, true), - pickString("crushes", "smashes", "flattens"), - container.describe(verbose) - ]).filter(Boolean).join(" "); - else - return "You step on " + container.describe(verbose) + "."; -} - -defaults["stomp-wedge"] = function (container, macro, verbose, flat) { - return [ - capitalize(container.describe(verbose)), - (container.count > 1 ? "are" : "is"), - pickString("wedged", "trapped", "left stuck", "jammed"), - pickString("in", "between", "within"), - "your", - (macro.stenchEnabled ? pickString(...synonyms.putrid) : ""), - macro.toeDesc(true) - ].filter(Boolean).join(" ") -} - -defaults["flex-toes"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - if (macro.footShoeWorn) { - return "You flex your " + macro.toeNoShoeDesc(true) + " inside your " + macro.footDesc(true) + "."; + macro.stenchEnabled ? pickString(...synonyms.putrid) : "", + macro.toeDesc(true), + ] + .filter(Boolean) + .join(" "); + }; + + defaults["flex-toes"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + if (macro.footShoeWorn) { + return ( + "You flex your " + + macro.toeNoShoeDesc(true) + + " inside your " + + macro.footDesc(true) + + "." + ); + } else { + return "You flex your " + macro.toeDesc(true) + "."; + } } else { - return "You flex your " + macro.toeDesc(true) + "."; + if (macro.footShoeWorn || macro.footSockWorn) { + if (macro.brutality == 0) { + return ( + "You clench your " + + macro.toeNoShoeDesc(true) + + ", grinding them against the " + + container.describeSimple(flat) + + " trapped between your " + + macro.footDesc(true) + + " and your " + + macro.toeOnlyDesc(true) + + "." + ); + } else { + return ( + "You clench your " + + macro.toeNoShoeDesc(true) + + ", crushing " + + container.describeSimple(flat) + + " between your " + + macro.footDesc(true) + + " and your " + + macro.toeOnlyDesc(true) + + "." + ); + } + } else { + if (macro.brutality == 0) { + return ( + "You flex your " + + macro.toeNoShoeDesc(true) + + ", causing " + + container.describeSimple(flat) + + " to tumble out and fall to the ground." + ); + } else { + return ( + "You flex and squeeze your " + + macro.toeNoShoeDesc(true) + + ", crushing " + + container.describeSimple(flat) + + " between them." + ); + } + } } - } else { - if (macro.footShoeWorn || macro.footSockWorn) { - if (macro.brutality == 0) { - return "You clench your " + macro.toeNoShoeDesc(true) + ", grinding them against the " + container.describeSimple(flat) + " trapped between your " + macro.footDesc(true) + " and your " + macro.toeOnlyDesc(true) + "."; + }; + + defaults["kick"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You swing your mighty " + macro.footDesc() + "..and hit nothing."; + else + return ( + "You punt " + + container.describe(verbose) + + ", destroying " + + (container.count > 1 ? "them" : "it") + + "." + ); + }; + + defaults["anal-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You're pretty sure you just sat on a rock."; + else + return pickString( + [ + "You sit yourself down on", + container.describe(false) + ". ", + container.count > 1 ? "They slide" : "It slides", + "inside with ease.", + ], + [ + "You grab", + container.describe(false) + ",", + "shoving", + container.count > 1 ? "your victims" : "your victim", + "right up your rear with a muffled shlrkh.", + ] + ).join(" "); + }; + + defaults["ass-crush"] = function (container, macro, verbose, flat) { + let count = get_living_prey(container.sum()); + if (container.count == 0) + return "You take a seat. It's good to have a break!"; + else if (isSadistic(macro)) + return ( + "You lower your heavy ass to the ground, biting your lip as you feel " + + container.describe(verbose) + + " collapse beneath your massive cheeks. " + + (count > 1 ? count + " lives are" : "A life is") + + " snuffed out as you settle down, grinding your ass into the remains before slowly rising back up." + ); + else if (isFatal(macro)) + return "Your heavy ass obliterates " + container.describe(verbose) + ". "; + else return "You sit on " + container.describe(verbose); + }; + + defaults["ass-grind"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You rub your ass on a wall."; + } else { + return ( + "You grind your ass against " + + container.describe(verbose) + + ", flattening " + + (container.count == 1 ? "it" : "them") + + " under your weight." + ); + } + }; + + defaults["tail-slap"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "Your " + + (macro.tailCount > 1 ? "tails swing" : "tail swings") + + " to and fro" + ); + else if (isFatal(macro)) + return ( + "Your " + + macro.describeTail + + (macro.tailCount > 1 ? " tails swing" : " tail swings") + + " into " + + container.describe(verbose) + + ", smashing everything in " + + (macro.tailCount > 1 ? "their" : "its") + + " path." + ); + else + return ( + "Your " + + macro.describeTail + + (macro.tailCount > 1 ? " tails slap" : " tail slaps") + + " against " + + container.describe(verbose) + + ", bowling them over." + ); + }; + + defaults["tail-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your drooling tail lashes about, but can't seem to chow down on anyone..."; + else if (isFatal(macro)) + return ( + "Your tail lunges, maw agape, at " + + container.describe(verbose) + + ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy confines." + ); + else + return ( + "Your tail lunges, maw agape, at " + + container.describe(verbose) + + ". It scarfs down everything in a second, gulping forcefully and pulling your prey inside." + ); + }; + + defaults["tails-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "Your drooling tails swing to and fro"; + else if (isFatal(macro)) + return ( + "Your $COUNT tails lunge, maws agape, at " + + container.describe(verbose) + + ". They scarf down everything in seconds, gulping forcefully to drag your prey into your sloppy confines." + ); + else + return ( + "Your $COUNT tails lunge, maws agape, at " + + container.describe(verbose) + + ". They scarf down your prey, gulping forcefully and pulling them deep inside." + ); + }; + + defaults["cleavage-stuff"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You can't fit anything into your cleavage right now."; + else + return ( + "You snatch up " + + container.describe(verbose) + + " and stuff " + + (container.count > 1 ? "them" : "it") + + " into your cleavage." + ); + }; + + defaults["cleavage-crush"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You grasp your breasts and forcefully squeeze them together."; + else if (isSadistic(macro)) + return ( + "You grasp your breasts and slowly bring them together, steadily crushing the life from " + + container.describeSimple(flat) + + " trapped in between - savoring every last pop and crunch as you exterminate your prey." + ); + else if (isGory(macro)) + return ( + "You grasp your breasts and forcefully shove them together, crushing the life from " + + container.describeSimple(flat) + + "." + ); + else if (isFatal(macro)) + return ( + "You grasp your breasts and forcefully shove them together, crushing " + + container.describeSimple(flat) + + "." + ); + else + return ( + "You grasp your breasts and squish them together, smooshing " + + container.describeSimple(flat) + + "." + ); + }; + + defaults["cleavage-drop"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You pull your breasts apart and give them a shake."; + if (isFatal(macro)) + return ( + "You pull your breasts apart far enough for the " + + container.describeSimple(flat) + + " trapped within to fall out, tumbling to the ground and smashing to bits." + ); + else + return ( + "You pull your breasts apart far enough for the " + + container.describeSimple(flat) + + " trapped within to fall out." + ); + }; + + defaults["cleavage-absorb"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return defaultCleavageCrush(container, macro, verbose, flat); + else + return ( + "Your squeeze your breasts together, swiftly absorbing " + + container.describeSimple(flat) + + " into your chest." + ); + }; + + defaults["breast-crush"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your let your breasts thump against the ground."; + else if (isFatal(macro)) + return [ + "You let your breasts drop,", + pickString("crushing", "smashing", "burying", "smothering"), + container.describe(verbose), + "beneath those", + length(macro.breastDiameter, unit, true) + "-wide", + pickString("knockers", "tits", "boobs") + ".", + pickStringChance( + 0.5, + macro.lactationEnabled + ? "A spray of milk spurts from your nipples." + : "" + ), + ] + .filter(Boolean) + .join(" "); + else + return ( + "You smoosh " + container.describe(verbose) + " beneath your breasts." + ); + }; + + defaults["breast-vore"] = function (container, macro, verbose, flat) { + let prey = new Container(); + macro.breasts.contents.forEach(function (x) { + prey = prey.merge(x); + }); + + if (container.count == 0) + return "It'd be pretty hot to stick someone in your breasts. Shame you can't right now."; + else + return pickString( + [ + "Your breasts squish against", + container.describe(verbose), + "as", + container.count > 1 ? "they're" : "it's", + "forced right into your nipples! They stretch and", + pickString("envelop", "consume", "suck in"), + "your prey,", + pickStringChance(0.5, "swiftly", "easily"), + "burying them in those warm,", + macro.lactationEnabled ? "milky" : "heavy", + "mounds.", + ], + [ + capitalize(container.describe(verbose)), + container.count > 1 ? "are" : "is", + pickStringChance(0.35, "abruptly", "swiftly"), + pickString("stuffed", "slipped"), + "into your breasts", + container.count > 1 ? "their" : "its", + "form lost within your bosom.", + prey.count > 0 + ? (prey.count > 1 + ? "The " + prey.describe(false) + : capitalize(prey.describe(true))) + + " within " + + (prey.count > 1 ? "slosh" : "sloshes") + + " about as " + + (prey.count > 1 ? "they're" : "it's") + + " joined by fresh prey." + : "", + ] + ) + .filter(Boolean) + .join(" "); + }; + + defaults["breast-milk"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that splatters on the ground."; + else if (isFatal(macro)) + return ( + "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + + container.describe(verbose) + + " in an unstoppable wave of white." + ); + else + return ( + "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + + container.describe(verbose) + + "." + ); + }; + + defaults["unbirth"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "You grab " + + (macro.victimsHuman + ? new Human(1).describe(verbose) + : new Person(1).describe(verbose)) + + " and grind them against your slit...but they won't fit." + ); + else { + return pickString( + [ + "You", + pickString(...synonyms.moan), + "as", + container.describe(verbose), + container.count > 1 ? "spread" : "spreads", + "open your", + pickString("sex", macro.describeVagina + " slit") + ",", + pickString("swallowed", "sucked", "drawn"), + pickString("within", "inside", "down deep"), + "by", + pickString("tender", "sensuous", "lustful"), + pickString("folds", "muscle") + ".", + ], + [ + capitalize(container.describe(verbose)), + "fall prey to your", + pickString("sex", macro.describeVagina + " slit"), + "with a messy", + pickString("SQUELCH,", "SQUISH,"), + "vanishing into your womb and sending a", + pickString("jolt", "surge", "shock"), + "of ecstasy up your spine.", + ] + ) + .filter(Boolean) + .join(" "); + } + }; + + defaults["sheath-stuff"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "You grab a " + + (macro.victimsHuman + ? new Human(1).describe(verbose) + : new Person(1).describe(verbose)) + + " and grind them against your sheath-slit...but they won't fit." + ); + else + return ( + "You pluck " + + container.describe(verbose) + + " from the ground and slip them into your musky sheath." + ); + }; + + defaults["foreskin-stuff"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "You grab a " + + (macro.victimsHuman + ? new Human(1).describe(verbose) + : new Person(1).describe(verbose)) + + " and grind them against your foreskin...but they won't fit." + ); + else + return ( + "You pluck " + + container.describe(verbose) + + " from the ground and slip them into your musky foreskin." + ); + }; + + defaults["breast-toy"] = function (container, macro, verbose, flat) { + if (container.count > 0) { + return ( + "You smush your breasts together, squeezing " + + container.describeSimple(flat) + + " between the heavy mounds." + ); + } else { + return "You smush your breasts together."; + } + }; + + defaults["slit-toy"] = function (container, macro, verbose, flat) { + if (container.count > 0) { + return ( + "You slip your fingers into your snatch, teasing yourself and pushing the " + + container.describeSimple(flat) + + " within a little deeper." + ); + } else { + return "Your slp your fingers into your snatch and tease yourself."; + } + }; + + defaults["sheath-toy"] = function (container, macro, verbose, flat) { + if (container.count > 0) { + if (macro.orgasm) { + return "You stroke your spurting cock, then reach down to give your sheath a firm squeeze. Anything within has been ground away to nothingness by the force of your orgasm."; + } else if (macro.arousal < 25) { + return ( + "You grip your soft sheath and give it a squeeze, feeling " + + container.describeSimple(flat) + + " within rub against your " + + macro.describeDick + + "." + ); + } else if (macro.arousal < 75) { + return ( + "You grip your swelling sheath and squeeze, feeling " + + container.describeSimple(flat) + + " within grind against your " + + macro.describeDick + + "." + ); + } else if (macro.arousal < 150) { + return ( + "You run your fingers down your " + + macro.describeDick + + " and grip your sheath, squeezing it to feel " + + container.describeSimple(flat) + + " being smothered against the musky walls by your throbbing cock." + ); } else { - return "You clench your " + macro.toeNoShoeDesc(true) + ", crushing " + container.describeSimple(flat) + " between your " + macro.footDesc(true) + " and your " + macro.toeOnlyDesc(true) + "."; + return ( + "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + + container.describeSimple(flat) + + " within rub against your " + + macro.describeDick + + "." + ); } } else { - if (macro.brutality == 0) { - return "You flex your " + macro.toeNoShoeDesc(true) + ", causing " + container.describeSimple(flat) + " to tumble out and fall to the ground."; + if (macro.orgasm) { + return "You stroke your spurting cock, then reach down to give your sheath a firm squeeze. Anything within has been ground away to nothingness by the force of your orgasm."; + } else if (macro.arousal < 25) { + return "You grip your soft sheath and give it a squeeze."; + } else if (macro.arousal < 75) { + return "You grip your swelling sheath and squeeze."; + } else if (macro.arousal < 150) { + return ( + "You run your fingers down your " + + macro.describeDick + + " and grip your sheath, squeezing it gently." + ); } else { - return "You flex and squeeze your " + macro.toeNoShoeDesc(true) + ", crushing " + container.describeSimple(flat) + " between them."; + return "Trembling with your impending orgasm, your fingers play over your sheath."; } } - } -} - -defaults["kick"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You swing your mighty " + macro.footDesc() + "..and hit nothing."; - else - return "You punt " + container.describe(verbose) + ", destroying " + (container.count > 1 ? "them" : "it") + "."; -} - -defaults["anal-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You're pretty sure you just sat on a rock."; - else - return pickString([ - "You sit yourself down on", - container.describe(false) + ". ", - (container.count > 1 ? "They slide" : "It slides"), - "inside with ease." - ], [ - "You grab", - container.describe(false) + ",", - "shoving", - (container.count > 1 ? "your victims" : "your victim"), - "right up your rear with a muffled shlrkh." - ] - ).join(" "); - -} + }; + + defaults["sheath-clench"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "You squeeze your sheath."; + else if (isGory(macro)) + return ( + "You squeeze your packed sheath, reducing " + + container.describeSimple(flat) + + " to a gory paste that slickens your throbbing shaft." + ); + else if (isFatal(macro)) + return ( + "Your fingers run over your packed sheath, squeezing on the " + + macro.describeDick + + " within and smashing " + + container.describeSimple(flat) + ); + else + return ( + "Your squeeze your sheath, pushing " + + container.describeSimple(flat) + + " out of your sheath." + ); + }; + + defaults["sheath-crush"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "Your orgasm causes your " + macro.describeDick + " to swell and surge." + ); + else if (isGory(macro)) + return ( + "Your powerful orgasm causes your throbbing " + + macro.describeDick + + " to swell and crush the life from everything in your sheath, reducing " + + container.describeSimple(flat) + + " to a gory paste that slickens your spurting shaft." + ); + else if (isFatal(macro)) + return ( + "Your orgasm causes your " + + macro.describeDick + + " to throb and swell, smashing " + + container.describeSimple(flat) + + " trapped in your musky sheath." + ); + else + return ( + "Your orgasm causes your " + + macro.describeDick + + " to swell, squeezing " + + container.describeSimple(flat) + + " out from your sheath." + ); + }; + + defaults["sheath-absorb"] = function (container, macro, verbose, flat) { + if (container.count > 0) + return ( + "You grip your sheath and give it a firm squeeze, abruptly absorbing " + + container.describeSimple(flat) + + " into your musky body." + ); + else return defaultSheathToy(container, macro, verbose, flat); + }; + + defaults["foreskin-toy"] = function (container, macro, verbose, flat) { + if (container.count > 0) { + if (macro.orgasm) { + return "You stroke your spurting cock. Anything within your foreskin has been ground away to nothingness by the force of your orgasm."; + } else if (macro.arousal < 25) { + return ( + "You slip your fingers into your sheath and give your shaft a squeeze, feeling " + + container.describeSimple(flat) + + " within rub against your " + + macro.describeDick + + " cock." + ); + } else if (macro.arousal < 75) { + return ( + "You grip your swelling cock and squeeze, feeling " + + container.describeSimple(flat) + + " between your " + + macro.describeDick + + " and your foreskin." + ); + } else if (macro.arousal < 150) { + return ( + "You run your fingers down your " + + macro.describeDick + + ", squeezing it to feel " + + container.describeSimple(flat) + + " being smothered against your throbbing cock." + ); + } else { + return ( + "Trembling with your impending orgasm, your fingers play over your taut foreskin, feeling " + + container.describeSimple(flat) + + " within rub against your " + + macro.describeDick + + " cock." + ); + } + } else { + if (macro.orgasm) { + return "You stroke your spurting cock. Anything within your foreskin has been ground away to nothingness by the force of your orgasm."; + } else if (macro.arousal < 25) { + return "You grip your soft foreskin and give it a squeeze."; + } else if (macro.arousal < 75) { + return "You grip your swelling cock and squeeze."; + } else if (macro.arousal < 150) { + return ( + "You run your fingers over your " + + macro.describeDick + + " and grip your taut foreskin, squeezing it gently." + ); + } else { + return "Trembling with your impending orgasm, your fingers play over your shaft."; + } + } + }; + + defaults["foreskin-clench"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "You squeeze your foreskin."; + else if (isGory(macro)) + return ( + "You squeeze your foreskin, reducing " + + container.describeSimple(flat) + + " to a gory paste that slickens your throbbing shaft." + ); + else if (isFatal(macro)) + return ( + "Your fingers run over your packed foreskin, squeezing on the " + + macro.describeDick + + " within and smashing " + + container.describeSimple(flat) + ); + else + return ( + "Your squeeze your foreskin, pushing " + + container.describeSimple(flat) + + " out of your foreskin." + ); + }; + + defaults["foreskin-crush"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "Your orgasm causes your " + macro.describeDick + " to swell and surge." + ); + else if (isGory(macro)) + return ( + "Your powerful orgasm causes your throbbing " + + macro.describeDick + + " to swell and crush the life from everything in your foreskin, reducing " + + container.describeSimple(flat) + + " to a gory paste that slickens your spurting shaft." + ); + else if (isFatal(macro)) + return ( + "Your orgasm causes your " + + macro.describeDick + + " to throb and swell, smashing " + + container.describeSimple(flat) + + " trapped in your musky foreskin." + ); + else + return ( + "Your orgasm causes your " + + macro.describeDick + + " to swell, squeezing " + + container.describeSimple(flat) + + " out from your foreskin." + ); + }; + + defaults["foreskin-absorb"] = function (container, macro, verbose, flat) { + if (container.count > 0) + return ( + "You grip your cock and give it a firm squeeze, abruptly absorbing " + + container.describeSimple(flat) + + " into your musky foreskin." + ); + else return defaultForeskinToy(container, macro, verbose, flat); + }; + + defaults["cock-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "You grab " + + (macro.victimsHuman + ? new Human(1).describe(verbose) + : new Person(1).describe(verbose)) + + " and grind them against your cock...but they won't fit." + ); + else + return ( + "You stuff " + + container.describe(verbose) + + " into your throbbing shaft, forcing them down to your heavy balls." + ); + }; + + defaults["cockslap"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your " + macro.describeDick + " swings through the air. Lewd!"; + else if (isFatal(macro)) + return ( + "Your swaying " + + macro.describeDick + + " crushes " + + container.describe(verbose) + + ". " + ); + else + return ( + "You smack " + + container.describe(verbose) + + " with your " + + macro.describeDick + + "." + ); + }; + + defaults["ball-smother"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "You rest your heavy balls on the ground."; + else if (isFatal(macro)) + return ( + "Your weighty balls spread over " + + container.describe(verbose) + + ", drowning them in musk." + ); + else + return ( + "Your weighty balls spread over " + container.describe(verbose) + "." + ); + }; + + defaults["male-spurt"] = function (container, macro, verbose, flat) { + if (container.count == 0) + 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 $VOLUMEs of slick musky fluid." + ); + else + return ( + "Your " + + macro.describeDick + + " spurts precum, splooging " + + container.describe(verbose) + + " in $VOLUMEs of slick musky fluid." + ); + }; + + defaults["male-orgasm"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "Your " + + macro.describeDick + + " spurts, gushing out a $VOLUME glob of cum." + ); + else if (isFatal(macro)) + return ( + "You're cumming! Your " + + macro.describeDick + + " erupts, obliterating " + + container.describe(verbose) + + " in a $VOLUME-torrent of cum." + ); + else + return ( + "You're cumming! Your " + + macro.describeDick + + " spews a thick rope of seed, splooging " + + container.describe(verbose) + + " in a $VOLUME-torrent of cum." + ); + }; + + defaults["female-spurt"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your moist slit splatters $VOLUME of slick juices."; + else if (isSadistic(macro)) + return ( + "Your dripping slit splatters $VOLUME of your intoxicating juices, dissolving " + + container.describe(verbose) + + "." + ); + else if (isFatal(macro)) + return ( + "Your moist slit splatters $VOLUME of slick juices, drowning " + + container.describe(verbose) + + " in your building lust." + ); + else + return ( + "Your moist slit splatters $VOLUME of slick juices, splooging " + + container.describe(verbose) + + "." + ); + }; + + defaults["female-orgasm"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "Your moist slit gushes $VOLUME of slick femcum."; + else if (isSadistic(macro)) + return ( + "Your quivering slit sprays $VOLUME of your intoxicating femcum, dissolving " + + container.describe(verbose) + + " in an unstoppable torrent of deadly lust." + ); + else if (isFatal(macro)) + return ( + "Your moist slit sprays $VOLUME of slick femcum, obliterating " + + container.describe(verbose) + + " in a torrent of nectar." + ); + else + return ( + "Your moist slit sprays $VOLUME of slick femcum, splooging " + + container.describe(verbose) + + " as you swoon with orgasmic lust." + ); + }; + + defaults["grind"] = function (container, macro, verbose, flat) { + var mid = isFatal(macro) + ? ", smashing them apart" + : ", using them as a toy"; + 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 + + " and " + + macro.describeVagina + + " slit against " + + desc + ); + } else if (macro.maleParts && !macro.femaleParts) { + return "You grind your " + macro.describeDick + " against " + desc; + } else if (!macro.maleParts && macro.femaleParts) { + return "You grind your " + macro.describeVagina + " slit against " + desc; + } else { + return "You grind your hips against " + desc; + } + }; + + defaults["pouch-stuff"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "You grab " + + (macro.victimsHuman + ? new Human(1).describe(verbose) + : new Person(1).describe(verbose)) + + " and stuff them against your pouch...but they won't fit!" + ); + else + return ( + "You grab " + + container.describe(verbose) + + " and stuff " + + (container.count > 1 ? "them" : "it") + + " into your pouch." + ); + }; + + defaults["pouch-rub"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "You rub your empty pouch."; + else + return ( + "You rub your bulging pouch, feeling at " + + container.describeSimple(flat) + + " trapped within." + ); + }; + + defaults["pouch-eat"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "There's nothing in your pouch!"; + else + return ( + "You snatch " + + container.describe(verbose) + + " from your pouch and shove " + + (container.count > 1 ? "them" : "it") + + " down your gullet!" + ); + }; + + defaults["pouch-absorb"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "There's nothing in your pouch!"; + else + return ( + "Your pouch flattens as it absorbs " + container.describeSimple(flat) + ); + }; + + defaults["soul-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "No souls here."; + else + return ( + "You open your " + + macro.jawDesc(true) + + " and inhale, ripping the souls from " + + container.describe(verbose) + + " and dragging them down deep inside." + ); + }; + + defaults["soul-absorb-paw"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (container.count == 0) + return "Your " + macro.footDesc() + " thumps against the ground"; + else if (sum == 0) + return ( + "Your " + + macro.footDesc() + + " slams down on " + + container.describe(verbose) + + "...but there aren't any souls within!" + ); + else + return ( + "Your " + + macro.footDesc() + + " slams down on " + + container.describe(verbose) + + ", smashing them to pieces and absorbing " + + sum + + (sum == 1 ? " soul" : " souls") + + " into your pads." + ); + }; + + defaults["paw-stench"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Horrific miasma flows from your " + + macro.footDesc(true) + + ", the corrosive fumes reducing " + + (sum > 1 ? sum + " people" : "a person") + + " to charred flesh as they wash over " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Vile fumes waft from your " + + macro.footDesc(true) + + " , choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your stinky " + + macro.footDesc(true) + + " overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["ass-stench"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Rancid fumes from your ass sear the flesh of " + + (sum > 1 ? sum + " people" : "a person") + + " as they wash over " + + container.describeSimple(flat) + + ", corroding everything in their path." + ); + if (isFatal(macro)) + return ( + "Vile miasma from your bitter ass snuffs out " + + (sum > 1 ? sum + " people" : "a person") + + ", suffocating them in your stench." + ); + else + return ( + "Your stinky butt sickens " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["piss-stench"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive fumes waft from your piss, the toxic cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Vile fumes waft from your piss, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your stinky piss overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["scat-stench"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "A rancid miasma spews from your shit - a thick, choking avalanche of toxic vapors that reduce " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " to nothing but bones as it melts " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Vile fumes waft from your scat, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your stinky scat overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["male-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your shaft, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your shaft, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your masculine musk overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["female-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your slit, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your slit, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your feminine musk overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["male-spurt-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your precum, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your musky precum overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["female-spurt-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your precum, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your musky precum overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["male-orgasm-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your cum, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your musky cum overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["female-orgasm-musk"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (isSadistic(macro)) + return ( + "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + + " as it dissolves " + + container.describeSimple(flat) + + "." + ); + if (isFatal(macro)) + return ( + "Powerful musk wafts from your cum, choking the life from " + + (sum > 1 ? sum + " people." : "a person.") + ); + else + return ( + "Your musky cum overwhelms " + + (sum > 1 ? sum + " people" : "a person") + + " with your scent!" + ); + }; + + defaults["belch"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (container.count == 0) return "An ominous groan precedes a crass belch."; + if (isSadistic(macro)) + return ( + "A disgusting torrent of gas erupts from your rancid stomach, the vile green gale stopping hearts and burning flesh as it annihilates " + + container.describe(verbose) + + "." + ); + if (isFatal(macro)) + return ( + "A rancid belch flows from your " + + macro.jawDesc(verbose) + + ", corroding " + + container.describe(verbose) + + " with your vile fumes." + ); + else + return ( + "You let out a loud burp, blowing over " + + container.describe(verbose) + + "!" + ); + }; + + defaults["fart"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (container.count == 0) + return "An ominous groan precedes a loud, pungent fart."; + if (isSadistic(macro)) + return ( + "Your intestines snarl and lurch, expelling a powerful jet of utterly rancid stench from your bitter ass. The plume gushes over " + + container.describe(verbose) + + ", ending " + + (sum > 1 ? sum + " lives" : "a life") + + " and annihilating everything in its path." + ); + if (isFatal(macro)) + return ( + "An ominous groan precedes a loud, pungent fart, corroding " + + container.describe(verbose) + + " with truly vile vapors." + ); + else + return ( + "You let out a crass fart, blowing over " + + container.describe(verbose) + + "!" + ); + }; + + defaults["stomach"] = function (container, macro, verbose, flat) { + if (isSadistic(macro)) + return [ + "Your", + pickString("churning gut", "graveyard of a stomach", "fatal belly"), + pickString("crushes", "grinds", "mulches"), + "your prey into a gory paste,", + pickStringChance(0.5, "utterly", "completely"), + "annihilating", + container.describeSimple(flat), + "and", + pickStringChance(0.5, "swiftly"), + "reducing everything within to", + pickString("rancid", "putrid", "horrifying"), + pickString("sludge.", "slop."), + ] + .filter(Boolean) + .join(" "); + else if (isGory(macro)) + return [ + "Your caustic stomach", + pickString("crushes", "grinds"), + container.describeSimple(flat), + "to a gory pulp.", + ] + .filter(Boolean) + .join(" "); + else if (isFatal(macro)) + return [ + "Your stomach", + pickString("gurgles", "snarls", "sloshes"), + "as it digests", + container.describeSimple(flat) + ".", + ] + .filter(Boolean) + .join(" "); + else + return [ + "Your stomach", + pickString("squeezes", "groans", "shifts"), + "and absorbs", + container.describeSimple(flat) + ".", + ] + .filter(Boolean) + .join(" "); + }; + + defaults["tail"] = function (container, macro, verbose, flat) { + if (isSadistic(macro)) + return ( + "Your " + + macro.tailDesc + + " " + + (macro.tailCount > 1 ? "clench" : "clenches") + + ", crushing " + + container.describeSimple(flat) + + " into unrecognizable paste." + ); + else if (isGory(macro)) + return ( + "Your fatal " + + (macro.tailCount > 1 ? "tails crush " : "tail crushes ") + + container.describeSimple(flat) + + " to a gory pulp." + ); + else if (isFatal(macro)) + return ( + "Your " + + (macro.tailCount > 1 + ? "tails gurgles as they digest " + : "tail gurgles as it digests ") + + container.describeSimple(flat) + + "." + ); + else + return ( + "Your " + + (macro.tailCount > 1 + ? "tails groan and absorb " + : "tail groans and absorbs ") + + container.describeSimple(flat) + + "." + ); + }; + + defaults["tail-to-stomach"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) + return ( + "Your " + + (macro.tailCount > 1 ? "tails clench" : "tail clenches") + + ", squeezing " + + container.describeSimple(flat) + + " into your gurgling stomach." + ); + else + return ( + "Your " + + (macro.tailCount > 1 ? "tails squeeze" : "tail squeezes") + + " " + + container.describeSimple(flat) + + " into your belly." + ); + }; + + defaults["bowels"] = function (container, macro, verbose, flat) { + if (isSadistic(macro)) + return ( + "Your rancid bowels clench and churn, crushing " + + container.describeSimple(flat) + + " into a paste of gore and rubble - and then swiftly absorbing everything." + ); + if (isFatal(macro)) + return ( + "Your bowels churn as they melt down " + + container.describeSimple(flat) + + " and absorb them into your body" + ); + else + return ( + "Your bowels churn as they absorb " + container.describeSimple(flat) + ); + }; + + defaults["bowels-to-stomach"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) + return ( + "Your bowels clench, forcing " + + container.describeSimple(flat) + + " into your roiling, caustic stomach." + ); + else + return ( + "Your bowels clench, squeezing " + + container.describeSimple(flat) + + " into your belly." + ); + }; + + defaults["womb"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) + return ( + "Your womb squeezes and dissolves " + + container.describeSimple(flat) + + ", turning them into $VOLUME of slick femcum." + ); + else + return ( + "Your womb squeezes as it absorbs " + container.describeSimple(flat) + ); + }; + + defaults["balls"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) + return ( + "Your balls slosh as they digest " + + container.describeSimple(flat) + + " into $VOLUME of cum" + ); + else + return ( + "Your balls slosh as they absorb " + container.describeSimple(flat) + ); + }; + + defaults["breasts"] = function (container, macro, verbose, flat) { + if (isFatal(macro) && macro.lactationEnabled) + return ( + "Your breasts grrgle as they digest " + + container.describeSimple(flat) + + " into $VOLUME of milk" + ); + else + return ( + "Your breasts slosh as they absorb " + container.describeSimple(flat) + ); + }; + + defaults["bladder"] = function (container, macro, verbose, flat) { + if (isSadistic(macro)) { + let fatalities = get_living_prey(container.sum()); + let line = + "Your bladder swells as " + + container.describeSimple(flat) + + " are dissolved in your acrid piss, digesting them down to $VOLUME of fresh urine"; + if (fatalities > 0) { + line += + " " + + (fatalities > 1 ? fatalities + " lives are" : "a life is") + + " snuffed out by the horrific yellow tide, corroded and annihilated amongst the unbearable stench of urine."; + } + return line; + } else if (isFatal(macro)) + return ( + "Your bladder swells as it dissolves " + + container.describeSimple(flat) + + " into $VOLUME of acrid piss" + ); + else + return ( + "Your bladder squeezes as it absorbs " + container.describeSimple(flat) + ); + }; + + defaults["soul-digest"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + switch (macro.soulVoreType) { + case "release": + return ( + (sum > 1 ? sum + " souls escape" : "A soul escapes") + " your depths." + ); + case "body": + return ( + "Your body claims " + + (sum > 1 ? sum + " souls" : "a soul") + + ", imprisoning " + + (sum > 1 ? "them" : "it") + + " in your body for good." + ); + case "oblivion": + return ( + "Energy washes through your depths as you annihilate " + + (sum > 1 ? sum + " souls" : "a soul") + + ", crushing " + + (sum > 1 ? "them" : "it") + + " into nothingness." + ); + } + }; + + defaults["wings"] = function (container, macro, verbose, flat) { + if (isSadistic(macro)) + return ( + "Your " + + macro.wingDesc + + " wings slacken as the " + + container.describeSimple(flat) + + " within melts into a slurry of meat and wreckage." + ); + if (isFatal(macro)) + return ( + "Your " + + macro.wingDesc + + " wings squeeze tightly as they absorb " + + container.describeSimple(flat) + + " into your body" + ); + else + return ( + "Your " + + macro.wingDesc + + " wings squeeze as they absorb " + + container.describeSimple(flat) + ); + }; + + defaults["wings-to-stomach"] = function (container, macro, verbose, flat) { + if (isFatal(macro)) + return ( + "Your " + + macro.wingDesc + + " wings clench, forcing " + + container.describeSimple(flat) + + " deeper and into your stomach." + ); + else + return ( + "Your " + + macro.wingDesc + + " wings squeeze " + + container.describeSimple(flat) + + " into your belly." + ); + }; + + defaults["wear-shoe"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You slip on your " + macro.shoeDesc(true, false) + "."; + } else { + return ( + "You slip on your " + + macro.shoeDesc(true, false) + + ", " + + macro.toeDesc(true) + + " wriggling against " + + container.describeSimple(flat) + + " trapped within!" + ); + } + }; -defaults["ass-crush"] = function (container, macro, verbose, flat) { - let count = get_living_prey(container.sum()); - if (container.count == 0) - return "You take a seat. It's good to have a break!"; - else if (isSadistic(macro)) - return "You lower your heavy ass to the ground, biting your lip as you feel " + container.describe(verbose) + " collapse beneath your massive cheeks. " + (count > 1 ? count + " lives are" : "A life is") + " snuffed out as you settle down, grinding your ass into the remains before slowly rising back up."; - else if (isFatal(macro)) - return "Your heavy ass obliterates " + container.describe(verbose) + ". "; - else - return "You sit on " + container.describe(verbose); -} + defaults["remove-shoe"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You pull off your " + macro.shoeDesc(true, false) + "."; + } else { + return ( + "You pull off your " + + macro.shoeDesc(true, false) + + ", " + + macro.toeDesc(true) + + " rubbing against " + + container.describeSimple(flat) + + " on the way out." + ); + } + }; -defaults["ass-grind"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You rub your ass on a wall."; - } else { - return "You grind your ass against " + container.describe(verbose) + ", flattening " + (container.count == 1 ? "it" : "them") + " under your weight."; - } + defaults["wear-sock"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You slip on your " + macro.sockDesc(true, false) + "."; + } else { + return ( + "You slip on your " + + macro.sockDesc(true, false) + + ", " + + macro.toeDesc(true) + + " grinding against " + + container.describeSimple(flat) + + " trapped in the cotton tube!" + ); + } + }; + + defaults["remove-sock"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return ( + "You pull off your " + + macro.sockDesc(true, false) + + ". Cool air washes over your " + + macro.toeOnlyDesc(true) + ); + } else { + return ( + "You pull off your " + + macro.sockDesc(true, false) + + ", leaving " + + container.describeSimple(flat) + + " trapped at the bottom." + ); + } + }; + + defaults["stuff-shoe"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return ( + "You don't have anything to stuff into your " + + macro.shoeDesc(true) + + "." + ); + } else { + return ( + "You grab " + + container.describe(verbose) + + " and stuff " + + (container.count > 1 ? "them" : "it") + + " into your " + + macro.shoeDesc(true) + + "!" + ); + } + }; + + defaults["stuff-sock"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return ( + "You don't have anything to stuff into your " + + macro.sockDesc(true) + + "." + ); + } else { + return ( + "You grab " + + container.describe(verbose) + + " and stuff " + + (container.count > 1 ? "them" : "it") + + " into your " + + macro.sockDesc(true) + + "!" + ); + } + }; -} + defaults["dump-shoe"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your " + macro.shoeDesc(true) + " are empty, silly."; + } else { + return ( + "You shake out your " + + macro.shoeDesc(true) + + ", dumping " + + container.describeSimple(flat) + + " onto the ground." + ); + } + }; + + defaults["dump-sock"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return ( + "You don't have anything to stuff into your " + + macro.sockDesc(true) + + "." + ); + } else { + return ( + "You turn your " + + macro.shoeDesc(true) + + " inside-out, dumping " + + container.describeSimple(flat) + + " onto the ground." + ); + } + }; + + defaults["piss"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return [ + "You sigh with relief as", + "$VOLUME", + "of piss erupts from", + macro.maleParts + ? "your " + macro.describeDick + "." + : "between your legs.", + ] + .filter(Boolean) + .join(" "); + } else if (isSadistic(macro)) { + return [ + "You sigh with relief as", + "$VOLUME", + "of hot,", + pickString("rancid", "steaming", "fuming"), + "piss erupts from", + macro.maleParts + ? "your " + macro.describeDick + "," + : "between your legs,", + "inundating", + container.describe(verbose), + "and melting", + container.count > 1 ? "them" : "it", + "them down to a boiling", + pickString("slurry of molten prey", "stew", "heap of charred slag"), + pickString( + "in mere seconds", + "with terrifying speed", + "like " + + (container.count > 1 ? "they were" : "it was") + + " tissue paper" + ), + ] + .filter(Boolean) + .join(" "); + } else { + return [ + "You sigh with relief as", + "$VOLUME", + "of piss erupts from", + macro.maleParts + ? "your " + macro.describeDick + "," + : "between your legs,", + "spraying down", + container.describe(verbose), + "in a shower of golden, musky fluid.", + ] + .filter(Boolean) + .join(" "); + } + }; -defaults["tail-slap"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your " + (macro.tailCount > 1 ? "tails swing" : "tail swings") + " to and fro"; - else if (isFatal(macro)) - return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails swing" : " tail swings") + " into " + container.describe(verbose) + ", smashing everything in " + - (macro.tailCount > 1 ? "their" : "its") + " path."; - else - return "Your " + macro.describeTail + (macro.tailCount > 1 ? " tails slap" : " tail slaps") + " against " + container.describe(verbose) + ", bowling them over."; -} + defaults["bladder-vore"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "You don't have anything to shove into your bladder!"; + } else { + if (macro.maleParts) { + return ( + "You snatch up " + + container.describe(verbose) + + " and stuff them into your " + + macro.describeDick + + ", grinding them to its base and forcing them into your musky bladder." + ); + } else if (macro.femaleParts) { + return ( + "You snatch " + + container.describe(verbose) + + " in your iron grip, grinding them against your " + + macro.describeVagina + + " slit before stuffing them into your urethra, sealing them away in your musky bladder." + ); + } else { + return ( + "You grab " + + container.describe(verbose) + + " and grind them between your legs, slipping them into your urethra and imprisoning them in your bladder." + ); + } + } + }; + + defaults["scat"] = function (container, macro, verbose, flat) { + let sum = get_living_prey(container.sum()); + if (macro.scatStorage.amount == 0) { + return "Your bowels are empty."; + } else if (container.count == 0) { + return "You squat down and let out a $MASS log of shit."; + } else if (isSadistic(macro)) { + let line = + "You squat down, letting out a grunt as your rancid bowels force out a $MASS, $LENGTH-long heap of shit. The fatally-pungent scat buries " + + container.describe(verbose) + + ", ending " + + numberRough(sum, "of") + + (sum > 1 ? " lives" : " life") + + " and entombing them in your shit."; + if (macro.scatStorage.victims.count > 0) { + line += + " Embedded in the vomit-inducing heap are the mangled, crushed remains of " + + listSum(macro.scatStorage.victims.sum()) + + ", " + + numberRough(get_living_prey(macro.scatStorage.victims.sum()), "of") + + " living creatures converted to noxious scat by your disgusting depths."; + } + return line; + } else if (macro.brutality > 0 && macro.scatStorage.victims.count > 0) { + return ( + "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + + container.describe(verbose) + + ". Embedded in the thick, chunky waste are the remains of " + + listSum(macro.scatStorage.victims.sum()) + + ", now little more than bones and wreckage in your shit." + ); + } else { + return ( + "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + + container.describe(verbose) + ); + } + }; -defaults["tail-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your drooling tail lashes about, but can't seem to chow down on anyone..."; - else if (isFatal(macro)) - return "Your tail lunges, maw agape, at " + container.describe(verbose) + - ". It scarfs down everything in seconds, gulping forcefully to drag your prey into your sloppy confines."; - else - return "Your tail lunges, maw agape, at " + container.describe(verbose) + - ". It scarfs down everything in a second, gulping forcefully and pulling your prey inside."; -} + defaults["melt"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your body turns gooey."; + } else { + return ( + "Your body turns gooey, sucking " + + container.describeSimple(flat) + + " into your molten self." + ); + } + }; + + defaults["solidify"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your body turns solid."; + } else if (macro.gooDigest > 0) { + return ( + "Your body turns solid, pushing out " + + container.describeSimple(flat) + + "." + ); + } else { + return ( + "Your body turns solid, swiftly absorbing " + + container.describeSimple(flat) + + "." + ); + } + }; -defaults["tails-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your drooling tails swing to and fro"; - else if (isFatal(macro)) - return "Your $COUNT tails lunge, maws agape, at " + container.describe(verbose) + - ". They scarf down everything in seconds, gulping forcefully to drag your prey into your sloppy confines."; - else - return "Your $COUNT tails lunge, maws agape, at " + container.describe(verbose) + - ". They scarf down your prey, gulping forcefully and pulling them deep inside."; -} + defaults["flood"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your gooey body melts and floods outward..but doesn't catch anything."; + } else { + return ( + "Your gooey body melts and floods outward, burying " + + container.describe(verbose) + + " in your thick, slimy self. You slowly reform, grinning as you feel " + + numberRough(get_living_prey(container.sum()), "of") + + " prey sloshing about within." + ); + } + }; -defaults["cleavage-stuff"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You can't fit anything into your cleavage right now."; - else - return "You snatch up " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your cleavage."; -} + defaults["stomp-goo"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your gooey paw hits the ground."; + } else { + return ( + "Your gooey paws falls over " + + container.describe(verbose) + + ", smothering them in goo and pulling them into your body." + ); + } + }; -defaults["cleavage-crush"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grasp your breasts and forcefully squeeze them together."; - else if (isSadistic(macro)) - return "You grasp your breasts and slowly bring them together, steadily crushing the life from " + container.describeSimple(flat) + " trapped in between - savoring every last pop and crunch as you exterminate your prey."; - else if (isGory(macro)) - return "You grasp your breasts and forcefully shove them together, crushing the life from " + container.describeSimple(flat) + "."; - else if (isFatal(macro)) - return "You grasp your breasts and forcefully shove them together, crushing " + container.describeSimple(flat) + "."; - else - return "You grasp your breasts and squish them together, smooshing " + container.describeSimple(flat) + "."; -} + defaults["ass-goo"] = function (container, macro, verbose, flat) { + if (container.count == 0) { + return "Your gooey ass sits down on the ground."; + } else { + return ( + "You sit your gooey ass down on " + + container.describe(verbose) + + ", pulling them right into your body." + ); + } + }; + + defaults["goo-digest"] = function (container, macro, verbose, flat) { + return "Your goopy depths dissolve " + container.describeSimple(flat) + "."; + }; + + defaults["goo-stomach-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your stomach, drawing them into the viscous goo." + ); + }; + + defaults["goo-stomach-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your gurgling stomach." + ); + }; + + defaults["goo-bowels-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your bowels, drawing them into the viscous goo." + ); + }; + + defaults["goo-bowels-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your clenching bowels." + ); + }; + + defaults["goo-womb-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your womb, drawing them into the viscous goo." + ); + }; + + defaults["goo-womb-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your slick womb." + ); + }; + + defaults["goo-balls-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your balls, drawing them into the viscous goo." + ); + }; + + defaults["goo-balls-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your musky balls." + ); + }; + + defaults["goo-breasts-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your breasts, drawing them into the viscous goo." + ); + }; + + defaults["goo-breasts-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your breasts." + ); + }; + + defaults["goo-tail-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your " + + macro.tailDesc + + ", drawing them into the viscous goo." + ); + }; + + defaults["goo-tail-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your " + + macro.tailDesc + ); + }; + + defaults["goo-paws-pull"] = function (container, macro, verbose, flat) { + return ( + "Your molten depths squeeze in around the " + + container.describeSimple(flat) + + " imprisoned in your " + + macro.footOnlyDesc(true) + + ", drawing them into the viscous goo." + ); + }; + + defaults["goo-paws-push"] = function (container, macro, verobse) { + return ( + "Your churning goo herds " + + container.describeSimple(flat) + + " into your " + + macro.footOnlyDesc(true) + + "." + ); + }; + + defaults["paw-vore"] = function (container, macro, verbose, flat) { + return ( + "Your " + + macro.footOnlyDesc(true) + + " smother over " + + container.describeSimple(flat) + + ", absorbing them into your soles!" + ); + }; + + defaults["paw-vore-toes"] = function (container, macro, verbose, flat) { + return ( + "The " + + container.describeSimple(flat) + + " trapped between your toes " + + (container.count > 1 ? "are" : "is") + + " sucked inside." + ); + }; + + defaults["paws"] = function (container, macro, verbose, flat) { + return ( + "Your " + + macro.footOnlyDesc(true) + + " fully absorb " + + container.describeSimple(flat) + + "." + ); + }; + + defaults["crop-swallow"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return "You reach down for a delicious treat and grab - oh, nothing."; + else + return ( + "You scoop up " + + container.describe(verbose) + + " and swallow " + + (container.count > 1 ? "them" : "it") + + " whole, pulling your prey into your crop." + ); + }; + + defaults["crop-transfer"] = function (container, macro, verbose, flat) { + if (container.count == 0) return "You have nothing in your crop"; + else + return ( + "Your throat squeezes, forcing " + + container.describe(verbose) + + " out of your crop and in to your stomach." + ); + }; + + function nonFatalBreath(container, macro, verbose, flat, type, verb) { + if (macro.breathStyle == "line") { + return ( + "You exhale a narrow gout of " + + type + + ", " + + verb + + " " + + container.describe(verbose) + + "." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You exhale a broad cone of " + + type + + ", " + + verb + + " " + + container.describe(verbose) + + "." + ); + } + } -defaults["cleavage-drop"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You pull your breasts apart and give them a shake."; - if (isFatal(macro)) - return "You pull your breasts apart far enough for the " + container.describeSimple(flat) + " trapped within to fall out, tumbling to the ground and smashing to bits."; - else - return "You pull your breasts apart far enough for the " + container.describeSimple(flat) + " trapped within to fall out."; -} + defaults["breath-fire"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "fire", + "blasting" + ); + } -defaults["cleavage-absorb"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return defaultCleavageCrush(container, macro, verbose, flat); - else - return "Your squeeze your breasts together, swiftly absorbing " + container.describeSimple(flat) + " into your chest."; -} + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "A withering spear of fire gouts from your maw, spearing through " + + container.describe(verbose) + + " and incinerating it in a torrid display of power." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You exhale a broad cone of powerful fire, burning " + + container.describe(verbose) + + " to a crisp in an inescapable tide of flames." + ); + } + } -defaults["breast-crush"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your let your breasts thump against the ground."; - else if (isFatal(macro)) - return [ - "You let your breasts drop,", - pickString("crushing", "smashing", "burying", "smothering"), - container.describe(verbose), - "beneath those", - length(macro.breastDiameter, unit, true) + "-wide", - pickString("knockers", "tits", "boobs") + ".", - pickStringChance(0.5, (macro.lactationEnabled ? "A spray of milk spurts from your nipples." : "")) - ].filter(Boolean).join(" "); - else - return "You smoosh " + container.describe(verbose) + " beneath your breasts."; -} + return "FIRE" + container.describe(verbose); + }; + defaults["breath-ice"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "cold", + "freezing" + ); + } -defaults["breast-vore"] = function (container, macro, verbose, flat) { - let prey = new Container(); - macro.breasts.contents.forEach(function (x) { - prey = prey.merge(x); - }); - - if (container.count == 0) - return "It'd be pretty hot to stick someone in your breasts. Shame you can't right now."; - else - return pickString([ - "Your breasts squish against", - container.describe(verbose), - "as", - (container.count > 1 ? "they're" : "it's"), - "forced right into your nipples! They stretch and", - pickString("envelop", "consume", "suck in"), - "your prey,", - pickStringChance(0.5, "swiftly", "easily"), - "burying them in those warm,", - (macro.lactationEnabled ? "milky" : "heavy"), - "mounds." - ], [ - capitalize(container.describe(verbose)), - (container.count > 1 ? "are" : "is"), - pickStringChance(0.35, "abruptly", "swiftly"), - pickString("stuffed", "slipped"), - "into your breasts", - (container.count > 1 ? "their" : "its"), - "form lost within your bosom.", - (prey.count > 0 ? (prey.count > 1 ? "The " + prey.describe(false) : capitalize(prey.describe(true))) + " within " + (prey.count > 1 ? "slosh" : "sloshes") + " about as " + (prey.count > 1 ? "they're" : "it's") + " joined by fresh prey." : "") - ]).filter(Boolean).join(" ") -} + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "You heave a lance of frigid cold from your gullet, freezing " + + container.describe(verbose) + + " to the core." + ); + } else if (macro.breathStyle == "cone") { + return ( + "A blizzard erupts from your maw, flash-freezing " + + container.describe(verbose) + + ". " + + (container.count > 1 ? "They" : "It") + + " shatters a heartbeat later, reduced to dust by your power." + ); + } + } -defaults["breast-milk"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that splatters on the ground."; - else if (isFatal(macro)) - return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + " in an unstoppable wave of white."; - else - return "You squeeze your breasts, coaxing out $VOLUME of warm, creamy milk that floods " + container.describe(verbose) + "."; -} + return "ICE" + container.describe(verbose); + }; + + defaults["breath-electric"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "electricity", + "shocking" + ); + } -defaults["unbirth"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your slit...but they won't fit."; - else { - return pickString([ - "You", - pickString(...synonyms.moan), - "as", - container.describe(verbose), - (container.count > 1 ? "spread" : "spreads"), - "open your", - pickString("sex", macro.describeVagina + " slit") + ",", - pickString("swallowed", "sucked", "drawn"), - pickString("within", "inside", "down deep"), - "by", - pickString("tender", "sensuous", "lustful"), - pickString("folds", "muscle") + "." - ], [ - capitalize(container.describe(verbose)), - "fall prey to your", - pickString("sex", macro.describeVagina + " slit"), - "with a messy", - pickString("SQUELCH,", "SQUISH,"), - "vanishing into your womb and sending a", - pickString("jolt", "surge", "shock"), - "of ecstasy up your spine." - ]).filter(Boolean).join(" "); - } + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "A blinding lance of lightning blasts from your spread " + + macro.jawDesc(true) + + ", cooking " + + container.describe(verbose) + + " from the inside out." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You exhale a brilliant, forking spray of lightning. The flickering bolts arc through " + + container.describe(verbose) + + ", cooking everything to a crisp." + ); + } + } -} + return "ELECTRIC" + container.describe(verbose); + }; + + defaults["breath-smoke"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "smoke", + "smothering" + ); + } -defaults["sheath-stuff"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grab a " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your sheath-slit...but they won't fit."; - else - return "You pluck " + container.describe(verbose) + " from the ground and slip them into your musky sheath."; -} + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "You part your " + + macro.jawDesc(true) + + " a touch and blow, casting a thin gout of smoke that envelops " + + container.describe(verbose) + + ". Your prey is snuffed out like a candle." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You open wide and exhale. A rolling storm of smoke pours forth, smothering " + + container.describe(verbose) + + " in a pyroclastic flow." + ); + } + } -defaults["foreskin-stuff"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grab a " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your foreskin...but they won't fit."; - else - return "You pluck " + container.describe(verbose) + " from the ground and slip them into your musky foreskin."; -} + return "SMOKE" + container.describe(verbose); + }; + + defaults["breath-radiation"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "radiation", + "frying" + ); + } -defaults["breast-toy"] = function (container, macro, verbose, flat) { - if (container.count > 0) { - return "You smush your breasts together, squeezing " + container.describeSimple(flat) + " between the heavy mounds."; - } else { - return "You smush your breasts together."; - } -} + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "Your depths pour out a narrow beam of crackling green energy, striking " + + container.describe(verbose) + + " and frying it to a crisp, turning your prey to dust in the wind." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You part your " + + macro.jawDesc(true) + + ", roaring as a massive tide of radiation spews forth. It rolls over " + + container.describe(verbose) + + ", evaporating " + + (container.count > 1 ? "them" : "it") + + " in seconds." + ); + } + } -defaults["slit-toy"] = function (container, macro, verbose, flat) { - if (container.count > 0) { - return "You slip your fingers into your snatch, teasing yourself and pushing the " + container.describeSimple(flat) + " within a little deeper."; - } else { - return "Your slp your fingers into your snatch and tease yourself."; - } -} + return "RADIATION" + container.describe(verbose); + }; + + defaults["breath-foul"] = function (container, macro, verbose, flat) { + if (isNonFatal(macro)) { + return nonFatalBreath( + container, + macro, + verbose, + flat, + "foul air", + "withering" + ); + } -defaults["sheath-toy"] = function (container, macro, verbose, flat) { - if (container.count > 0) { - if (macro.orgasm) { - return "You stroke your spurting cock, then reach down to give your sheath a firm squeeze. Anything within has been ground away to nothingness by the force of your orgasm."; - } else if (macro.arousal < 25) { - return "You grip your soft sheath and give it a squeeze, feeling " + container.describeSimple(flat) + " within rub against your " + macro.describeDick + "."; - } else if (macro.arousal < 75) { - return "You grip your swelling sheath and squeeze, feeling " + container.describeSimple(flat) + " within grind against your " + macro.describeDick + "."; - } else if (macro.arousal < 150) { - return "You run your fingers down your " + macro.describeDick + " and grip your sheath, squeezing it to feel " + container.describeSimple(flat) + " being smothered against the musky walls by your throbbing cock."; - } else { - return "Trembling with your impending orgasm, your fingers play over your sheath, feeling " + container.describeSimple(flat) + " within rub against your " + macro.describeDick + "."; + if (isFatal(macro)) { + if (macro.breathStyle == "line") { + return ( + "You blow a narrow stream of breath, withering " + + container.describe(verbose) + + " in a focused torrent of foul, humid fumes." + ); + } else if (macro.breathStyle == "cone") { + return ( + "You yawn wide and sigh, snuffing out " + + container.describe(verbose) + + " under a tide of hot, humid breath." + ); + } } - } else { - if (macro.orgasm) { - return "You stroke your spurting cock, then reach down to give your sheath a firm squeeze. Anything within has been ground away to nothingness by the force of your orgasm."; - } else if (macro.arousal < 25) { - return "You grip your soft sheath and give it a squeeze."; - } else if (macro.arousal < 75) { - return "You grip your swelling sheath and squeeze."; - } else if (macro.arousal < 150) { - return "You run your fingers down your " + macro.describeDick + " and grip your sheath, squeezing it gently."; + + return "FOUL" + container.describe(verbose); + }; + + defaults["drool"] = function (container, macro, verbose, flat) { + if (container.count == 0) + return ( + "$VOLUME of hot drool oozes from your " + macro.jawDesc(true) + "." + ); + else if (isFatal(macro)) + return ( + "A rain of slobber falls from your maw, inundating " + + container.describe(verbose) + + " in $VOLUME of slimy drool." + ); + else + return ( + "$VOLUME of your drool rains down from your " + + macro.jawDesc(true) + + ", washing over " + + container.describe(verbose) + + "." + ); + }; + + defaults["magic-shrink"] = function (container, macro, verbose, flat) { + return ( + "You envelop " + + container.describeSimple(flat) + + " in swirling tendrils of magic, shrinking " + + (container.count == 1 ? "it" : "them") + + " down!" + ); + }; + + defaults["wings-flap"] = function (container, macro, verbose, flat) { + if (container.counter == 0) { + return "You flap your " + macro.wingDesc + " wings."; } else { - return "Trembling with your impending orgasm, your fingers play over your sheath."; + return ( + "You flap your " + + macro.wingDesc + + " wings, blowing away " + + container.describe(verbose) + + "." + ); } - } -} - -defaults["sheath-clench"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You squeeze your sheath."; - else if (isGory(macro)) - return "You squeeze your packed sheath, reducing " + container.describeSimple(flat) + " to a gory paste that slickens your throbbing shaft."; - else if (isFatal(macro)) - return "Your fingers run over your packed sheath, squeezing on the " + macro.describeDick + " within and smashing " + container.describeSimple(flat); - else - return "Your squeeze your sheath, pushing " + container.describeSimple(flat) + " out of your sheath."; -} - -defaults["sheath-crush"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your orgasm causes your " + macro.describeDick + " to swell and surge."; - else if (isGory(macro)) - return "Your powerful orgasm causes your throbbing " + macro.describeDick + " to swell and crush the life from everything in your sheath, reducing " + container.describeSimple(flat) + " to a gory paste that slickens your spurting shaft."; - else if (isFatal(macro)) - return "Your orgasm causes your " + macro.describeDick + " to throb and swell, smashing " + container.describeSimple(flat) + " trapped in your musky sheath."; - else - return "Your orgasm causes your " + macro.describeDick + " to swell, squeezing " + container.describeSimple(flat) + " out from your sheath."; -} - -defaults["sheath-absorb"] = function (container, macro, verbose, flat) { - if (container.count > 0) - return "You grip your sheath and give it a firm squeeze, abruptly absorbing " + container.describeSimple(flat) + " into your musky body."; - else - return defaultSheathToy(container, macro, verbose, flat); -} + }; -defaults["foreskin-toy"] = function (container, macro, verbose, flat) { - if (container.count > 0) { - if (macro.orgasm) { - return "You stroke your spurting cock. Anything within your foreskin has been ground away to nothingness by the force of your orgasm."; - } else if (macro.arousal < 25) { - return "You slip your fingers into your sheath and give your shaft a squeeze, feeling " + container.describeSimple(flat) + " within rub against your " + macro.describeDick + " cock."; - } else if (macro.arousal < 75) { - return "You grip your swelling cock and squeeze, feeling " + container.describeSimple(flat) + " between your " + macro.describeDick + " and your foreskin."; - } else if (macro.arousal < 150) { - return "You run your fingers down your " + macro.describeDick + ", squeezing it to feel " + container.describeSimple(flat) + " being smothered against your throbbing cock."; + defaults["wings-vore"] = function (container, macro, verbose, flat) { + if (container.counter == 0) { + return "You flap your " + macro.wingDesc + " wings aggressively."; } else { - return "Trembling with your impending orgasm, your fingers play over your taut foreskin, feeling " + container.describeSimple(flat) + " within rub against your " + macro.describeDick + " cock."; + return ( + "You spread your " + + macro.wingDesc + + " wings wide, wrapping them around " + + container.describe(verbose) + + " and ensnaring them" + ); } - } else { - if (macro.orgasm) { - return "You stroke your spurting cock. Anything within your foreskin has been ground away to nothingness by the force of your orgasm."; - } else if (macro.arousal < 25) { - return "You grip your soft foreskin and give it a squeeze."; - } else if (macro.arousal < 75) { - return "You grip your swelling cock and squeeze."; - } else if (macro.arousal < 150) { - return "You run your fingers over your " + macro.describeDick + " and grip your taut foreskin, squeezing it gently."; - } else { - return "Trembling with your impending orgasm, your fingers play over your shaft."; + }; + + defaults["victim-cum-flood"] = function (macro) { + if (isSadistic(macro)) { + return "drowned in viscous cum"; + } else if (isGory(macro)) { + return "drowned in cum"; + } else if (isFatal(macro)) { + return "smothered in cum"; + } else if (isNonFatal(macro)) { + return "washed away by cum"; } - } + }; + + defaults["victim-femcum-flood"] = function (macro) { + if (isSadistic(macro)) { + return "drowned in slick femcum"; + } else if (isGory(macro)) { + return "drowned in femcum"; + } else if (isFatal(macro)) { + return "smothered in femcum"; + } else if (isNonFatal(macro)) { + return "washed away by femcum"; + } + }; + + defaults["victim-stomped"] = function (macro) { + if (isSadistic(macro)) { + return "crushed into pulp beneath your " + macro.footDesc(true); + } else if (isGory(macro)) { + return "crushed beneath your " + macro.footDesc(true); + } else if (isFatal(macro)) { + return "stomped on"; + } else if (isNonFatal(macro)) { + return "stepped on"; + } + }; + + defaults["victim-flex-toes"] = function (macro) { + if (isSadistic(macro)) { + return "ground to a thick paste between your " + macro.toeDesc(true); + } else if (isGory(macro)) { + return "crushed to death between your " + macro.toeDesc(true); + } else if (isFatal(macro)) { + return "crushed between your " + macro.toeDesc(true); + } else if (isNonFatal(macro)) { + return "squeezed in your " + macro.toeDesc(true); + } + }; + + defaults["victim-eaten"] = function (macro) { + if (isSadistic(macro)) { + return "devoured and digested down to molten chyme"; + } else if (isGory(macro)) { + return "consumed and digested alive"; + } else if (isFatal(macro)) { + return "devoured alive"; + } else if (isNonFatal(macro)) { + return "swallowed"; + } + }; + + defaults["victim-ass-crush"] = function (macro) { + if (isSadistic(macro)) { + return "snuffed out under your ass"; + } else if (isGory(macro)) { + return "crushed by your ass"; + } else if (isFatal(macro)) { + return "flattened under your ass"; + } else if (isNonFatal(macro)) { + return "sat on"; + } + }; + + defaults["victim-ass-ground"] = function (macro) { + if (isSadistic(macro)) { + return "ground out of existence beneath your heavy ass"; + } else if (isGory(macro)) { + return "crushed by your grinding ass"; + } else if (isFatal(macro)) { + return "flattened by your grinding ass"; + } else if (isNonFatal(macro)) { + return "ground under your ass"; + } + }; + + defaults["victim-humped"] = function (macro) { + if (isSadistic(macro)) { + return "smashed to gory paste by your thrusting hips"; + } else if (isGory(macro)) { + return "crushed to death by your hips"; + } else if (isFatal(macro)) { + return "ground on by your sultry hips"; + } else if (isNonFatal(macro)) { + return "humped"; + } + }; + + defaults["victim-vomit"] = function (macro) { + if (isSadistic(macro)) { + return "spewed from your caustic depths and left to die"; + } else if (isGory(macro)) { + return "vomited out in a puddle of acid and chyme"; + } else if (isFatal(macro)) { + return "puked up from your churning guts"; + } else if (isNonFatal(macro)) { + return "horked out"; + } + }; + + defaults["victim-chew"] = function (macro) { + if (isSadistic(macro)) { + return "chewed to a bloody pulp by your scything " + macro.jawDesc(true); + } else if (isGory(macro)) { + return "crushed to pulp by your " + macro.jawDesc(true); + } else if (isFatal(macro)) { + return "chewed up in your " + macro.jawDesc(true); + } else if (isNonFatal(macro)) { + return "gnawed on by your " + macro.jawDesc(true); + } + }; + + defaults["victim-drool"] = function (macro) { + if (isSadistic(macro)) { + return "inundated in your drool and drowned"; + } else if (isGory(macro)) { + return "swept away by a tide of drool"; + } else if (isFatal(macro)) { + return "flooded in your drool"; + } else if (isNonFatal(macro)) { + return "soaked by your drool"; + } + }; + + defaults["victim-anal-vore"] = function (macro) { + if (isSadistic(macro)) { + return "crammed into your bowels and obliterated"; + } else if (isGory(macro)) { + return "shoved into your greedy ass"; + } else if (isFatal(macro)) { + return "slipped into your bowels"; + } else if (isNonFatal(macro)) { + return "used as toys in your ass"; + } + }; + + defaults["victim-tail-slap"] = function (macro) { + if (isSadistic(macro)) { + return "cut down like wheat by your swooping, scything " + macro.tailDesc; + } else if (isGory(macro)) { + return "smashed to bloody pieces by your " + macro.tailDesc; + } else if (isFatal(macro)) { + return "leveled by your " + macro.tailDesc; + } else if (isNonFatal(macro)) { + return "thwapped with your " + macro.tailDesc; + } + }; + + defaults["victim-tail-vore"] = function (macro) { + if (isSadistic(macro)) { + return "snapped up and devoured by your ravenous " + macro.tailNoDesc; + } else if (isGory(macro)) { + return "swallowed down by your powerful" + macro.tailNoDesc; + } else if (isFatal(macro)) { + return "devoured by your " + macro.tailNoDesc; + } else if (isNonFatal(macro)) { + return "gulped down by your " + macro.tailNoDesc; + } + }; + + defaults["victim-cock-slap"] = function (macro) { + if (isSadistic(macro)) { + return "obliterated beneath your massive, swinging shaft."; + } else if (isGory(macro)) { + return "crushed by your cock"; + } else if (isFatal(macro)) { + return "flattened under your dick"; + } else if (isNonFatal(macro)) { + return "smacked with your dick"; + } + }; + + defaults["victim-cock-vore"] = function (macro) { + if (isSadistic(macro)) { + return "plunged into the depths of your shaft"; + } else if (isGory(macro)) { + return "devoured by your ravenous cock"; + } else if (isFatal(macro)) { + return "sucked down your shaft"; + } else if (isNonFatal(macro)) { + return "slipped into your cock"; + } + }; + + defaults["victim-ball-smother"] = function (macro) { + if (isSadistic(macro)) { + return "reduced to broken gore under your massive balls"; + } else if (isGory(macro)) { + return "snuffed out by your crushing balls"; + } else if (isFatal(macro)) { + return "crushed under your balls"; + } else if (isNonFatal(macro)) { + return "trapped under your balls"; + } + }; + + defaults["victim-sheath-crush"] = function (macro) { + if (isSadistic(macro)) { + return "crushed and smeared between your shaft and sheath"; + } else if (isGory(macro)) { + return "ground into paste within your sheath"; + } else if (isFatal(macro)) { + return "crushed between your sheath and shaft"; + } else if (isNonFatal(macro)) { + return "squeezed out from your sheath"; + } + }; + + defaults["victim-sheath-absorb"] = function (macro) { + if (isSadistic(macro)) { + return "dissolved and absorbed into your tight sheath"; + } else if (isGory(macro)) { + return "absorbed by the flesh of your sheath"; + } else if (isFatal(macro)) { + return "absorbed into your sheath"; + } else if (isNonFatal(macro)) { + return "taken into your sheath"; + } + }; + + defaults["victim-foreskin-crush"] = function (macro) { + if (isSadistic(macro)) { + return "crushed and smeared between your shaft and foreskin"; + } else if (isGory(macro)) { + return "ground into paste within your foreskin"; + } else if (isFatal(macro)) { + return "crushed between your foreskin and shaft"; + } else if (isNonFatal(macro)) { + return "squeezed out from your foreskin"; + } + }; + + defaults["victim-foreskin-absorb"] = function (macro) { + if (isSadistic(macro)) { + return "dissolved and absorbed into your tight foreskin"; + } else if (isGory(macro)) { + return "absorbed by the flesh of your foreskin"; + } else if (isFatal(macro)) { + return "absorbed into your foreskin"; + } else if (isNonFatal(macro)) { + return "taken into your foreskin"; + } + }; + + defaults["victim-male-musk"] = function (macro) { + if (isSadistic(macro)) { + return "reduced to slurry by corrosive masculine musk"; + } else if (isGory(macro)) { + return "suffocated by masculine musk"; + } else if (isFatal(macro)) { + return "snuffed out by masculine musk"; + } else if (isNonFatal(macro)) { + return "dazed by masculine musk"; + } + }; + + defaults["victim-male-spurt-musk"] = function (macro) { + if (isSadistic(macro)) { + return "corroded by your caustic, overwhelming masculine musk"; + } else if (isGory(macro)) { + return "snuffed out by your masculine musk"; + } else if (isFatal(macro)) { + return "overwhelmed by masculine musk"; + } else if (isNonFatal(macro)) { + return "dazed by masculine musk"; + } + }; + + defaults["victim-male-orgasm-musk"] = function (macro) { + if (isSadistic(macro)) { + return "corroded by your caustic, overwhelming masculine musk"; + } else if (isGory(macro)) { + return "snuffed out by your masculine musk"; + } else if (isFatal(macro)) { + return "overwhelmed by masculine musk"; + } else if (isNonFatal(macro)) { + return "dazed by masculine musk"; + } + }; + + defaults["victim-unbirth"] = function (macro) { + if (isSadistic(macro)) { + return "crushed by your overwhelming womb"; + } else if (isGory(macro)) { + return "crammed into your womb"; + } else if (isFatal(macro)) { + return "stuffed into your nethers"; + } else if (isNonFatal(macro)) { + return "slipped into your slit"; + } + }; + + defaults["victim-female-musk"] = function (macro) { + if (isSadistic(macro)) { + return "dissolved to slurry by feminine musk"; + } else if (isGory(macro)) { + return "suffocated by feminine musk"; + } else if (isFatal(macro)) { + return "snuffed out by feminine musk"; + } else if (isNonFatal(macro)) { + return "dazed by feminine musk"; + } + }; + + defaults["victim-female-spurt-musk"] = function (macro) { + if (isSadistic(macro)) { + return "corroded by your caustic, overwhelming feminine musk"; + } else if (isGory(macro)) { + return "snuffed out by your feminine musk"; + } else if (isFatal(macro)) { + return "overwhelmed by feminine musk"; + } else if (isNonFatal(macro)) { + return "dazed by feminine musk"; + } + }; + + defaults["victim-female-orgasm-musk"] = function (macro) { + if (isSadistic(macro)) { + return "corroded by your caustic, overwhelming feminine musk"; + } else if (isGory(macro)) { + return "snuffed out by your feminine musk"; + } else if (isFatal(macro)) { + return "overwhelmed by feminine musk"; + } else if (isNonFatal(macro)) { + return "dazed by feminine musk"; + } + }; + + defaults["victim-breast-crush"] = function (macro) { + if (isSadistic(macro)) { + return "reduced to broken gore beneath your breasts"; + } else if (isGory(macro)) { + return "crushed to death by your bosom"; + } else if (isFatal(macro)) { + return "flattened under your heavy breasts"; + } else if (isNonFatal(macro)) { + return "smooshed by your breasts"; + } + }; + + defaults["victim-cleavage-crush"] = function (macro) { + if (isSadistic(macro)) { + return "cracked open like gore-filled nuts between your breasts"; + } else if (isGory(macro)) { + return "crushed to paste between your breasts"; + } else if (isFatal(macro)) { + return "smashed between your breasts"; + } else if (isNonFatal(macro)) { + return "squeezed between your breasts"; + } + }; + + defaults["victim-cleavage-absorb"] = function (macro) { + if (isSadistic(macro)) { + return "agonizingly absorbed into your greedy bosom"; + } else if (isGory(macro)) { + return "absorbed into your greedy breasts"; + } else if (isFatal(macro)) { + return "absorbed by your breasts"; + } else if (isNonFatal(macro)) { + return "pulled into your breasts"; + } + }; + + defaults["victim-cleavage-drop"] = function (macro) { + if (isSadistic(macro)) { + return "dropped from your cleavage and dashed to bloody bits"; + } else if (isGory(macro)) { + return "dropped from your cleavage to their deaths"; + } else if (isFatal(macro)) { + return "dropped from your cleavage and smashed"; + } else if (isNonFatal(macro)) { + return "dropped from your cleavage"; + } + }; + + defaults["victim-milk-flood"] = function (macro) { + if (isSadistic(macro)) { + return "drenched in and dissolved by your milk"; + } else if (isGory(macro)) { + return "drowned in your milk"; + } else if (isFatal(macro)) { + return "washed away by your milk"; + } else if (isNonFatal(macro)) { + return "flooded in your milk"; + } + }; + + defaults["victim-breast-vore"] = function (macro) { + if (isSadistic(macro)) { + return "fed into your breasts to be churned and obliterated"; + } else if (isGory(macro)) { + return "shoved into your greedy bosom and lost for good"; + } else if (isFatal(macro)) { + return "stuffed into your breasts to be absorbed"; + } else if (isNonFatal(macro)) { + return "slipped into your nipples"; + } + }; + + defaults["victim-pouch-absorb"] = function (macro) { + if (isSadistic(macro)) { + return "crushed, torn, and absorbed by your perilous pouch"; + } else if (isGory(macro)) { + return "smothered and soaked into the walls of your pouch"; + } else if (isFatal(macro)) { + return "claimed by your pouch"; + } else if (isNonFatal(macro)) { + return "absorbed into your pouch"; + } + }; + + defaults["victim-soul-digest"] = function (macro) { + switch (macro.soulVoreType) { + case "release": + return "souls freed from your depths"; + case "body": + return "souls imprisoned in your body for good"; + case "oblivion": + return "souls annihilated for eternity"; + } + }; + + defaults["victim-soul-paw"] = function (macro) { + switch (macro.soulVoreType) { + case "release": + return "souls briefly trapped in your paws"; + case "body": + return "souls claimed forever by your paws"; + case "oblivion": + return "souls annihilated in your paws"; + } + }; + + defaults["victim-paw-stench"] = function (macro) { + if (isSadistic(macro)) { + return ( + "corroded and melted alive by the stench of your " + + macro.footDesc(true) + ); + } else if (isGory(macro)) { + return ( + "suffocated by the powerful stench of your " + macro.footDesc(true) + ); + } else if (isFatal(macro)) { + return "snuffed out by the scent of your " + macro.footDesc(true); + } else if (isNonFatal(macro)) { + return "sickened by the smell of your " + macro.footDesc(true); + } + }; + + defaults["victim-ass-stench"] = function (macro) { + if (isSadistic(macro)) { + return "reduced to bubbling flesh by the caustic scent of your ass"; + } else if (isGory(macro)) { + return "suffocated by the rank odor of your ass"; + } else if (isFatal(macro)) { + return "snuffed out by the scent of your ass"; + } else if (isNonFatal(macro)) { + return "sickened by the smell of your butt"; + } + }; + + defaults["victim-gas-belch"] = function (macro) { + if (isSadistic(macro)) { + return "dissolved by your rich, acidic belches"; + } else if (isGory(macro)) { + return "corroded by your acrid belches"; + } else if (isFatal(macro)) { + return "slain by your foul, deafening belches"; + } else if (isNonFatal(macro)) { + return "knocked out by your belches"; + } + }; + + defaults["victim-gas-fart"] = function (macro) { + if (isSadistic(macro)) { + return "burned alive and melted down by your farts"; + } else if (isGory(macro)) { + return "dissolved by your caustic farts"; + } else if (isFatal(macro)) { + return "inundated in the miasma of your farts"; + } else if (isNonFatal(macro)) { + return "knocked out by your farts"; + } + }; + + defaults["victim-piss"] = function (macro) { + if (isSadistic(macro)) { + return "drowned and dissolved in acrid piss"; + } else if (isGory(macro)) { + return "drowned in your acrid piss"; + } else if (isFatal(macro)) { + return "inundated in hot piss"; + } else if (isNonFatal(macro)) { + return "flooded with your piss"; + } + }; + + defaults["victim-bladder-vore"] = function (macro) { + if (isSadistic(macro)) { + return "dissolved in a golden-yellow sea of searing piss"; + } else if (isGory(macro)) { + return "digested in your bladder and pissed out"; + } else if (isFatal(macro)) { + return "dissolved in your bladder"; + } else if (isNonFatal(macro)) { + return "absorbed into your bladder"; + } + }; + + defaults["victim-piss-stench"] = function (macro) { + if (isSadistic(macro)) { + return "rent asunder by the miasma wafting from your piss"; + } else if (isGory(macro)) { + return "corroded and consumed by the stench of your piss"; + } else if (isFatal(macro)) { + return "snuffed out by the stench of your piss"; + } else if (isNonFatal(macro)) { + return "sickeded by your smelly piss"; + } + }; + + defaults["victim-scat"] = function (macro) { + if (isSadistic(macro)) { + return "buried alive and dissolved by your acrid shit"; + } else if (isGory(macro)) { + return "crushed beneath your scat"; + } else if (isFatal(macro)) { + return "flattened by your scat"; + } else if (isNonFatal(macro)) { + return "trapped under your scat"; + } + }; + + defaults["victim-scat-stench"] = function (macro) { + if (isSadistic(macro)) { + return "melted into slag by the wretched miasma of your scat"; + } else if (isGory(macro)) { + return "killed by the overwhelming smell of your scat"; + } else if (isFatal(macro)) { + return "snuffed out by your scat's stench"; + } else if (isNonFatal(macro)) { + return "sickened by your scat"; + } + }; + + defaults["victim-goo"] = function (macro) { + if (isSadistic(macro)) { + return "shredded and soaked up by your goo"; + } else if (isGory(macro)) { + return "digested and dissolved into your goo"; + } else if (isFatal(macro)) { + return "dissolved in your goo"; + } else if (isNonFatal(macro)) { + return "turned into more of your goo"; + } + }; + + defaults["victim-paw-vore"] = function (macro) { + if (isSadistic(macro)) { + return ( + "broken down and absorbed directly into your " + + macro.footOnlyDesc(true) + ); + } else if (isGory(macro)) { + return "crushed under and sucked into your " + macro.footOnlyDesc(true); + } else if (isFatal(macro)) { + return "absorbed by your greedy " + macro.footOnlyDesc(true); + } else if (isNonFatal(macro)) { + return "absorbed into your " + macro.footOnlyDesc(true); + } + }; + + defaults["victim-breath-fire"] = function (macro) { + if (isSadistic(macro)) { + return "cooked alive and reduced to ash by your flaming breath"; + } else if (isGory(macro)) { + return "burned alive by your fiery breath"; + } else if (isFatal(macro)) { + return "burned by your scorching breath"; + } else if (isNonFatal(macro)) { + return "singed by your breath"; + } + }; + + defaults["victim-breath-ice"] = function (macro) { + if (isSadistic(macro)) { + return "flash-frozen by your breath and shattered into gory dust"; + } else if (isGory(macro)) { + return "fatally frozen by your icy breath"; + } else if (isFatal(macro)) { + return "turned to ice sculptures by your breath"; + } else if (isNonFatal(macro)) { + return "frozen by your breath"; + } + }; + + defaults["victim-breath-electric"] = function (macro) { + if (isSadistic(macro)) { + return "blasted into bloody sludge by your shocking breath"; + } else if (isGory(macro)) { + return "electrocuted by your electric breath"; + } else if (isFatal(macro)) { + return "fried by your shocking breath"; + } else if (isNonFatal(macro)) { + return "zapped by your electric breath"; + } + }; + + defaults["victim-breath-smoke"] = function (macro) { + if (isSadistic(macro)) { + return "cooked alive and cauterized by your smoky breath"; + } else if (isGory(macro)) { + return "suffocated by your hot, smoky breath"; + } else if (isFatal(macro)) { + return "snuffed out by smoky breath"; + } else if (isNonFatal(macro)) { + return "singed by your smoky breath"; + } + }; + + defaults["victim-breath-radiation"] = function (macro) { + if (isSadistic(macro)) { + return "reduced to bubbling, glowing sludge by your radioactive breath"; + } else if (isGory(macro)) { + return "cooked alive by your radioactive breath"; + } else if (isFatal(macro)) { + return "nuked by your radioactive breath"; + } else if (isNonFatal(macro)) { + return "mutated by your radioactive breath"; + } + }; + + defaults["victim-breath-foul"] = function (macro) { + if (isSadistic(macro)) { + return "suffocated and slain by thick, miasmic breath"; + } else if (isGory(macro)) { + return "snuffed out by your foul breath"; + } else if (isFatal(macro)) { + return "slain by your foul breath"; + } else if (isNonFatal(macro)) { + return "sickened by your smelly breath"; + } + }; + + defaults["victim-wings-flap"] = function (macro) { + if (isSadistic(macro)) { + return "ripped asunder by gusts from your mighty wings"; + } else if (isGory(macro)) { + return "thrown and dashed to bits by your sweeping wings"; + } else if (isFatal(macro)) { + return "thrown away by your swooping wings"; + } else if (isNonFatal(macro)) { + return "blown away by your wings"; + } + }; + + defaults["victim-wings-vore"] = function (macro) { + if (isSadistic(macro)) { + return "shrink-wrapped in your wings and dissolved"; + } else if (isGory(macro)) { + return "wrapped up in your airless wings and digested"; + } else if (isFatal(macro)) { + return "snared in your wings and digested"; + } else if (isNonFatal(macro)) { + return "trapped in your wings"; + } + }; } -defaults["foreskin-clench"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You squeeze your foreskin."; - else if (isGory(macro)) - return "You squeeze your foreskin, reducing " + container.describeSimple(flat) + " to a gory paste that slickens your throbbing shaft."; - else if (isFatal(macro)) - return "Your fingers run over your packed foreskin, squeezing on the " + macro.describeDick + " within and smashing " + container.describeSimple(flat); - else - return "Your squeeze your foreskin, pushing " + container.describeSimple(flat) + " out of your foreskin."; -} +// eat -defaults["foreskin-crush"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your orgasm causes your " + macro.describeDick + " to swell and surge."; - else if (isGory(macro)) - return "Your powerful orgasm causes your throbbing " + macro.describeDick + " to swell and crush the life from everything in your foreskin, reducing " + container.describeSimple(flat) + " to a gory paste that slickens your spurting shaft."; - else if (isFatal(macro)) - return "Your orgasm causes your " + macro.describeDick + " to throb and swell, smashing " + container.describeSimple(flat) + " trapped in your musky foreskin."; - else - return "Your orgasm causes your " + macro.describeDick + " to swell, squeezing " + container.describeSimple(flat) + " out from your foreskin."; -} +{ + rules["eat"].push({ + test: function (container, macro) { + return hasNothing(container); + }, + desc: function (container, macro, verbose, flat) { + return "You scoop up...nothing. Oh well."; + }, + }); -defaults["foreskin-absorb"] = function (container, macro, verbose, flat) { - if (container.count > 0) - return "You grip your cock and give it a firm squeeze, abruptly absorbing " + container.describeSimple(flat) + " into your musky foreskin."; - else - return defaultForeskinToy(container, macro, verbose, flat); -} + rules["eat"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasLessThan(container, "Person", 6) && + macro.height >= 10 + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You pluck up " + + container.describe() + + " and stuff them into your mouth, swallowing lightly to drag them down to your bubbling guts." + ); + }, + }); -defaults["cock-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and grind them against your cock...but they won't fit."; - else - return "You stuff " + container.describe(verbose) + " into your throbbing shaft, forcing them down to your heavy balls."; -} + rules["eat"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + macro.height < 10 + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You grasp " + + container.describe() + + " and greedily wolf them down, swallowing forcefully to cram them into your bulging stomach. A crass belch escapes your lips as they curl up in your slimy gut." + ); + }, + }); -defaults["cockslap"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your " + macro.describeDick + " swings through the air. Lewd!"; - else if (isFatal(macro)) - return "Your swaying " + macro.describeDick + " crushes " + container.describe(verbose) + ". "; - else - return "You smack " + container.describe(verbose) + " with your " + macro.describeDick + "."; -} + rules["eat"].push({ + test: function (container, macro) { + return hasExactly(container, "Car", 1); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You crush " + + container.describe(verbose) + + " with your tight throat, washing it down with its former passengers." + ); + }, + }); -defaults["ball-smother"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You rest your heavy balls on the ground."; - else if (isFatal(macro)) - return "Your weighty balls spread over " + container.describe(verbose) + ", drowning them in musk."; - else - return "Your weighty balls spread over " + container.describe(verbose) + "."; -} + rules["eat"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Macro", 1) && nothingLarger(container, "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" + ) + + " 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." + ) + ); + }, + }); -defaults["male-spurt"] = function (container, macro, verbose, flat) { - if (container.count == 0) - 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 $VOLUMEs of slick musky fluid."; - else - return "Your " + macro.describeDick + " spurts precum, splooging " + container.describe(verbose) + " in $VOLUMEs of slick musky fluid."; -} + rules["eat"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Small Skyscraper", 1) && + nothingLarger(container, "Small Skyscraper") && + macro.height < 500 + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You drop onto your hands and knees, " + + macro.jawDesc(true) + + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\ + and you suckle on it for a long moment before twisting your head to snap it loose. The entire building, along with " + + describe_all(container.contents["Small Skyscraper"].contents, verbose) + + "\ + within, plunge into your roiling guts. You wash it down with some delicious treats you slurped up along with it - " + + describe_all(container.contents, verbose, ["Small Skyscraper"]) + + "." + ); + }, + }); -defaults["male-orgasm"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your " + macro.describeDick + " spurts, gushing out a $VOLUME glob of cum."; - else if (isFatal(macro)) - return "You're cumming! Your " + macro.describeDick + " erupts, obliterating " + container.describe(verbose) + " in a $VOLUME-torrent of cum."; - else - return "You're cumming! Your " + macro.describeDick + " spews a thick rope of seed, splooging " + container.describe(verbose) + " in a $VOLUME-torrent of cum."; -} + rules["eat"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Small Skyscraper", 2) && + nothingLarger(container, "Small Skyscraper") && + macro.height < 750 + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You drop onto your hands and knees, " + + macro.jawDesc(true) + + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\ + and you suckle on it for a long moment before twisting your head to snap it loose. Without missing a beat, you rise back up, sloppy tongue slathering over the side \ + of the remaining tower, sucking on its tip and roughly shoving it into your maw. It breaks from its foundation, vanishing past your lips as you use two fingers to shove it \ + down your sultry throat. Your gut bubbles as " + + describe_all(container.contents["Small Skyscraper"].contents, verbose) + + " are crunched and crushed within, along with the \ + " + + describe_all(container.contents, verbose, ["Small Skyscraper"]) + + " that were unfortunate enough to be caught up by your slimy tongue." + ); + }, + }); -defaults["female-spurt"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your moist slit splatters $VOLUME of slick juices."; - else if (isSadistic(macro)) - return "Your dripping slit splatters $VOLUME of your intoxicating juices, dissolving " + container.describe(verbose) + "."; - else if (isFatal(macro)) - return "Your moist slit splatters $VOLUME of slick juices, drowning " + container.describe(verbose) + " in your building lust."; - else - return "Your moist slit splatters $VOLUME of slick juices, splooging " + container.describe(verbose) + "."; -} + rules["eat"].push({ + test: (container, macro) => { + return ( + hasExactly(container, "Planet", 1) && nothingLarger(container, "Planet") + ); + }, + desc: (container, macro, verbose, flat) => { + return [ + "Your colossal", + macro.jawDesc(true), + "yawn wide as you drift towards the planet, blotting out the sun in the shadow of your terrifying maw. Your tongue curls along the underside of your snack's crust, slathering it in drool and gently tugging it towards you. Cracks and quakes rock the fragile crust; your body's overwhelming gravity alone is enough to stretch and warp the planet. Before long, it is entombed within your", + macro.jawDesc(true), + "and, a heartbeat later, a massive GLURKH drags it into your gullet.", + ].join(" "); + }, + }); -defaults["female-orgasm"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "Your moist slit gushes $VOLUME of slick femcum."; - else if (isSadistic(macro)) - return "Your quivering slit sprays $VOLUME of your intoxicating femcum, dissolving " + container.describe(verbose) + " in an unstoppable torrent of deadly lust."; - else if (isFatal(macro)) - return "Your moist slit sprays $VOLUME of slick femcum, obliterating " + container.describe(verbose) + " in a torrent of nectar."; - else - return "Your moist slit sprays $VOLUME of slick femcum, splooging " + container.describe(verbose) + " as you swoon with orgasmic lust."; + rules["eat"].push({ + test: (container, macro) => + hasAtleast(container, "Planet", 3) && + hasLessThan(container, "Planet", 15) && + nothingLarger(container, "Planet"), + desc: (container, macro, verbose, flat) => + [ + "You scoop up a plethora of planets, popping them into your", + macro.jawDesc(true), + "like the finger-food they've become, tugging each one into your gullet - and on an irreversible one-way journey to your gut - with little gluks and gulps, sealing away all", + container.contents["Planet"].count, + "of them within your cosmic body.", + ].join(" "), + }); } -defaults["grind"] = function (container, macro, verbose, flat) { - var mid = isFatal(macro) ? ", smashing them apart" : ", using them as a toy"; - 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 + " and " + macro.describeVagina + " slit against " + desc; - } else if (macro.maleParts && !macro.femaleParts) { - return "You grind your " + macro.describeDick + " against " + desc; - } else if (!macro.maleParts && macro.femaleParts) { - return "You grind your " + macro.describeVagina + " slit against " + desc; - } else { - return "You grind your hips against " + desc; - } -} +// chew -defaults["pouch-stuff"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You grab " + (macro.victimsHuman ? new Human(1).describe(verbose) : new Person(1).describe(verbose)) + " and stuff them against your pouch...but they won't fit!"; - else - return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your pouch."; -} +{ + rules["chew"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro) && + macro.height < 5 + ); + }, + desc: function (container, macro, verbose, flat) { + 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." + ); + }, + }); -defaults["pouch-rub"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You rub your empty pouch."; - else - return "You rub your bulging pouch, feeling at " + container.describeSimple(flat) + " trapped within."; -} - -defaults["pouch-eat"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "There's nothing in your pouch!"; - else - return "You snatch " + container.describe(verbose) + " from your pouch and shove " + (container.count > 1 ? "them" : "it") + " down your gullet!"; -} - -defaults["pouch-absorb"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "There's nothing in your pouch!"; - else - return "Your pouch flattens as it absorbs " + container.describeSimple(flat); -} - -defaults["soul-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "No souls here."; - else - return "You open your " + macro.jawDesc(true) + " and inhale, ripping the souls from " + container.describe(verbose) + " and dragging them down deep inside."; -} - -defaults["soul-absorb-paw"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (container.count == 0) - return "Your " + macro.footDesc() + " thumps against the ground"; - else if (sum == 0) - return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + "...but there aren't any souls within!"; - else - return "Your " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing them to pieces and absorbing " + sum + (sum == 1 ? " soul" : " souls") + " into your pads."; -} - -defaults["paw-stench"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Horrific miasma flows from your " + macro.footDesc(true) + ", the corrosive fumes reducing " + (sum > 1 ? sum + " people" : "a person") + " to charred flesh as they wash over " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Vile fumes waft from your " + macro.footDesc(true) + " , choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your stinky " + macro.footDesc(true) + " overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["ass-stench"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Rancid fumes from your ass sear the flesh of " + (sum > 1 ? sum + " people" : "a person") + " as they wash over " + container.describeSimple(flat) + ", corroding everything in their path."; - if (isFatal(macro)) - return "Vile miasma from your bitter ass snuffs out " + (sum > 1 ? sum + " people" : "a person") + ", suffocating them in your stench."; - else - return "Your stinky butt sickens " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["piss-stench"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive fumes waft from your piss, the toxic cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Vile fumes waft from your piss, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your stinky piss overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["scat-stench"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "A rancid miasma spews from your shit - a thick, choking avalanche of toxic vapors that reduce " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " to nothing but bones as it melts " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Vile fumes waft from your scat, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your stinky scat overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["male-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your shaft, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your shaft, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your masculine musk overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["female-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your slit, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your slit, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your feminine musk overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["male-spurt-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your precum, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your musky precum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["female-spurt-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your precum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your precum, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your musky precum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["male-orgasm-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your cum, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your musky cum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["female-orgasm-musk"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (isSadistic(macro)) - return "Waves of corrosive musk waft from your cum, the bitter cloud liquefying the flesh of " + (sum > 1 ? numberRough(sum, "of") + " people" : "a person") + " as it dissolves " + container.describeSimple(flat) + "."; - if (isFatal(macro)) - return "Powerful musk wafts from your cum, choking the life from " + (sum > 1 ? sum + " people." : "a person."); - else - return "Your musky cum overwhelms " + (sum > 1 ? sum + " people" : "a person") + " with your scent!"; -} - -defaults["belch"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (container.count == 0) - return "An ominous groan precedes a crass belch."; - if (isSadistic(macro)) - return "A disgusting torrent of gas erupts from your rancid stomach, the vile green gale stopping hearts and burning flesh as it annihilates " + container.describe(verbose) + "."; - if (isFatal(macro)) - return "A rancid belch flows from your " + macro.jawDesc(verbose) + ", corroding " + container.describe(verbose) + " with your vile fumes."; - else - return "You let out a loud burp, blowing over " + container.describe(verbose) + "!"; -} - -defaults["fart"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (container.count == 0) - return "An ominous groan precedes a loud, pungent fart."; - if (isSadistic(macro)) - return "Your intestines snarl and lurch, expelling a powerful jet of utterly rancid stench from your bitter ass. The plume gushes over " + container.describe(verbose) + ", ending " + (sum > 1 ? sum + " lives" : "a life") + " and annihilating everything in its path."; - if (isFatal(macro)) - return "An ominous groan precedes a loud, pungent fart, corroding " + container.describe(verbose) + " with truly vile vapors."; - else - return "You let out a crass fart, blowing over " + container.describe(verbose) + "!"; -} - -defaults["stomach"] = function (container, macro, verbose, flat) { - if (isSadistic(macro)) - return [ - "Your", - pickString("churning gut", "graveyard of a stomach", "fatal belly"), - pickString("crushes", "grinds", "mulches"), - "your prey into a gory paste,", - pickStringChance(0.5, "utterly", "completely"), - "annihilating", - container.describeSimple(flat), - "and", - pickStringChance(0.5, "swiftly"), - "reducing everything within to", - pickString("rancid", "putrid", "horrifying"), - pickString("sludge.", "slop.") - ].filter(Boolean).join(" "); - else if (isGory(macro)) - return [ - "Your caustic stomach", - pickString("crushes", "grinds"), - container.describeSimple(flat), - "to a gory pulp." - ].filter(Boolean).join(" "); - else if (isFatal(macro)) - return [ - "Your stomach", - pickString("gurgles", "snarls", "sloshes"), - "as it digests", - container.describeSimple(flat) + "." - ].filter(Boolean).join(" "); - else - return [ - "Your stomach", - pickString("squeezes", "groans", "shifts"), - "and absorbs", - container.describeSimple(flat) + "." - ].filter(Boolean).join(" "); -} - -defaults["tail"] = function (container, macro, verbose, flat) { - if (isSadistic(macro)) - return "Your " + macro.tailDesc + " " + (macro.tailCount > 1 ? "clench" : "clenches") + ", crushing " + container.describeSimple(flat) + " into unrecognizable paste."; - else if (isGory(macro)) - return "Your fatal " + (macro.tailCount > 1 ? "tails crush " : "tail crushes ") + container.describeSimple(flat) + " to a gory pulp."; - else if (isFatal(macro)) - return "Your " + (macro.tailCount > 1 ? "tails gurgles as they digest " : "tail gurgles as it digests ") + container.describeSimple(flat) + "."; - else - return "Your " + (macro.tailCount > 1 ? "tails groan and absorb " : "tail groans and absorbs ") + container.describeSimple(flat) + "."; -} - -defaults["tail-to-stomach"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) - return "Your " + (macro.tailCount > 1 ? "tails clench" : "tail clenches") + ", squeezing " + container.describeSimple(flat) + " into your gurgling stomach."; - else - return "Your " + (macro.tailCount > 1 ? "tails squeeze" : "tail squeezes") + " " + container.describeSimple(flat) + " into your belly."; -} - -defaults["bowels"] = function (container, macro, verbose, flat) { - if (isSadistic(macro)) - return "Your rancid bowels clench and churn, crushing " + container.describeSimple(flat) + " into a paste of gore and rubble - and then swiftly absorbing everything."; - if (isFatal(macro)) - return "Your bowels churn as they melt down " + container.describeSimple(flat) + " and absorb them into your body"; - else - return "Your bowels churn as they absorb " + container.describeSimple(flat); -} - -defaults["bowels-to-stomach"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) - return "Your bowels clench, forcing " + container.describeSimple(flat) + " into your roiling, caustic stomach."; - else - return "Your bowels clench, squeezing " + container.describeSimple(flat) + " into your belly."; -} - -defaults["womb"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) - return "Your womb squeezes and dissolves " + container.describeSimple(flat) + ", turning them into $VOLUME of slick femcum."; - else - return "Your womb squeezes as it absorbs " + container.describeSimple(flat); -} - -defaults["balls"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) - return "Your balls slosh as they digest " + container.describeSimple(flat) + " into $VOLUME of cum"; - else - return "Your balls slosh as they absorb " + container.describeSimple(flat); -} - -defaults["breasts"] = function (container, macro, verbose, flat) { - if (isFatal(macro) && macro.lactationEnabled) - return "Your breasts grrgle as they digest " + container.describeSimple(flat) + " into $VOLUME of milk"; - else - return "Your breasts slosh as they absorb " + container.describeSimple(flat); -} - -defaults["bladder"] = function (container, macro, verbose, flat) { - if (isSadistic(macro)) { - let fatalities = get_living_prey(container.sum()); - let line = "Your bladder swells as " + container.describeSimple(flat) + " are dissolved in your acrid piss, digesting them down to $VOLUME of fresh urine"; - if (fatalities > 0) { - line += " " + (fatalities > 1 ? fatalities + " lives are" : "a life is") + " snuffed out by the horrific yellow tide, corroded and annihilated amongst the unbearable stench of urine."; - } - return line; - } else if (isFatal(macro)) - return "Your bladder swells as it dissolves " + container.describeSimple(flat) + " into $VOLUME of acrid piss"; - else - return "Your bladder squeezes as it absorbs " + container.describeSimple(flat); -} - -defaults["soul-digest"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - switch (macro.soulVoreType) { - case "release": - return (sum > 1 ? sum + " souls escape" : "A soul escapes") + " your depths."; - case "body": - return "Your body claims " + (sum > 1 ? sum + " souls" : "a soul") + ", imprisoning " + (sum > 1 ? "them" : "it") + " in your body for good."; - case "oblivion": - return "Energy washes through your depths as you annihilate " + (sum > 1 ? sum + " souls" : "a soul") + ", crushing " + (sum > 1 ? "them" : "it") + " into nothingness."; - } -} - -defaults["wings"] = function (container, macro, verbose, flat) { - if (isSadistic(macro)) - return "Your " + macro.wingDesc + " wings slacken as the " + container.describeSimple(flat) + " within melts into a slurry of meat and wreckage."; - if (isFatal(macro)) - return "Your " + macro.wingDesc + " wings squeeze tightly as they absorb " + container.describeSimple(flat) + " into your body"; - else - return "Your " + macro.wingDesc + " wings squeeze as they absorb " + container.describeSimple(flat); -} - -defaults["wings-to-stomach"] = function (container, macro, verbose, flat) { - if (isFatal(macro)) - return "Your " + macro.wingDesc + " wings clench, forcing " + container.describeSimple(flat) + " deeper and into your stomach."; - else - return "Your " + macro.wingDesc + " wings squeeze " + container.describeSimple(flat) + " into your belly."; -} - -defaults["wear-shoe"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You slip on your " + macro.shoeDesc(true, false) + "."; - } else { - return "You slip on your " + macro.shoeDesc(true, false) + ", " + macro.toeDesc(true) + " wriggling against " + container.describeSimple(flat) + " trapped within!"; - } -} - -defaults["remove-shoe"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You pull off your " + macro.shoeDesc(true, false) + "."; - } else { - return "You pull off your " + macro.shoeDesc(true, false) + ", " + macro.toeDesc(true) + " rubbing against " + container.describeSimple(flat) + " on the way out."; - } -} - -defaults["wear-sock"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You slip on your " + macro.sockDesc(true, false) + "."; - } else { - return "You slip on your " + macro.sockDesc(true, false) + ", " + macro.toeDesc(true) + " grinding against " + container.describeSimple(flat) + " trapped in the cotton tube!"; - } -} - -defaults["remove-sock"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You pull off your " + macro.sockDesc(true, false) + ". Cool air washes over your " + macro.toeOnlyDesc(true); - } else { - return "You pull off your " + macro.sockDesc(true, false) + ", leaving " + container.describeSimple(flat) + " trapped at the bottom."; - } -} - -defaults["stuff-shoe"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You don't have anything to stuff into your " + macro.shoeDesc(true) + "."; - } else { - return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your " + macro.shoeDesc(true) + "!"; - } -} - -defaults["stuff-sock"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You don't have anything to stuff into your " + macro.sockDesc(true) + "."; - } else { - return "You grab " + container.describe(verbose) + " and stuff " + (container.count > 1 ? "them" : "it") + " into your " + macro.sockDesc(true) + "!"; - } -} - -defaults["dump-shoe"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your " + macro.shoeDesc(true) + " are empty, silly."; - } else { - return "You shake out your " + macro.shoeDesc(true) + ", dumping " + container.describeSimple(flat) + " onto the ground."; - } -} - -defaults["dump-sock"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You don't have anything to stuff into your " + macro.sockDesc(true) + "."; - } else { - return "You turn your " + macro.shoeDesc(true) + " inside-out, dumping " + container.describeSimple(flat) + " onto the ground."; - } -} - -defaults["piss"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return [ - "You sigh with relief as", - "$VOLUME", - "of piss erupts from", - macro.maleParts ? "your " + macro.describeDick + "." : "between your legs." - ].filter(Boolean).join(" ") - } - else if (isSadistic(macro)) { - return [ - "You sigh with relief as", - "$VOLUME", - "of hot,", - pickString("rancid", "steaming", "fuming"), - "piss erupts from", - macro.maleParts ? "your " + macro.describeDick + "," : "between your legs,", - "inundating", - container.describe(verbose), - "and melting", - (container.count > 1 ? "them" : "it"), - "them down to a boiling", - pickString("slurry of molten prey", "stew", "heap of charred slag"), - pickString("in mere seconds", "with terrifying speed", "like " + (container.count > 1 ? "they were" : "it was") + " tissue paper") - ].filter(Boolean).join(" ") - } - else { - return [ - "You sigh with relief as", - "$VOLUME", - "of piss erupts from", - macro.maleParts ? "your " + macro.describeDick + "," : "between your legs,", - "spraying down", - container.describe(verbose), - "in a shower of golden, musky fluid." - ].filter(Boolean).join(" ") - } -} - -defaults["bladder-vore"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "You don't have anything to shove into your bladder!"; - } - else { - if (macro.maleParts) { - return "You snatch up " + container.describe(verbose) + " and stuff them into your " + macro.describeDick + ", grinding them to its base and forcing them into your musky bladder."; - } else if (macro.femaleParts) { - return "You snatch " + container.describe(verbose) + " in your iron grip, grinding them against your " + macro.describeVagina + " slit before stuffing them into your urethra, sealing them away in your musky bladder."; - } else { - return "You grab " + container.describe(verbose) + " and grind them between your legs, slipping them into your urethra and imprisoning them in your bladder."; - } - } -} - -defaults["scat"] = function (container, macro, verbose, flat) { - let sum = get_living_prey(container.sum()); - if (macro.scatStorage.amount == 0) { - return "Your bowels are empty."; - } else if (container.count == 0) { - return "You squat down and let out a $MASS log of shit."; - } else if (isSadistic(macro)) { - let line = "You squat down, letting out a grunt as your rancid bowels force out a $MASS, $LENGTH-long heap of shit. The fatally-pungent scat buries " + container.describe(verbose) + ", ending " + numberRough(sum, "of") + (sum > 1 ? " lives" : " life") + " and entombing them in your shit."; - if (macro.scatStorage.victims.count > 0) { - line += " Embedded in the vomit-inducing heap are the mangled, crushed remains of " + listSum(macro.scatStorage.victims.sum()) + ", " + numberRough(get_living_prey(macro.scatStorage.victims.sum()), "of") + " living creatures converted to noxious scat by your disgusting depths."; - } - return line; - } else if (macro.brutality > 0 && macro.scatStorage.victims.count > 0) { - return "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + container.describe(verbose) + ". Embedded in the thick, chunky waste are the remains of " + listSum(macro.scatStorage.victims.sum()) + ", now little more than bones and wreckage in your shit."; - } else { - return "You squat down, grunting as your lower guts squeeze out a $MASS, $LENGTH-long log of scat that smothers " + container.describe(verbose); - } -} - -defaults["melt"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your body turns gooey."; - } else { - return "Your body turns gooey, sucking " + container.describeSimple(flat) + " into your molten self."; - } - -} - -defaults["solidify"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your body turns solid."; - } else if (macro.gooDigest > 0) { - return "Your body turns solid, pushing out " + container.describeSimple(flat) + "."; - } else { - return "Your body turns solid, swiftly absorbing " + container.describeSimple(flat) + "."; - } -} - -defaults["flood"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your gooey body melts and floods outward..but doesn't catch anything."; - } else { - return "Your gooey body melts and floods outward, burying " + container.describe(verbose) + " in your thick, slimy self. You slowly reform, grinning as you feel " + numberRough(get_living_prey(container.sum()), "of") + " prey sloshing about within."; - } -} - -defaults["stomp-goo"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your gooey paw hits the ground."; - } else { - return "Your gooey paws falls over " + container.describe(verbose) + ", smothering them in goo and pulling them into your body."; - } -} - -defaults["ass-goo"] = function (container, macro, verbose, flat) { - if (container.count == 0) { - return "Your gooey ass sits down on the ground."; - } else { - return "You sit your gooey ass down on " + container.describe(verbose) + ", pulling them right into your body."; - } -} - -defaults["goo-digest"] = function (container, macro, verbose, flat) { - return "Your goopy depths dissolve " + container.describeSimple(flat) + "."; -} - -defaults["goo-stomach-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your stomach, drawing them into the viscous goo."; -} - -defaults["goo-stomach-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your gurgling stomach."; -} - -defaults["goo-bowels-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your bowels, drawing them into the viscous goo."; -} - -defaults["goo-bowels-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your clenching bowels."; -} - -defaults["goo-womb-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your womb, drawing them into the viscous goo."; -} - -defaults["goo-womb-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your slick womb."; -} - -defaults["goo-balls-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your balls, drawing them into the viscous goo."; -} - -defaults["goo-balls-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your musky balls."; -} - -defaults["goo-breasts-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your breasts, drawing them into the viscous goo."; -} - -defaults["goo-breasts-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your breasts."; -} - -defaults["goo-tail-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your " + macro.tailDesc + ", drawing them into the viscous goo."; -} - -defaults["goo-tail-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your " + macro.tailDesc; -} - -defaults["goo-paws-pull"] = function (container, macro, verbose, flat) { - return "Your molten depths squeeze in around the " + container.describeSimple(flat) + " imprisoned in your " + macro.footOnlyDesc(true) + ", drawing them into the viscous goo."; -} - -defaults["goo-paws-push"] = function (container, macro, verobse) { - return "Your churning goo herds " + container.describeSimple(flat) + " into your " + macro.footOnlyDesc(true) + "."; -} - -defaults["paw-vore"] = function (container, macro, verbose, flat) { - return "Your " + macro.footOnlyDesc(true) + " smother over " + container.describeSimple(flat) + ", absorbing them into your soles!"; -} - -defaults["paw-vore-toes"] = function (container, macro, verbose, flat) { - return "The " + container.describeSimple(flat) + " trapped between your toes " + (container.count > 1 ? "are" : "is") + " sucked inside."; -} - -defaults["paws"] = function (container, macro, verbose, flat) { - return "Your " + macro.footOnlyDesc(true) + " fully absorb " + container.describeSimple(flat) + "."; -} - -defaults["crop-swallow"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You reach down for a delicious treat and grab - oh, nothing."; - else - return "You scoop up " + container.describe(verbose) + " and swallow " + (container.count > 1 ? "them" : "it") + " whole, pulling your prey into your crop."; -} - -defaults["crop-transfer"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "You have nothing in your crop"; - else - return "Your throat squeezes, forcing " + container.describe(verbose) + " out of your crop and in to your stomach."; -} - -function nonFatalBreath(container, macro, verbose, flat, type, verb) { - if (macro.breathStyle == "line") { - return "You exhale a narrow gout of " + type + ", " + verb + " " + container.describe(verbose) + "."; - } else if (macro.breathStyle == "cone") { - return "You exhale a broad cone of " + type + ", " + verb + " " + container.describe(verbose) + "."; - } -} - -defaults["breath-fire"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "fire", "blasting"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "A withering spear of fire gouts from your maw, spearing through " + container.describe(verbose) + " and incinerating it in a torrid display of power."; - } else if (macro.breathStyle == "cone") { - return "You exhale a broad cone of powerful fire, burning " + container.describe(verbose) + " to a crisp in an inescapable tide of flames."; - } - } - - return "FIRE" + container.describe(verbose); -} -defaults["breath-ice"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "cold", "freezing"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "You heave a lance of frigid cold from your gullet, freezing " + container.describe(verbose) + " to the core."; - } else if (macro.breathStyle == "cone") { - return "A blizzard erupts from your maw, flash-freezing " + container.describe(verbose) + ". " + (container.count > 1 ? "They" : "It") + " shatters a heartbeat later, reduced to dust by your power."; - } - } - - return "ICE" + container.describe(verbose); -} - -defaults["breath-electric"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "electricity", "shocking"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "A blinding lance of lightning blasts from your spread " + macro.jawDesc(true) + ", cooking " + container.describe(verbose) + " from the inside out."; - } else if (macro.breathStyle == "cone") { - return "You exhale a brilliant, forking spray of lightning. The flickering bolts arc through " + container.describe(verbose) + ", cooking everything to a crisp."; - } - } - - return "ELECTRIC" + container.describe(verbose); -} - -defaults["breath-smoke"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "smoke", "smothering"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "You part your " + macro.jawDesc(true) + " a touch and blow, casting a thin gout of smoke that envelops " + container.describe(verbose) + ". Your prey is snuffed out like a candle."; - } else if (macro.breathStyle == "cone") { - return "You open wide and exhale. A rolling storm of smoke pours forth, smothering " + container.describe(verbose) + " in a pyroclastic flow."; - } - } - - return "SMOKE" + container.describe(verbose); -} - -defaults["breath-radiation"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "radiation", "frying"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "Your depths pour out a narrow beam of crackling green energy, striking " + container.describe(verbose) + " and frying it to a crisp, turning your prey to dust in the wind."; - } else if (macro.breathStyle == "cone") { - return "You part your " + macro.jawDesc(true) + ", roaring as a massive tide of radiation spews forth. It rolls over " + container.describe(verbose) + ", evaporating " + (container.count > 1 ? "them" : "it") + " in seconds."; - } - } - - return "RADIATION" + container.describe(verbose); -} - -defaults["breath-foul"] = function (container, macro, verbose, flat) { - if (isNonFatal(macro)) { - return nonFatalBreath(container, macro, verbose, flat, "foul air", "withering"); - } - - if (isFatal(macro)) { - if (macro.breathStyle == "line") { - return "You blow a narrow stream of breath, withering " + container.describe(verbose) + " in a focused torrent of foul, humid fumes."; - } else if (macro.breathStyle == "cone") { - return "You yawn wide and sigh, snuffing out " + container.describe(verbose) + " under a tide of hot, humid breath."; - } - } - - return "FOUL" + container.describe(verbose); -} - -defaults["drool"] = function (container, macro, verbose, flat) { - if (container.count == 0) - return "$VOLUME of hot drool oozes from your " + macro.jawDesc(true) + "."; - else if (isFatal(macro)) - return "A rain of slobber falls from your maw, inundating " + container.describe(verbose) + " in $VOLUME of slimy drool."; - else - return "$VOLUME of your drool rains down from your " + macro.jawDesc(true) + ", washing over " + container.describe(verbose) + "."; -} - -defaults["magic-shrink"] = function (container, macro, verbose, flat) { - return "You envelop " + container.describeSimple(flat) + " in swirling tendrils of magic, shrinking " + (container.count == 1 ? "it" : "them") + " down!"; -} - -defaults["wings-flap"] = function (container, macro, verbose, flat) { - if (container.counter == 0) { - return "You flap your " + macro.wingDesc + " wings."; - } else { - return "You flap your " + macro.wingDesc + " wings, blowing away " + container.describe(verbose) + "."; - } -} - -defaults["wings-vore"] = function (container, macro, verbose, flat) { - if (container.counter == 0) { - return "You flap your " + macro.wingDesc + " wings aggressively."; - } else { - return "You spread your " + macro.wingDesc + " wings wide, wrapping them around " + container.describe(verbose) + " and ensnaring them"; - } - -} - -defaults["victim-cum-flood"] = function (macro) { - if (isSadistic(macro)) { - return "drowned in viscous cum"; - } else if (isGory(macro)) { - return "drowned in cum"; - } else if (isFatal(macro)) { - return "smothered in cum"; - } else if (isNonFatal(macro)) { - return "washed away by cum"; - } -} - -defaults["victim-femcum-flood"] = function (macro) { - if (isSadistic(macro)) { - return "drowned in slick femcum"; - } else if (isGory(macro)) { - return "drowned in femcum"; - } else if (isFatal(macro)) { - return "smothered in femcum"; - } else if (isNonFatal(macro)) { - return "washed away by femcum"; - } -} - -defaults["victim-stomped"] = function (macro) { - if (isSadistic(macro)) { - return "crushed into pulp beneath your " + macro.footDesc(true); - } else if (isGory(macro)) { - return "crushed beneath your " + macro.footDesc(true); - } else if (isFatal(macro)) { - return "stomped on"; - } else if (isNonFatal(macro)) { - return "stepped on"; - } -} - -defaults["victim-flex-toes"] = function (macro) { - if (isSadistic(macro)) { - return "ground to a thick paste between your " + macro.toeDesc(true); - } else if (isGory(macro)) { - return "crushed to death between your " + macro.toeDesc(true); - } else if (isFatal(macro)) { - return "crushed between your " + macro.toeDesc(true); - } else if (isNonFatal(macro)) { - return "squeezed in your " + macro.toeDesc(true); - } -} - -defaults["victim-eaten"] = function (macro) { - if (isSadistic(macro)) { - return "devoured and digested down to molten chyme"; - } else if (isGory(macro)) { - return "consumed and digested alive"; - } else if (isFatal(macro)) { - return "devoured alive"; - } else if (isNonFatal(macro)) { - return "swallowed"; - } -} - -defaults["victim-ass-crush"] = function (macro) { - if (isSadistic(macro)) { - return "snuffed out under your ass"; - } else if (isGory(macro)) { - return "crushed by your ass"; - } else if (isFatal(macro)) { - return "flattened under your ass"; - } else if (isNonFatal(macro)) { - return "sat on"; - } -} - -defaults["victim-ass-ground"] = function (macro) { - if (isSadistic(macro)) { - return "ground out of existence beneath your heavy ass"; - } else if (isGory(macro)) { - return "crushed by your grinding ass"; - } else if (isFatal(macro)) { - return "flattened by your grinding ass"; - } else if (isNonFatal(macro)) { - return "ground under your ass"; - } -} - -defaults["victim-humped"] = function (macro) { - if (isSadistic(macro)) { - return "smashed to gory paste by your thrusting hips"; - } else if (isGory(macro)) { - return "crushed to death by your hips"; - } else if (isFatal(macro)) { - return "ground on by your sultry hips"; - } else if (isNonFatal(macro)) { - return "humped"; - } -} - -defaults["victim-vomit"] = function (macro) { - if (isSadistic(macro)) { - return "spewed from your caustic depths and left to die"; - } else if (isGory(macro)) { - return "vomited out in a puddle of acid and chyme"; - } else if (isFatal(macro)) { - return "puked up from your churning guts"; - } else if (isNonFatal(macro)) { - return "horked out"; - } -} - -defaults["victim-chew"] = function (macro) { - if (isSadistic(macro)) { - return "chewed to a bloody pulp by your scything " + macro.jawDesc(true); - } else if (isGory(macro)) { - return "crushed to pulp by your " + macro.jawDesc(true); - } else if (isFatal(macro)) { - return "chewed up in your " + macro.jawDesc(true); - } else if (isNonFatal(macro)) { - return "gnawed on by your " + macro.jawDesc(true); - } -} - -defaults["victim-drool"] = function (macro) { - if (isSadistic(macro)) { - return "inundated in your drool and drowned"; - } else if (isGory(macro)) { - return "swept away by a tide of drool"; - } else if (isFatal(macro)) { - return "flooded in your drool"; - } else if (isNonFatal(macro)) { - return "soaked by your drool"; - } -} - -defaults["victim-anal-vore"] = function (macro) { - if (isSadistic(macro)) { - return "crammed into your bowels and obliterated"; - } else if (isGory(macro)) { - return "shoved into your greedy ass"; - } else if (isFatal(macro)) { - return "slipped into your bowels"; - } else if (isNonFatal(macro)) { - return "used as toys in your ass"; - } -} - -defaults["victim-tail-slap"] = function (macro) { - if (isSadistic(macro)) { - return "cut down like wheat by your swooping, scything " + macro.tailDesc; - } else if (isGory(macro)) { - return "smashed to bloody pieces by your " + macro.tailDesc; - } else if (isFatal(macro)) { - return "leveled by your " + macro.tailDesc; - } else if (isNonFatal(macro)) { - return "thwapped with your " + macro.tailDesc; - } -} - -defaults["victim-tail-vore"] = function (macro) { - if (isSadistic(macro)) { - return "snapped up and devoured by your ravenous " + macro.tailNoDesc; - } else if (isGory(macro)) { - return "swallowed down by your powerful" + macro.tailNoDesc; - } else if (isFatal(macro)) { - return "devoured by your " + macro.tailNoDesc; - } else if (isNonFatal(macro)) { - return "gulped down by your " + macro.tailNoDesc; - } -} - -defaults["victim-cock-slap"] = function (macro) { - if (isSadistic(macro)) { - return "obliterated beneath your massive, swinging shaft."; - } else if (isGory(macro)) { - return "crushed by your cock"; - } else if (isFatal(macro)) { - return "flattened under your dick"; - } else if (isNonFatal(macro)) { - return "smacked with your dick"; - } -} - -defaults["victim-cock-vore"] = function (macro) { - if (isSadistic(macro)) { - return "plunged into the depths of your shaft"; - } else if (isGory(macro)) { - return "devoured by your ravenous cock"; - } else if (isFatal(macro)) { - return "sucked down your shaft"; - } else if (isNonFatal(macro)) { - return "slipped into your cock"; - } -} - -defaults["victim-ball-smother"] = function (macro) { - if (isSadistic(macro)) { - return "reduced to broken gore under your massive balls"; - } else if (isGory(macro)) { - return "snuffed out by your crushing balls"; - } else if (isFatal(macro)) { - return "crushed under your balls"; - } else if (isNonFatal(macro)) { - return "trapped under your balls"; - } -} - -defaults["victim-sheath-crush"] = function (macro) { - if (isSadistic(macro)) { - return "crushed and smeared between your shaft and sheath"; - } else if (isGory(macro)) { - return "ground into paste within your sheath"; - } else if (isFatal(macro)) { - return "crushed between your sheath and shaft"; - } else if (isNonFatal(macro)) { - return "squeezed out from your sheath"; - } -} - -defaults["victim-sheath-absorb"] = function (macro) { - if (isSadistic(macro)) { - return "dissolved and absorbed into your tight sheath"; - } else if (isGory(macro)) { - return "absorbed by the flesh of your sheath"; - } else if (isFatal(macro)) { - return "absorbed into your sheath"; - } else if (isNonFatal(macro)) { - return "taken into your sheath"; - } -} - -defaults["victim-foreskin-crush"] = function (macro) { - if (isSadistic(macro)) { - return "crushed and smeared between your shaft and foreskin"; - } else if (isGory(macro)) { - return "ground into paste within your foreskin"; - } else if (isFatal(macro)) { - return "crushed between your foreskin and shaft"; - } else if (isNonFatal(macro)) { - return "squeezed out from your foreskin"; - } -} - -defaults["victim-foreskin-absorb"] = function (macro) { - if (isSadistic(macro)) { - return "dissolved and absorbed into your tight foreskin"; - } else if (isGory(macro)) { - return "absorbed by the flesh of your foreskin"; - } else if (isFatal(macro)) { - return "absorbed into your foreskin"; - } else if (isNonFatal(macro)) { - return "taken into your foreskin"; - } -} - -defaults["victim-male-musk"] = function (macro) { - if (isSadistic(macro)) { - return "reduced to slurry by corrosive masculine musk"; - } else if (isGory(macro)) { - return "suffocated by masculine musk"; - } else if (isFatal(macro)) { - return "snuffed out by masculine musk"; - } else if (isNonFatal(macro)) { - return "dazed by masculine musk"; - } -} - -defaults["victim-male-spurt-musk"] = function (macro) { - if (isSadistic(macro)) { - return "corroded by your caustic, overwhelming masculine musk"; - } else if (isGory(macro)) { - return "snuffed out by your masculine musk"; - } else if (isFatal(macro)) { - return "overwhelmed by masculine musk"; - } else if (isNonFatal(macro)) { - return "dazed by masculine musk"; - } -} - -defaults["victim-male-orgasm-musk"] = function (macro) { - if (isSadistic(macro)) { - return "corroded by your caustic, overwhelming masculine musk"; - } else if (isGory(macro)) { - return "snuffed out by your masculine musk"; - } else if (isFatal(macro)) { - return "overwhelmed by masculine musk"; - } else if (isNonFatal(macro)) { - return "dazed by masculine musk"; - } -} - -defaults["victim-unbirth"] = function (macro) { - if (isSadistic(macro)) { - return "crushed by your overwhelming womb"; - } else if (isGory(macro)) { - return "crammed into your womb"; - } else if (isFatal(macro)) { - return "stuffed into your nethers"; - } else if (isNonFatal(macro)) { - return "slipped into your slit"; - } -} - -defaults["victim-female-musk"] = function (macro) { - if (isSadistic(macro)) { - return "dissolved to slurry by feminine musk"; - } else if (isGory(macro)) { - return "suffocated by feminine musk"; - } else if (isFatal(macro)) { - return "snuffed out by feminine musk"; - } else if (isNonFatal(macro)) { - return "dazed by feminine musk"; - } -} - -defaults["victim-female-spurt-musk"] = function (macro) { - if (isSadistic(macro)) { - return "corroded by your caustic, overwhelming feminine musk"; - } else if (isGory(macro)) { - return "snuffed out by your feminine musk"; - } else if (isFatal(macro)) { - return "overwhelmed by feminine musk"; - } else if (isNonFatal(macro)) { - return "dazed by feminine musk"; - } -} - -defaults["victim-female-orgasm-musk"] = function (macro) { - if (isSadistic(macro)) { - return "corroded by your caustic, overwhelming feminine musk"; - } else if (isGory(macro)) { - return "snuffed out by your feminine musk"; - } else if (isFatal(macro)) { - return "overwhelmed by feminine musk"; - } else if (isNonFatal(macro)) { - return "dazed by feminine musk"; - } -} - -defaults["victim-breast-crush"] = function (macro) { - if (isSadistic(macro)) { - return "reduced to broken gore beneath your breasts"; - } else if (isGory(macro)) { - return "crushed to death by your bosom"; - } else if (isFatal(macro)) { - return "flattened under your heavy breasts"; - } else if (isNonFatal(macro)) { - return "smooshed by your breasts"; - } -} - -defaults["victim-cleavage-crush"] = function (macro) { - if (isSadistic(macro)) { - return "cracked open like gore-filled nuts between your breasts"; - } else if (isGory(macro)) { - return "crushed to paste between your breasts"; - } else if (isFatal(macro)) { - return "smashed between your breasts"; - } else if (isNonFatal(macro)) { - return "squeezed between your breasts"; - } -} - -defaults["victim-cleavage-absorb"] = function (macro) { - if (isSadistic(macro)) { - return "agonizingly absorbed into your greedy bosom"; - } else if (isGory(macro)) { - return "absorbed into your greedy breasts"; - } else if (isFatal(macro)) { - return "absorbed by your breasts"; - } else if (isNonFatal(macro)) { - return "pulled into your breasts"; - } -} + rules["chew"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro) && + macro.height >= 5 + ); + }, + desc: function (container, macro, verbose, flat) { + 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." + ); + }, + }); -defaults["victim-cleavage-drop"] = function (macro) { - if (isSadistic(macro)) { - return "dropped from your cleavage and dashed to bloody bits"; - } else if (isGory(macro)) { - return "dropped from your cleavage to their deaths"; - } else if (isFatal(macro)) { - return "dropped from your cleavage and smashed"; - } else if (isNonFatal(macro)) { - return "dropped from your cleavage"; - } -} + rules["chew"].push({ + test: function (container, macro) { + 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 \ + 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." + ); + }, + }); -defaults["victim-milk-flood"] = function (macro) { - if (isSadistic(macro)) { - return "drenched in and dissolved by your milk"; - } else if (isGory(macro)) { - return "drowned in your milk"; - } else if (isFatal(macro)) { - return "washed away by your milk"; - } else if (isNonFatal(macro)) { - return "flooded in your milk"; - } + rules["chew"].push({ + test: (container, macro) => + hasExactly(container, "Planet", 1) && + nothingLarger(container, "Planet") && + isFatal(macro), + desc: (container, macro, verbose, flat) => + [ + "A shadow falls over your next meal - your ", + macro.jawDesc(true), + "closing around the rocky sphere like bolt cutters around a chain-link...and then, with a sharp clench, they split the planet in twain. The heat of the planet's core spills out, the homeworld of billions rent asunder by your almighty", + macro.jawDesc(true) + ".", + "A few more chews and crunches reduce it to chunky, glowing rubble...and with a flick of your head, the planet's remains are lost to your hunger.", + ].join(" "), + }); } -defaults["victim-breast-vore"] = function (macro) { - if (isSadistic(macro)) { - return "fed into your breasts to be churned and obliterated"; - } else if (isGory(macro)) { - return "shoved into your greedy bosom and lost for good"; - } else if (isFatal(macro)) { - return "stuffed into your breasts to be absorbed"; - } else if (isNonFatal(macro)) { - return "slipped into your nipples"; - } -} +// stomp -defaults["victim-pouch-absorb"] = function (macro) { - if (isSadistic(macro)) { - return "crushed, torn, and absorbed by your perilous pouch"; - } else if (isGory(macro)) { - return "smothered and soaked into the walls of your pouch"; - } else if (isFatal(macro)) { - return "claimed by your pouch"; - } else if (isNonFatal(macro)) { - return "absorbed into your pouch"; - } -} +{ + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your heavy " + + macro.footDesc() + + " slams down on " + + container.describe(verbose) + + ", smashing the poor thing like an insect." + ); + }, + }); -defaults["victim-soul-digest"] = function (macro) { - switch (macro.soulVoreType) { - case "release": - return "souls freed from your depths"; - case "body": - return "souls imprisoned in your body for good"; - case "oblivion": - return "souls annihilated for eternity"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + macro.footDesc() + + " thumps " + + container.describe(verbose) + + ", shoving your victim to the ground and cracking them open like an egg." + ); + }, + }); -defaults["victim-soul-paw"] = function (macro) { - switch (macro.soulVoreType) { - case "release": - return "souls briefly trapped in your paws"; - case "body": - return "souls claimed forever by your paws"; - case "oblivion": - return "souls annihilated in your paws"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your shadow falls over " + + container.describe(verbose) + + ", and your " + + macro.footDesc() + + " follows, crushing their soft body and reducing them to a heap of broken gore." + ); + }, + }); -defaults["victim-paw-stench"] = function (macro) { - if (isSadistic(macro)) { - return "corroded and melted alive by the stench of your " + macro.footDesc(true); - } else if (isGory(macro)) { - return "suffocated by the powerful stench of your " + macro.footDesc(true); - } else if (isFatal(macro)) { - return "snuffed out by the scent of your " + macro.footDesc(true); - } else if (isNonFatal(macro)) { - return "sickened by the smell of your " + macro.footDesc(true); - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasNothingElse(container, ["Person", "Cow", "Car"]) && isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + macro.footDesc() + + " smooshes over " + + container.describe(verbose) + + ". They stick to your " + + macro.toeDesc(true) + + ", carried along for the ride as you take another few steps before finally\ + falling off." + ); + }, + }); -defaults["victim-ass-stench"] = function (macro) { - if (isSadistic(macro)) { - return "reduced to bubbling flesh by the caustic scent of your ass"; - } else if (isGory(macro)) { - return "suffocated by the rank odor of your ass"; - } else if (isFatal(macro)) { - return "snuffed out by the scent of your ass"; - } else if (isNonFatal(macro)) { - return "sickened by the smell of your butt"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person"]) && + hasExactly(container, "Person", 1) && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your heavy " + + macro.footDesc() + + " slams down on " + + container.describe(verbose) + + ", smashing the poor thing like an insect." + ); + }, + }); -defaults["victim-gas-belch"] = function (macro) { - if (isSadistic(macro)) { - return "dissolved by your rich, acidic belches"; - } else if (isGory(macro)) { - return "corroded by your acrid belches"; - } else if (isFatal(macro)) { - return "slain by your foul, deafening belches"; - } else if (isNonFatal(macro)) { - return "knocked out by your belches"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Bus"]) && + hasExactly(container, "Bus", 1) && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your heavy " + + macro.footDesc() + + " slams down on " + + container.describe(verbose) + + ", smashing the poor thing like an insect." + ); + }, + }); -defaults["victim-gas-fart"] = function (macro) { - if (isSadistic(macro)) { - return "burned alive and melted down by your farts"; - } else if (isGory(macro)) { - return "dissolved by your caustic farts"; - } else if (isFatal(macro)) { - return "inundated in the miasma of your farts"; - } else if (isNonFatal(macro)) { - return "knocked out by your farts"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasOnly(container, ["Person", "Car", "Bus"]) && + hasExactly(container, "Bus", 1) && + hasLessThan(container, "Car", 10) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You punt a " + + container.contents["Bus"].describe(verbose) + + ", sending it tumbling down the road into a " + + describe_all(container.contents, verbose, flat, ["Bus"]) + ); + }, + }); -defaults["victim-piss"] = function (macro) { - if (isSadistic(macro)) { - return "drowned and dissolved in acrid piss"; - } else if (isGory(macro)) { - return "drowned in your acrid piss"; - } else if (isFatal(macro)) { - return "inundated in hot piss"; - } else if (isNonFatal(macro)) { - return "flooded with your piss"; - } -} + rules["stomp"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Parking Garage", 1) && + nothingLarger(container, "Parking Garage") + ); + }, + desc: function (container, macro, verbose, flat) { + 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." + ); + }, + }); -defaults["victim-bladder-vore"] = function (macro) { - if (isSadistic(macro)) { - return "dissolved in a golden-yellow sea of searing piss"; - } else if (isGory(macro)) { - return "digested in your bladder and pissed out"; - } else if (isFatal(macro)) { - return "dissolved in your bladder"; - } else if (isNonFatal(macro)) { - return "absorbed into your bladder"; - } -} + //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." + ); + }, + }); -defaults["victim-piss-stench"] = function (macro) { - if (isSadistic(macro)) { - return "rent asunder by the miasma wafting from your piss"; - } else if (isGory(macro)) { - return "corroded and consumed by the stench of your piss"; - } else if (isFatal(macro)) { - return "snuffed out by the stench of your piss"; - } else if (isNonFatal(macro)) { - return "sickeded by your smelly piss"; - } -} + 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." + ); + }, + }); -defaults["victim-scat"] = function (macro) { - if (isSadistic(macro)) { - return "buried alive and dissolved by your acrid shit"; - } else if (isGory(macro)) { - return "crushed beneath your scat"; - } else if (isFatal(macro)) { - return "flattened by your scat"; - } else if (isNonFatal(macro)) { - return "trapped under your scat"; - } -} + 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." + ); + }, + }); -defaults["victim-scat-stench"] = function (macro) { - if (isSadistic(macro)) { - return "melted into slag by the wretched miasma of your scat"; - } else if (isGory(macro)) { - return "killed by the overwhelming smell of your scat"; - } else if (isFatal(macro)) { - return "snuffed out by your scat's stench"; - } else if (isNonFatal(macro)) { - return "sickened by your scat"; - } -} + 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." + ); + }, + }); -defaults["victim-goo"] = function (macro) { - if (isSadistic(macro)) { - return "shredded and soaked up by your goo"; - } else if (isGory(macro)) { - return "digested and dissolved into your goo"; - } else if (isFatal(macro)) { - return "dissolved in your goo"; - } else if (isNonFatal(macro)) { - return "turned into more of your goo"; - } -} + //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." + ); + }, + }); -defaults["victim-paw-vore"] = function (macro) { - if (isSadistic(macro)) { - return "broken down and absorbed directly into your " + macro.footOnlyDesc(true); - } else if (isGory(macro)) { - return "crushed under and sucked into your " + macro.footOnlyDesc(true); - } else if (isFatal(macro)) { - return "absorbed by your greedy " + macro.footOnlyDesc(true); - } else if (isNonFatal(macro)) { - return "absorbed into your " + macro.footOnlyDesc(true); - } -} + 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." + ); + }, + }); -defaults["victim-breath-fire"] = function (macro) { - if (isSadistic(macro)) { - return "cooked alive and reduced to ash by your flaming breath"; - } else if (isGory(macro)) { - return "burned alive by your fiery breath"; - } else if (isFatal(macro)) { - return "burned by your scorching breath"; - } else if (isNonFatal(macro)) { - return "singed by your breath"; - } -} + 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." + ); + }, + }); -defaults["victim-breath-ice"] = function (macro) { - if (isSadistic(macro)) { - return "flash-frozen by your breath and shattered into gory dust"; - } else if (isGory(macro)) { - return "fatally frozen by your icy breath"; - } else if (isFatal(macro)) { - return "turned to ice sculptures by your breath"; - } else if (isNonFatal(macro)) { - return "frozen by your breath"; - } -} + 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." + ); + }, + }); -defaults["victim-breath-electric"] = function (macro) { - if (isSadistic(macro)) { - return "blasted into bloody sludge by your shocking breath"; - } else if (isGory(macro)) { - return "electrocuted by your electric breath"; - } else if (isFatal(macro)) { - return "fried by your shocking breath"; - } else if (isNonFatal(macro)) { - return "zapped by your electric breath"; - } -} + //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." + ); + }, + }); -defaults["victim-breath-smoke"] = function (macro) { - if (isSadistic(macro)) { - return "cooked alive and cauterized by your smoky breath"; - } else if (isGory(macro)) { - return "suffocated by your hot, smoky breath"; - } else if (isFatal(macro)) { - return "snuffed out by smoky breath"; - } else if (isNonFatal(macro)) { - return "singed by your smoky breath"; - } -} + 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." + ); + }, + }); -defaults["victim-breath-radiation"] = function (macro) { - if (isSadistic(macro)) { - return "reduced to bubbling, glowing sludge by your radioactive breath"; - } else if (isGory(macro)) { - return "cooked alive by your radioactive breath"; - } else if (isFatal(macro)) { - return "nuked by your radioactive breath"; - } else if (isNonFatal(macro)) { - return "mutated by your radioactive breath"; - } -} + 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() + + " 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." + ); + }, + }); -defaults["victim-breath-foul"] = function (macro) { - if (isSadistic(macro)) { - return "suffocated and slain by thick, miasmic breath"; - } else if (isGory(macro)) { - return "snuffed out by your foul breath"; - } else if (isFatal(macro)) { - return "slain by your foul breath"; - } else if (isNonFatal(macro)) { - return "sickened by your smelly breath"; - } -} + 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() + + "." + ); + }, + }); -defaults["victim-wings-flap"] = function (macro) { - if (isSadistic(macro)) { - return "ripped asunder by gusts from your mighty wings"; - } else if (isGory(macro)) { - return "thrown and dashed to bits by your sweeping wings"; - } else if (isFatal(macro)) { - return "thrown away by your swooping wings"; - } else if (isNonFatal(macro)) { - return "blown away by your wings"; - } -} + //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." + ); + }, + }); -defaults["victim-wings-vore"] = function (macro) { - if (isSadistic(macro)) { - return "shrink-wrapped in your wings and dissolved"; - } else if (isGory(macro)) { - return "wrapped up in your airless wings and digested"; - } else if (isFatal(macro)) { - return "snared in your wings and digested"; - } else if (isNonFatal(macro)) { - return "trapped in your wings"; - } -} -} + 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." + ); + }, + }); -// eat + 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["eat"].push({ - "test": function (container, macro) { - return hasNothing(container); - }, - "desc": function (container, macro, verbose, flat) { - return "You scoop up...nothing. Oh well."; - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasLessThan(container, "Person", 6) && - macro.height >= 10; - }, - "desc": function (container, macro, verbose, flat) { - return "You pluck up " + container.describe() + " and stuff them into your mouth, swallowing lightly to drag them down to your bubbling guts."; - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - macro.height < 10; - }, - "desc": function (container, macro, verbose, flat) { - return "You grasp " + container.describe() + " and greedily wolf them down, swallowing forcefully to cram them into your bulging stomach. A crass belch escapes your lips as they curl up in your slimy gut."; - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasExactly(container, "Car", 1); - }, - "desc": function (container, macro, verbose, flat) { - return "You crush " + container.describe(verbose) + " with your tight throat, washing it down with its former passengers." - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasExactly(container, "Macro", 1) && - nothingLarger(container, "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") + " 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."); - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasExactly(container, "Small Skyscraper", 1) && - nothingLarger(container, "Small Skyscraper") && - macro.height < 500; - }, - "desc": function (container, macro, verbose, flat) { - return "You drop onto your hands and knees, " + macro.jawDesc(true) + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\ - and you suckle on it for a long moment before twisting your head to snap it loose. The entire building, along with " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + "\ - within, plunge into your roiling guts. You wash it down with some delicious treats you slurped up along with it - " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + "."; - } -}); - -rules["eat"].push({ - "test": function (container, macro) { - return hasExactly(container, "Small Skyscraper", 2) && - nothingLarger(container, "Small Skyscraper") && - macro.height < 750; - }, - "desc": function (container, macro, verbose, flat) { - return "You drop onto your hands and knees, " + macro.jawDesc(true) + " opening wide to envelop the skyscraper. It glides into your throat as your snout touches the ground,\ - and you suckle on it for a long moment before twisting your head to snap it loose. Without missing a beat, you rise back up, sloppy tongue slathering over the side \ - of the remaining tower, sucking on its tip and roughly shoving it into your maw. It breaks from its foundation, vanishing past your lips as you use two fingers to shove it \ - down your sultry throat. Your gut bubbles as " + describe_all(container.contents["Small Skyscraper"].contents, verbose) + " are crunched and crushed within, along with the \ - " + describe_all(container.contents, verbose, ["Small Skyscraper"]) + " that were unfortunate enough to be caught up by your slimy tongue."; - } -}); + 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() + + "." + ); + }, + }); -rules["eat"].push({ - test: (container, macro) => { - return hasExactly(container, "Planet", 1) && nothingLarger(container, "Planet"); - }, - desc: (container, macro, verbose, flat) => { - return [ - "Your colossal", - macro.jawDesc(true), - "yawn wide as you drift towards the planet, blotting out the sun in the shadow of your terrifying maw. Your tongue curls along the underside of your snack's crust, slathering it in drool and gently tugging it towards you. Cracks and quakes rock the fragile crust; your body's overwhelming gravity alone is enough to stretch and warp the planet. Before long, it is entombed within your", - macro.jawDesc(true), - "and, a heartbeat later, a massive GLURKH drags it into your gullet." - ].join(" ") - } -}) - -rules["eat"].push({ - test: (container, macro) => hasAtleast(container, "Planet", 3) && hasLessThan(container, "Planet", 15) && nothingLarger(container, "Planet"), - desc: (container, macro, verbose, flat) => [ - "You scoop up a plethora of planets, popping them into your", - macro.jawDesc(true), - "like the finger-food they've become, tugging each one into your gullet - and on an irreversible one-way journey to your gut - with little gluks and gulps, sealing away all", - container.contents["Planet"].count, - "of them within your cosmic body." - ].join(" ") -}); -} + //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, 0.5) * 2.5, unit, true) + + " wide \ + dust-filled crater you created." + ); + }, + }); -// chew + 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, 0.5) * 2.5, unit, true) + + " wide debris-filled crater you created." + ); + }, + }); -{ -rules["chew"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isGory(macro) && - macro.height < 5; - }, "desc": function (container, macro, verbose, flat) { - 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."; - } -}); - -rules["chew"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isGory(macro) && - macro.height >= 5; - }, "desc": function (container, macro, verbose, flat) { - 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."; - } -}); - -rules["chew"].push({ - "test": function (container, macro) { - 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 \ - 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."; - } -}); - -rules["chew"].push({ - test: (container, macro) => hasExactly(container, "Planet", 1) && nothingLarger(container, "Planet") && isFatal(macro), - desc: (container, macro, verbose, flat) => [ - "A shadow falls over your next meal - your ", - macro.jawDesc(true), - "closing around the rocky sphere like bolt cutters around a chain-link...and then, with a sharp clench, they split the planet in twain. The heat of the planet's core spills out, the homeworld of billions rent asunder by your almighty", - macro.jawDesc(true) + ".", - "A few more chews and crunches reduce it to chunky, glowing rubble...and with a flick of your head, the planet's remains are lost to your hunger." - ].join(" ") -}); -} + 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, 0.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" + ); + }, + }); -// stomp + 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 skyscrapers 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, 0.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 hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isFatal(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect."; - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isGory(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + macro.footDesc() + " thumps " + container.describe(verbose) + ", shoving your victim to the ground and cracking them open like an egg."; - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isGory(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your shadow falls over " + container.describe(verbose) + ", and your " + macro.footDesc() + " follows, crushing their soft body and reducing them to a heap of broken gore."; - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasNothingElse(container, ["Person", "Cow", "Car"]) && - isNonFatal(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + macro.footDesc() + " smooshes over " + container.describe(verbose) + ". They stick to your " + macro.toeDesc(true) + ", carried along for the ride as you take another few steps before finally\ - falling off."; - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Person"]) && - hasExactly(container, "Person", 1) && - isFatal(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect."; - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasOnly(container, ["Bus"]) && - hasExactly(container, "Bus", 1) && - isFatal(macro); - }, "desc": function (container, macro, verbose, flat) { - return "Your heavy " + macro.footDesc() + " slams down on " + container.describe(verbose) + ", smashing the poor thing like an insect."; - } -}); + //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, 0.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 hasOnly(container, ["Person", "Car", "Bus"]) && - hasExactly(container, "Bus", 1) && - hasLessThan(container, "Car", 10); - }, "desc": function (container, macro, verbose, flat) { - return "You punt a " + container.contents["Bus"].describe(verbose) + ", sending it tumbling down the road into a " + describe_all(container.contents, verbose, flat, ["Bus"]); - } -}); - -rules["stomp"].push({ - "test": function (container, macro) { - return hasExactly(container, "Parking Garage", 1) && - nothingLarger(container, "Parking Garage"); - }, "desc": function (container, macro, verbose, flat) { - 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."; - } -}); + 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, 0.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." + ); + }, + }); -//paw area between 5 and 50 + 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, 0.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 <= 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() + " 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 skyscrapers 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."; - } -}); + 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, 0.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, 0.5) * 4 + ? "planet-wide" + : length(Math.pow(macro.pawArea / Math.PI, 0.5) * 4, unit, true) + + " wide") + + " \ + wasteland." + ); + }, + }); -// stomping a planet + // 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 \ + 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 - -{ -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Person", 1) && - hasOnly(container, ["Person"]); - }, "desc": function (container, macro, verbose, flat) { - let adjective = ["musky", "winding", "churning"][Math.floor(Math.random() * 3)]; - return "Your weighty rump slams against the ground. A shock of pleasure runs up your spine as a " + container.describe(verbose) + " slides up your ass," + - (macro.maleParts ? " grinding against your prostate" : "") + ". A powerful clench drags them deeper into your bowels, sealing them away in your " + adjective + " depths."; - } -}); - -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Car", 1) && - hasOnly(container, ["Car"]); - }, "desc": function (container, macro, verbose, flat) { - return "You ram " + container.describe(verbose) + " up your ass, biting your lip as it" + (macro.maleParts ? " rubs along your prostate" : " slides into velvety depths") + ".\ - You moan and clench hard, yanking it in with a wet shlrrp and abruplty silencing its blaring horn."; - } -}); - -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Bus", 1) && - hasOnly(container, ["Bus"]); - }, "desc": function (container, macro, verbose, flat) { - return "A speeding bus slams on its brakes as you abruptly sit - but it's too late to stop. A gasp flies from your lips as it penetrates your greedy ass, sinking halfway in and coming to a halt. \ - You grunt and squeeze, causing its frame to creak and groan. Two fingers to the back are enough to get it moving again, and it slowly works inside. You shiver and moan, taking it in all the way. \ - Your ass claims " + container.describe(verbose) + "."; - } -}); - -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Business", 1) && - hasOnly(container, ["Business"]); - }, "desc": function (container, macro, verbose, flat) { - return "You set your weighty rump down on " + container.describe() + " and feel it penerate your hole. Once your weight has settled you clench your sphincter, seperating the building from its foundations with a crCraCHH \ - pulling it off the groud and inside of your ass. You feel the immense pressure of your anal cavity slowly crushing the building, bringing newfound pleasure with every shift and tremour within the structure."; - } -}); - - -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Train", 1) && - hasOnly(container, ["Train"]); - }, "desc": function (container, macro, verbose, flat) { - var cars = container.contents["Train"].contents["Train Car"].count; - return "Your massive fingers wrap around a train, yanking it from the rails with a tremendous screech of metal-on-metal. You squat down low, eyes rolling back in anticipation as you thrust the locomotive towards your massive ass - and then it hits home. A moan of pleasure shakes the earth, your ravenous pucker spread around the engine and sucking it in with a squelch. Powerful muscles squeeze and grab...and " + container.describe(verbose) + " swiftly vanishes into your bowels, every one of the " + cars + " cars a fresh shock of pleasure as they glide into your musky depths."; - } -}); - -rules["anal-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Planet", 1) && - hasOnly(container, ["Planet"]); - }, "desc": function (container, macro, verbose, flat) { - return "Your enormous hands guide a planet towards your cheeks - pressing it firmly into your pucker with a dull, muffled shlph...and " + container.describe(verbose) + " sinks into your bowels, sealed away from the universe..."; - } -}); -} - -// 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 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."; - } -}); - -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 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."; - } -}); - -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 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."; - } -}); - - -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 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) + "."; - } -}); - -rules["cock-vore"].push({ - "test": function (container, macro) { - return hasExactly(container, "Planet", 1) && - hasOnly(container, ["Planet"]) && - macro.dickGirth > 2.5e14; + 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." + ); + }, + }); - }, "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["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["cock-vore"].push({ - "test": function (container, macro) { - return hasAtleast(container, "Star", 1) || - hasAtleast(container, "Solar System", 1) + 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." + ); + }, + }); - }, "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."; - } -}); + 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) + + "." + ); + }, + }); } -// ball-smother +// anal-vore { -//Balls weigh 1,000kg or less -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1000 && - container.count > 0 && - isNonFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your giant balls impact the ground with a thud, pinning " + container.describe(verbose) + " between your weighty orbs."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1000 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + " balls impact the ground with a thud, crushing " + container.describe(verbose) + "."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1000 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + " balls impact the ground with a thud trapping " + container.describe(verbose) + " and grinding them into the pavement. They briefly struggle to escape before succumbing to the weight bearing down on them."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1000 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + " balls impact the ground with a thud trapping " + container.describe(verbose) + " and grinding them into the pavement. They briefly struggle to escape before being crushed into a gory mess that leaves a slick of blood on your swinging sack."; - } -}); - -//Balls weigh 50,000kg or less + rules["anal-vore"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Person", 1) && hasOnly(container, ["Person"]) + ); + }, + desc: function (container, macro, verbose, flat) { + let adjective = ["musky", "winding", "churning"][ + Math.floor(Math.random() * 3) + ]; + return ( + "Your weighty rump slams against the ground. A shock of pleasure runs up your spine as a " + + container.describe(verbose) + + " slides up your ass," + + (macro.maleParts ? " grinding against your prostate" : "") + + ". A powerful clench drags them deeper into your bowels, sealing them away in your " + + adjective + + " depths." + ); + }, + }); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 50000 && - macro.ballMass > 1000 && - container.count > 0 && - isNonFatal(macro); + rules["anal-vore"].push({ + test: function (container, macro) { + return hasExactly(container, "Car", 1) && hasOnly(container, ["Car"]); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You ram " + + container.describe(verbose) + + " up your ass, biting your lip as it" + + (macro.maleParts + ? " rubs along your prostate" + : " slides into velvety depths") + + ".\ + You moan and clench hard, yanking it in with a wet shlrrp and abruplty silencing its blaring horn." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls impact the ground with a thump. They spread over " + container.describe(verbose) + " and settle into the ground."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 50000 && - macro.ballMass > 1000 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls swing down and into " + container.describe(verbose) + " destroying everything in their path and leaving a gouge in the ground."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 50000 && - macro.ballMass > 1000 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls swing down and into " + container.describe(verbose) + " with the force of a wrecking ball. The momentum of the swing destroying everything in their path and leaving a trail of destruction."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 50000 && - macro.ballMass > 1000 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls swing down and into " + container.describe(verbose) + " with the force of a wrecking ball. The momentum of your mighty sack destroying everything in its path and leaving a trail of destruction. Your balls swing back through the remains of your prey, the massive weight converting everything remaining into unidentifiable detritus."; - } -}); + rules["anal-vore"].push({ + test: function (container, macro) { + return hasExactly(container, "Bus", 1) && hasOnly(container, ["Bus"]); + }, + desc: function (container, macro, verbose, flat) { + return ( + "A speeding bus slams on its brakes as you abruptly sit - but it's too late to stop. A gasp flies from your lips as it penetrates your greedy ass, sinking halfway in and coming to a halt. \ + You grunt and squeeze, causing its frame to creak and groan. Two fingers to the back are enough to get it moving again, and it slowly works inside. You shiver and moan, taking it in all the way. \ + Your ass claims " + + container.describe(verbose) + + "." + ); + }, + }); -//Balls weigh 5,000,000kg or less + rules["anal-vore"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Business", 1) && hasOnly(container, ["Business"]) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "You set your weighty rump down on " + + container.describe() + + " and feel it penerate your hole. Once your weight has settled you clench your sphincter, seperating the building from its foundations with a crCraCHH \ + pulling it off the groud and inside of your ass. You feel the immense pressure of your anal cavity slowly crushing the building, bringing newfound pleasure with every shift and tremour within the structure." + ); + }, + }); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 5000000 && - macro.ballMass > 50000 && - container.count > 0 && - isNonFatal(macro); + rules["anal-vore"].push({ + test: function (container, macro) { + return hasExactly(container, "Train", 1) && hasOnly(container, ["Train"]); + }, + desc: function (container, macro, verbose, flat) { + var cars = container.contents["Train"].contents["Train Car"].count; + return ( + "Your massive fingers wrap around a train, yanking it from the rails with a tremendous screech of metal-on-metal. You squat down low, eyes rolling back in anticipation as you thrust the locomotive towards your massive ass - and then it hits home. A moan of pleasure shakes the earth, your ravenous pucker spread around the engine and sucking it in with a squelch. Powerful muscles squeeze and grab...and " + + container.describe(verbose) + + " swiftly vanishes into your bowels, every one of the " + + cars + + " cars a fresh shock of pleasure as they glide into your musky depths." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls cast a shadow over " + container.describe(verbose) + " for a few seconds before coming to rest. You feel your sack shift as it settles into the landscape"; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 5000000 && - macro.ballMass > 50000 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls cast a shadow over " + container.describe(verbose) + " for a few seconds before slamming into the earth with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you heave your weighty orbs off the ground, only rubble remains."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 5000000 && - macro.ballMass > 50000 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls cast a shadow over " + container.describe(verbose) + " for a few seconds before slamming into the earth with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. After you heave your weighty orbs off the ground all that remains of your victims is gore streaked rubble and twisted steel."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 5000000 && - macro.ballMass > 50000 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls cast a shadow over " + container.describe(verbose) + " for a few seconds before slamming into the earth with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. After you heave your weighty orbs off the ground you see that those that were trapped beneath your cum factories are nothing but crumpled bodies lying amist the rubble."; - } -}); + rules["anal-vore"].push({ + test: function (container, macro) { + return ( + hasExactly(container, "Planet", 1) && hasOnly(container, ["Planet"]) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your enormous hands guide a planet towards your cheeks - pressing it firmly into your pucker with a dull, muffled shlph...and " + + container.describe(verbose) + + " sinks into your bowels, sealed away from the universe..." + ); + }, + }); +} -//Balls Weigh 1e9 kg or less +// cock-vore -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e9 && - macro.ballMass > 5000000 && - container.count > 0 && - isNonFatal(macro); +{ + 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." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " thick balls briefly eclipse the sun before coming to rest on " + container.describe(verbose) + " with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift as it spreads over the terrain and forms two noticable indents."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e9 && - macro.ballMass > 5000000 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " thick balls briefly eclipse the sun before crushing " + container.describe(verbose) + " with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots in the terrain; testimony of your immense power."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e9 && - macro.ballMass > 5000000 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " thick balls briefly eclipse the sun before pulverizing " + container.describe(verbose) + " with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots filled with rubble and gore in the terrain; testimony of your immense power."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e9 && - macro.ballMass > 5000000 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " thick balls briefly eclipse the sun before pulverizing " + container.describe(verbose) + " with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack move and shudder as it's immense bulk flattens everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots filled with rubble and gore in the terrain; a fitting grave for those lesser than you."; - } -}); + 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." + ); + }, + }); -//Balls Weigh 1e12 kg or less + 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["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e12 && - macro.ballMass > 1e9 && - container.count > 0 && - isNonFatal(macro); + 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 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." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " diameter balls blot out the sky before coming to rest on " + container.describe(verbose) + " with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your sack push the ground aside to form two massive craters."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e12 && - macro.ballMass > 1e9 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + container.describe(verbose) + " with little \ - resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you you heave your sack off the ground, two massive craters have formed at the impact site."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e12 && - macro.ballMass > 1e9 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + container.describe(verbose) + " with little \ -resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you heave your sack off the ground, two massive craters have formed at the impact site. A pool of blood and musk is rapidly forming at the bottom of each crater, with peices of debris floating in them."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e12 && - macro.ballMass > 1e9 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + container.describe(verbose) + " with little \ -resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you heave your sack off the ground, two massive craters have formed at the impact site. A pool of blood and musk is rapidly forming at the bottom of each crater, with bones and peices of debris floating in them."; - } -}); + 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 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." + ); + }, + }); -//Balls Weigh 1e15 kg or less + 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["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e15 && - macro.ballMass > 1e12 && - container.count > 0 && - isNonFatal(macro); + 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 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." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " wide balls cast darkness over " + container.describe(verbose) + " before settling into the terrain with the weight of " + mass(macro.ballMass, unit, false) + " each. You feel your gigantic orbs shovel out a spot for themselves with their mass alone."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e15 && - macro.ballMass > 1e12 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " wide balls cast darkness over the land as they swing low and right through " + container.describe(verbose) + " like a hot knife through butter. \ - You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + length(macro.ballDiameter, unit, true) + " destroying all in its path. As the initial impact subsides you feel your \ -enormous balls shift away from each other as they furrow into the landscape."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e15 && - macro.ballMass > 1e12 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " wide balls cast darkness over the land as they swing low and right through " + container.describe(verbose) + " like a hot knife through butter. \ - You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + length(macro.ballDiameter, unit, false) + " tossing people into the air and drestroying all in its path. As the \ -initial impact subsides you feel your enormous balls shift away from each other as they furrow into the landscape and over the people that attempted to flee."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e15 && - macro.ballMass > 1e12 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " wide balls cast darkness over the land as they swing low and right through " + container.describe(verbose) + " like a hot knife through butter. \ - You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + length(macro.ballDiameter, unit, false) + " tossing people into the air and drestroying all in its path. As the \ -initial impact subsides you feel your enormous balls shift away from each other as they furrow into the landscape and over the people that attempted to flee. The ground is stained red with blood and gore."; - } -}); + 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 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) + + "." + ); + }, + }); -//Balls Weigh 1e20 kg or less + 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["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e20 && - macro.ballMass > 1e15 && - container.count > 0 && - isNonFatal(macro); + 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." + ); + }, + }); +} - }, "desc": function (container, macro, verbose, flat) { - return "Your " + length(macro.ballDiameter, unit, true) + " thick balls cause night to fall before they come to rest on" + container.describe(verbose) + " . Each titanic testicle weighing " + mass(macro.ballMass, unit, false) + " . The craters left by each orb will scar the planet until its destruction."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e20 && - macro.ballMass > 1e15 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + container.describe(verbose) + " with a dull booOOOOooOOM. \ - The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing shrapnel in every direction. The craters left by your gonads will scar the planet until its destruction."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e20 && - macro.ballMass > 1e15 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + container.describe(verbose) + " with a dull booOOOOooOOM. \ - The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing shrapnel in every direction. The craters left by your gonads quickly fill with various fluids, leaving two lakes forever on the planet."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e20 && - macro.ballMass > 1e15 && - container.count > 0 && - isSadistic(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + container.describe(verbose) + " with a dull booOOOOooOOM. \ - The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing rubble, bodies, and shrapnel in every direction. The craters left by your gonads quickly fill with various fluids, leaving two lakes forever on the planet."; - } -}); +// ball-smother -//Balls Weigh 1e24 kg or less +{ + //Balls weigh 1,000kg or less + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass <= 1000 && container.count > 0 && isNonFatal(macro); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your giant balls impact the ground with a thud, pinning " + + container.describe(verbose) + + " between your weighty orbs." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass <= 1000 && container.count > 0 && isFatal(macro); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + " balls impact the ground with a thud, crushing " + + container.describe(verbose) + + "." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass <= 1000 && container.count > 0 && isGory(macro); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + " balls impact the ground with a thud trapping " + + container.describe(verbose) + + " and grinding them into the pavement. They briefly struggle to escape before succumbing to the weight bearing down on them." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass <= 1000 && container.count > 0 && isSadistic(macro); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + " balls impact the ground with a thud trapping " + + container.describe(verbose) + + " and grinding them into the pavement. They briefly struggle to escape before being crushed into a gory mess that leaves a slick of blood on your swinging sack." + ); + }, + }); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e24 && - macro.ballMass > 1e20 && - container.count > 0 && - isNonFatal(macro); + //Balls weigh 50,000kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 50000 && + macro.ballMass > 1000 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls impact the ground with a thump. They spread over " + + container.describe(verbose) + + " and settle into the ground." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 50000 && + macro.ballMass > 1000 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls swing down and into " + + container.describe(verbose) + + " destroying everything in their path and leaving a gouge in the ground." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 50000 && + macro.ballMass > 1000 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls swing down and into " + + container.describe(verbose) + + " with the force of a wrecking ball. The momentum of the swing destroying everything in their path and leaving a trail of destruction." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 50000 && + macro.ballMass > 1000 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls swing down and into " + + container.describe(verbose) + + " with the force of a wrecking ball. The momentum of your mighty sack destroying everything in its path and leaving a trail of destruction. Your balls swing back through the remains of your prey, the massive weight converting everything remaining into unidentifiable detritus." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "The Gravatational pull of your " + length(macro.ballDiameter, unit, true) + " across balls cause night to fall before they come to rest on" + container.describe(verbose) + " . Each monstrous testicle weighing " + mass(macro.ballMass, unit, false) + " . The impact of your manhood creating mountains and shaking earth"; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e24 && - macro.ballMass > 1e20 && - container.count > 0 && - isFatal(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + container.describe(verbose) + " with a thunderous BOOOOOOM. \ - You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e24 && - macro.ballMass > 1e20 && - container.count > 0 && - isGory(macro); - - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + container.describe(verbose) + " with a thunderous BOOOOOOM. \ - You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Those that survived the blast are deafened as windows shatter around them and buildings shake on the verge of collapse. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area."; - } -}); + //Balls weigh 5,000,000kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 5000000 && + macro.ballMass > 50000 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls cast a shadow over " + + container.describe(verbose) + + " for a few seconds before coming to rest. You feel your sack shift as it settles into the landscape" + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 5000000 && + macro.ballMass > 50000 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls cast a shadow over " + + container.describe(verbose) + + " for a few seconds before slamming into the earth with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you heave your weighty orbs off the ground, only rubble remains." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 5000000 && + macro.ballMass > 50000 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls cast a shadow over " + + container.describe(verbose) + + " for a few seconds before slamming into the earth with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. After you heave your weighty orbs off the ground all that remains of your victims is gore streaked rubble and twisted steel." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 5000000 && + macro.ballMass > 50000 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls cast a shadow over " + + container.describe(verbose) + + " for a few seconds before slamming into the earth with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. After you heave your weighty orbs off the ground you see that those that were trapped beneath your cum factories are nothing but crumpled bodies lying amist the rubble." + ); + }, + }); + + //Balls Weigh 1e9 kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e9 && + macro.ballMass > 5000000 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " thick balls briefly eclipse the sun before coming to rest on " + + container.describe(verbose) + + " with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift as it spreads over the terrain and forms two noticable indents." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e9 && + macro.ballMass > 5000000 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " thick balls briefly eclipse the sun before crushing " + + container.describe(verbose) + + " with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots in the terrain; testimony of your immense power." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e9 && + macro.ballMass > 5000000 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " thick balls briefly eclipse the sun before pulverizing " + + container.describe(verbose) + + " with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack shift and settle as it slowly pulverizes everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots filled with rubble and gore in the terrain; testimony of your immense power." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e9 && + macro.ballMass > 5000000 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " thick balls briefly eclipse the sun before pulverizing " + + container.describe(verbose) + + " with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack move and shudder as it's immense bulk flattens everything unfortunate enough to be trapped beneath it. When you finally heave your mighty manhood off the ground, you notice 2 massive divots filled with rubble and gore in the terrain; a fitting grave for those lesser than you." + ); + }, + }); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass <= 1e24 && - macro.ballMass > 1e20 && - container.count > 0 && - isSadistic(macro); + //Balls Weigh 1e12 kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e12 && + macro.ballMass > 1e9 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " diameter balls blot out the sky before coming to rest on " + + container.describe(verbose) + + " with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your sack push the ground aside to form two massive craters." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e12 && + macro.ballMass > 1e9 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + + container.describe(verbose) + + " with little \ + resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you you heave your sack off the ground, two massive craters have formed at the impact site." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e12 && + macro.ballMass > 1e9 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + + container.describe(verbose) + + " with little \ +resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you heave your sack off the ground, two massive craters have formed at the impact site. A pool of blood and musk is rapidly forming at the bottom of each crater, with peices of debris floating in them." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e12 && + macro.ballMass > 1e9 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " diameter balls blot out the sky as they approach your target. The unstoppable force of your gigantic testicles CRASHES through " + + container.describe(verbose) + + " with little \ +resistance, pancaking them into the ground. The violent impact generates a shockwave that bowls over surrounding trees and buildings. As you heave your sack off the ground, two massive craters have formed at the impact site. A pool of blood and musk is rapidly forming at the bottom of each crater, with bones and peices of debris floating in them." + ); + }, + }); - }, "desc": function (container, macro, verbose, flat) { - return "Your " + mass(macro.ballMass, unit, true) + ", " + length(macro.ballDiameter, unit, true) + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + container.describe(verbose) + " with a thunderous BOOOOOOM. \ - You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Those that survived the blast are deafened as windows shatter around them and buildings shake on the verge of collapse. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area. \ - You smell the tang of copper in the air, and know that the next rainfall with be red with the blood of those you have slaughtered."; - } -}); + //Balls Weigh 1e15 kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e15 && + macro.ballMass > 1e12 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " wide balls cast darkness over " + + container.describe(verbose) + + " before settling into the terrain with the weight of " + + mass(macro.ballMass, unit, false) + + " each. You feel your gigantic orbs shovel out a spot for themselves with their mass alone." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e15 && + macro.ballMass > 1e12 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " wide balls cast darkness over the land as they swing low and right through " + + container.describe(verbose) + + " like a hot knife through butter. \ + You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + + length(macro.ballDiameter, unit, true) + + " destroying all in its path. As the initial impact subsides you feel your \ +enormous balls shift away from each other as they furrow into the landscape." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e15 && + macro.ballMass > 1e12 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " wide balls cast darkness over the land as they swing low and right through " + + container.describe(verbose) + + " like a hot knife through butter. \ + You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + + length(macro.ballDiameter, unit, false) + + " tossing people into the air and drestroying all in its path. As the \ +initial impact subsides you feel your enormous balls shift away from each other as they furrow into the landscape and over the people that attempted to flee." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e15 && + macro.ballMass > 1e12 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " wide balls cast darkness over the land as they swing low and right through " + + container.describe(verbose) + + " like a hot knife through butter. \ + You shudder as you feel the force of the impact travel through the entirety of your testicles. The shockwave travels for " + + length(macro.ballDiameter, unit, false) + + " tossing people into the air and drestroying all in its path. As the \ +initial impact subsides you feel your enormous balls shift away from each other as they furrow into the landscape and over the people that attempted to flee. The ground is stained red with blood and gore." + ); + }, + }); + //Balls Weigh 1e20 kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e20 && + macro.ballMass > 1e15 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + length(macro.ballDiameter, unit, true) + + " thick balls cause night to fall before they come to rest on" + + container.describe(verbose) + + " . Each titanic testicle weighing " + + mass(macro.ballMass, unit, false) + + " . The craters left by each orb will scar the planet until its destruction." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e20 && + macro.ballMass > 1e15 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + + container.describe(verbose) + + " with a dull booOOOOooOOM. \ + The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing shrapnel in every direction. The craters left by your gonads will scar the planet until its destruction." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e20 && + macro.ballMass > 1e15 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + + container.describe(verbose) + + " with a dull booOOOOooOOM. \ + The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing shrapnel in every direction. The craters left by your gonads quickly fill with various fluids, leaving two lakes forever on the planet." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e20 && + macro.ballMass > 1e15 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " thick balls cause night to fall over the land. As they contact earth, they obliterate " + + container.describe(verbose) + + " with a dull booOOOOooOOM. \ + The immesive forces involved cause your cum factories to bounce up into the air before coming down on the same spot. The second impact drives your titanic balls deep into the ground while throwing rubble, bodies, and shrapnel in every direction. The craters left by your gonads quickly fill with various fluids, leaving two lakes forever on the planet." + ); + }, + }); + //Balls Weigh 1e24 kg or less + + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e24 && + macro.ballMass > 1e20 && + container.count > 0 && + isNonFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "The Gravatational pull of your " + + length(macro.ballDiameter, unit, true) + + " across balls cause night to fall before they come to rest on" + + container.describe(verbose) + + " . Each monstrous testicle weighing " + + mass(macro.ballMass, unit, false) + + " . The impact of your manhood creating mountains and shaking earth" + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e24 && + macro.ballMass > 1e20 && + container.count > 0 && + isFatal(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + + container.describe(verbose) + + " with a thunderous BOOOOOOM. \ + You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e24 && + macro.ballMass > 1e20 && + container.count > 0 && + isGory(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + + container.describe(verbose) + + " with a thunderous BOOOOOOM. \ + You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Those that survived the blast are deafened as windows shatter around them and buildings shake on the verge of collapse. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area." + ); + }, + }); -//Balls Weigh more than 1e24 kg + rules["ball-smother"].push({ + test: function (container, macro) { + return ( + macro.ballMass <= 1e24 && + macro.ballMass > 1e20 && + container.count > 0 && + isSadistic(macro) + ); + }, + desc: function (container, macro, verbose, flat) { + return ( + "Your " + + mass(macro.ballMass, unit, true) + + ", " + + length(macro.ballDiameter, unit, true) + + " across balls cause night to fall over the land. As they slam into the earth, they obliterate " + + container.describe(verbose) + + " with a thunderous BOOOOOOM. \ + You feel the Earth twang and vibrate with the impact. The crater kicks up enough dust to throw off the seasons. Those that survived the blast are deafened as windows shatter around them and buildings shake on the verge of collapse. Large fissures spread away from your privates in all directions, while the aftershocks of the impact alter and destroy the geology of the surrounding area. \ + You smell the tang of copper in the air, and know that the next rainfall with be red with the blood of those you have slaughtered." + ); + }, + }); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass > 1e24 && - container.count > 0 && - isNonFatal(macro); + //Balls Weigh more than 1e24 kg + + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass > 1e24 && container.count > 0 && isNonFatal(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, smushing them firmly against your " + + length(macro.ballDiameter, unit, true) + + " wide balls. " + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass > 1e24 && container.count > 0 && isFatal(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, crushing " + + (container.count == 1 ? "it" : "them") + + " firmly against your " + + length(macro.ballDiameter, unit, true) + + " wide balls. The gravity each of your orbs tearing " + + (container.count == 1 ? "it" : "them") + + " asunder, spreading the debris across \ +your sack, flattening and grinding until nothing remains but your colossal manhood." + ); + }, + }); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass > 1e24 && container.count > 0 && 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." + ); + }, + }); - }, "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, smushing them firmly against your " + length(macro.ballDiameter, unit, true) + " wide balls. "; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass > 1e24 && - container.count > 0 && - isFatal(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, crushing " + (container.count == 1 ? "it" : "them") + " firmly against your " + length(macro.ballDiameter, unit, true) + " wide balls. The gravity each of your orbs tearing " + (container.count == 1 ? "it" : "them") + " asunder, spreading the debris across \ -your sack, flattening and grinding until nothing remains but your colossal manhood."; - } -}); -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass > 1e24 && - container.count > 0 && - 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."; - } -}); - -rules["ball-smother"].push({ - "test": function (container, macro) { - return macro.ballMass > 1e24 && - container.count > 0 && - 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."; - } -}); + rules["ball-smother"].push({ + test: function (container, macro) { + return macro.ballMass > 1e24 && container.count > 0 && 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." + ); + }, + }); } // male-orgasm { rules["male-orgasm"].push({ - "test": function (container, macro, spurtVolume) { - return hasOnly(container, ["Person"]) && + 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."; - } + 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"]) && + 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."; - } + 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"]) && + 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."; - } + 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"]) && + 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."; - } + 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." + ); + }, }); //more than 5 and less than 50 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) + "."; - } + 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."; - } + 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."; - } + 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."; - } + 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." + ); + }, }); //less than 5e2 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) + "."; - } + 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."; - } + 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."; - } + 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."; - } + 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." + ); + }, }); //less than 5e3 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) + "."; - } + 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."; - } + 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."; - } + 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."; - } + 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." + ); + }, }); //less than 1e6 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) + "."; - } + 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."; - } + 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."; - } + 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."; - } + 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." + ); + }, }); //less than 1e9 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) + "."; - } + 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) + "."; - } + 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 by the intense current. The sheer volume of fluid overwelmes the sewers; you see cum spew from manholes and strom drains for several blocks."; - } + 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 by the intense current. 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 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."; - } + 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 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." + ); + }, }); //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) + "."; - } + 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."; - } + 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. \ + 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."; - } + 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. \ + 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."; - } + 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) + "."; - } + 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) + "."; - } + 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."; - } + 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."; - } + 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 && + 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) + "."; - } + 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 && + 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 planet, it smashes through " + container.describe(verbose) + "."; - } + 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 planet, it smashes through " + + container.describe(verbose) + + "." + ); + }, }); rules["male-orgasm"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e19 && + 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 planet, 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."; - } + 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 planet, 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 && + 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 planet, it smashes through " + container.describe(verbose) + ". Everything your semen rolls across \ + 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 planet, 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."; - } + 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 && + 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) + "."; - } + 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 && + 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."; - } + 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 && + 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."; - } + 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 && + 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 \ + 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."; - } + 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) && + 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) + "."; - } + 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) && + 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."; - } + 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) && + 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."; - } + 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) && + 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."; - } + 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) * 0.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 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."; - } + 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."; - } + 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." + ); + }, }); } // male-spurt { -//contains 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); + //contains 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) + + "." + ); + }, + }); - }, "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) && + 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) && - isSadistic(macro); + 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." + ); + }, + }); - }, "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 \ + 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."; - } -}); - -//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 " + length(macro.dickDiameter, unit, true) + " 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 " + length(macro.dickDiameter, unit, true) + " 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 " + 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."; - } -}); - -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 50 && - spurtVolume > 5 && - 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 \ - " + pickString("intestines", "gore", "organs") + " down the street and into a nearby stormdrain."; - } -}); - -//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 dye 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."; - } -}); - -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."; - } -}); + mouth, while they slump over and die." + ); + }, + }); -//less than 1e6 + //more than 5 and less than 50 -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e6 && - spurtVolume > 1e4 && - isNonFatal(macro); + rules["male-spurt"].push({ + test: function (container, macro, spurtVolume) { + return spurtVolume <= 50 && spurtVolume > 5 && 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) + + "." + ); + }, + }); - }, "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() + "."; - } -}); + rules["male-spurt"].push({ + test: function (container, macro, spurtVolume) { + return spurtVolume <= 50 && spurtVolume > 5 && 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) + + "." + ); + }, + }); -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e6 && - spurtVolume > 1e4 && - isFatal(macro); + rules["male-spurt"].push({ + test: function (container, macro, spurtVolume) { + return spurtVolume <= 50 && spurtVolume > 5 && 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 \ + pours into a nearby stromdrain." + ); + }, + }); - }, "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 obliterated."; - } -}); + rules["male-spurt"].push({ + test: function (container, macro, spurtVolume) { + return spurtVolume <= 50 && spurtVolume > 5 && 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 \ + " + + pickString("intestines", "gore", "organs") + + " down the street and into a nearby stormdrain." + ); + }, + }); -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e6 && - spurtVolume > 1e4 && - isGory(macro); + //less than 5e2 - }, "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."; - } -}); + 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 <= 1e6 && - spurtVolume > 1e4 && - isSadistic(macro); + 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." + ); + }, + }); - }, "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."; - } -}); + 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 dye 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 1e12 + 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 <= 1e9 && - spurtVolume > 1e6 && - isNonFatal(macro); + 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." + ); + }, + }); - }, "desc": function (container, macro, spurtVolume) { - return "$VOLUMEs of pre rages out of your cavernous urethra, slicking your " + macro.describeDick + " and raining on " + container.describe() + "."; - } -}); + 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." + ); + }, + }); -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e9 && - spurtVolume > 1e6 && - isFatal(macro); + //less than 1e6 - }, "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 <= 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() + + "." + ); + }, + }); -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e9 && - spurtVolume > 1e6 && - isGory(macro); + 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() + + ". The speed and sheer mass of the falling \ + pre ensures that the area where it lands is obliterated." + ); + }, + }); - }, "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 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 && 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() + + ". 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 <= 1e9 && - spurtVolume > 1e6 && - isSadistic(macro); + 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." + ); + }, + }); - }, "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 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."; - } -}); + //less than 1e12 -//less than 1e12 + 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 rages out of your cavernous urethra, slicking your " + + macro.describeDick + + " and raining on " + + container.describe() + + "." + ); + }, + }); -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e12 && - spurtVolume > 1e9 && - isNonFatal(macro); + 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." + ); + }, + }); - }, "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 <= 1e9 && spurtVolume > 1e6 && isGory(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 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 <= 1e12 && - spurtVolume > 1e9 && - isFatal(macro); + rules["male-spurt"].push({ + test: function (container, macro, spurtVolume) { + return spurtVolume <= 1e9 && spurtVolume > 1e6 && isSadistic(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 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." + ); + }, + }); - }, "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"); - } -}); + //less than 1e12 -rules["male-spurt"].push({ - "test": function (container, macro, spurtVolume) { - return spurtVolume <= 1e12 && - spurtVolume > 1e9 && - isGory(macro); + 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() + + "." + ); + }, + }); - }, "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 && 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 && - isSadistic(macro); + 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" + ) + ); + }, + }); - }, "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."; - } -}); + 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" -//musk +//musk -//boobs +//boobs //waste "marking territory" diff --git a/recursive-macro.js b/recursive-macro.js index e684997..c6b4110 100644 --- a/recursive-macro.js +++ b/recursive-macro.js @@ -1,62 +1,61 @@ -'use strict'; +"use strict"; -var things = -{ - "Container": { - "Container": Container, +var things = { + Container: { + Container: Container, mass: 0, area: 0, clusters: 0, cluster_chances: 0, contents: [], - descriptor: ["", ""] + descriptor: ["", ""], }, //Creatures - "Person": { - "Person": Person, + Person: { + Person: Person, mass: 80, - area: .33, + area: 0.33, clusters: 5, - cluster_chances: .8, + cluster_chances: 0.8, contents: [], - descriptor: ["a person", "people"] + descriptor: ["a person", "people"], }, - "Human": { - "Human": Human, + Human: { + Human: Human, mass: 80, - area: .33, + area: 0.33, clusters: 5, - cluster_chances: .8, + cluster_chances: 0.8, contents: [], - descriptor: ["a person", "people"] + descriptor: ["a person", "people"], }, - "Cow": { - "Cow": Cow, + Cow: { + Cow: Cow, mass: 300, area: 2, clusters: 15, - cluster_chances: .5, + cluster_chances: 0.5, contents: [], - descriptor: ["a cow", "cattle"] + descriptor: ["a cow", "cattle"], }, - "Micro": { - "Micro": Micro, - mass: .01, - area: .05, + Micro: { + Micro: Micro, + mass: 0.01, + area: 0.05, clusters: 50, cluster_chances: 1, contents: [], - descriptor: ["a micro", "micros"] + descriptor: ["a micro", "micros"], }, - "Macro": { - "Macro": Macro, + Macro: { + Macro: Macro, mass: 8e4, area: 100, clusters: 0, cluster_chances: 0, contents: [], - descriptor: ["a smaller macro", "smaller macros"] + descriptor: ["a smaller macro", "smaller macros"], }, //Vehicles "Empty Car": { @@ -64,63 +63,66 @@ var things = mass: 1000, area: 4, clusters: 2, - cluster_chances: .3, + cluster_chances: 0.3, contents: [], - descriptor: ["a parked car", "parked cars"] + descriptor: ["a parked car", "parked cars"], }, - "Car": { - "Car": Car, + Car: { + Car: Car, mass: 1000, area: 4, clusters: 4, - cluster_chances: .5, + cluster_chances: 0.5, contents: [["Person", 1, 4]], - descriptor: ["a car", "cars"] + descriptor: ["a car", "cars"], }, - "Bus": { - "Bus": Bus, + Bus: { + Bus: Bus, mass: 5000, area: 12, clusters: 1, - cluster_chances: .25, + cluster_chances: 0.25, contents: [["Person", 2, 30]], - descriptor: ["a bus", "busses"] + descriptor: ["a bus", "busses"], }, - "Tram": { - "Tram": Tram, + Tram: { + Tram: Tram, mass: 1e4, area: 20, clusters: 1, - cluster_chances: .2, + cluster_chances: 0.2, contents: [["Person", 10, 50]], - descriptor: ["a tram", "trams"] + descriptor: ["a tram", "trams"], }, - "Train": { - "Train": Train, + Train: { + Train: Train, mass: 5e4, area: 40, clusters: 2, - cluster_chances: .1, - contents: [["Person", 1, 4, "engine"], ["Train Car", 2, 10]], - descriptor: ["a train", "trains"] + cluster_chances: 0.1, + contents: [ + ["Person", 1, 4, "engine"], + ["Train Car", 2, 10], + ], + descriptor: ["a train", "trains"], }, "Train Car": { "Train Car": TrainCar, mass: 7500, area: 20, clusters: 1, - cluster_chances: .05, + cluster_chances: 0.05, contents: [["Person", 10, 40]], - descriptor: ["a train car", "train cars"] + descriptor: ["a train car", "train cars"], }, - "Helicopter": { - "Helicopter": Helicopter, + Helicopter: { + Helicopter: Helicopter, mass: 1500, area: 12, clusters: 0, cluster_chances: 0, contents: [["Person", 4, 16]], - descriptor: ["a helicopter", "helicopters"] + descriptor: ["a helicopter", "helicopters"], }, "Empty Helicopter": { "Empty Helicopter": EmptyHelicopter, @@ -129,199 +131,281 @@ var things = clusters: 3, cluster_chances: 0.05, contents: [], - descriptor: ["a parked helicopter", "parked helicopters"] + descriptor: ["a parked helicopter", "parked helicopters"], }, - "Plane": { - "Plane": Plane, + Plane: { + Plane: Plane, mass: 6500, area: 50, clusters: 1, - cluster_chances: .05, + cluster_chances: 0.05, contents: [], - descriptor: ["a small plane", "small planes"] + descriptor: ["a small plane", "small planes"], }, "Empty Plane": { "Empty Plane": EmptyPlane, mass: 6500, area: 50, clusters: 1, - cluster_chances: .05, + cluster_chances: 0.05, contents: [["Person", 2, 9]], - descriptor: ["a parked plane", "parked aircraft"] + descriptor: ["a parked plane", "parked aircraft"], }, - "Airliner": { - "Airliner": Airliner, + Airliner: { + Airliner: Airliner, mass: 6500, area: 1250, clusters: 1, - cluster_chances: .05, + cluster_chances: 0.05, contents: [["Person", 5, 300]], - descriptor: ["an airliner", "airliners"] + descriptor: ["an airliner", "airliners"], }, "Empty Airliner": { "Empty Airliner": EmptyAirliner, mass: 6500, area: 1250, clusters: 1, - cluster_chances: .05, + cluster_chances: 0.05, contents: [], - descriptor: ["a parked airliner", "parked airliners"] + descriptor: ["a parked airliner", "parked airliners"], }, //Buildings - "House": { - "House": House, + House: { + House: House, mass: 1e4, area: 150, clusters: 5, - cluster_chances: .5, - contents: [["Person", 0, 8], ["Empty Car", 0, 2]], - descriptor: ["a house", "houses"] + cluster_chances: 0.5, + contents: [ + ["Person", 0, 8], + ["Empty Car", 0, 2], + ], + descriptor: ["a house", "houses"], }, - "Business": { - "Business": Business, + Business: { + Business: Business, mass: 5e4, area: 400, clusters: 5, - cluster_chances: .25, - contents: [["Person", 0, 30], ["Car", 0, 5], ["Empty Car", 0, 20]], - descriptor: ["a local business", "buildings"] + cluster_chances: 0.25, + contents: [ + ["Person", 0, 30], + ["Car", 0, 5], + ["Empty Car", 0, 20], + ], + descriptor: ["a local business", "buildings"], }, - "Barn": { - "Barn": Barn, + Barn: { + Barn: Barn, mass: 5e3, area: 300, clusters: 1, - cluster_chances: .1, - contents: [["Person", 0, 2], ["Cow", 30, 70]], - descriptor: ["a barn", "barns"] + cluster_chances: 0.1, + contents: [ + ["Person", 0, 2], + ["Cow", 30, 70], + ], + descriptor: ["a barn", "barns"], }, "Small Hangar": { "Small Hangar": SmallHangar, mass: 5e5, area: 2500, clusters: 1, - cluster_chances: .1, - contents: [["Person", 0, 3], ["Plane", 0, 1], ["Empty Plane", 2, 6]], - descriptor: ["a small hangar", "small hangars"] + cluster_chances: 0.1, + contents: [ + ["Person", 0, 3], + ["Plane", 0, 1], + ["Empty Plane", 2, 6], + ], + descriptor: ["a small hangar", "small hangars"], }, "Helicopter Hangar": { "Helicopter Hangar": HelicopterHangar, mass: 5e5, area: 2000, clusters: 1, - cluster_chances: .1, - contents: [["Person", 0, 3], ["Helicopter", 0, 1], ["Helicopter", 2, 6]], - descriptor: ["a helicopter hangar", "helicopter hangar"] + cluster_chances: 0.1, + contents: [ + ["Person", 0, 3], + ["Helicopter", 0, 1], + ["Helicopter", 2, 6], + ], + descriptor: ["a helicopter hangar", "helicopter hangar"], }, "Large Hangar": { "Large Hangar": LargeHangar, mass: 5e6, area: 8000, clusters: 1, - cluster_chances: .1, - contents: [["Person", 0, 5], ["Airliner", 0, 1], ["Empty Airliner", 1, 2]], - descriptor: ["an aircraft hangar", "hangars"] + cluster_chances: 0.1, + contents: [ + ["Person", 0, 5], + ["Airliner", 0, 1], + ["Empty Airliner", 1, 2], + ], + descriptor: ["an aircraft hangar", "hangars"], }, "Small Skyscraper": { "Small Skyscraper": SmallSkyscraper, mass: 1e7, area: 1000, clusters: 2, - cluster_chances: .25, - contents: [["Person", 150, 750], ["Empty Car", 10, 50]], - descriptor: ["a small skyscraper", "small skyscrapers"] + cluster_chances: 0.25, + contents: [ + ["Person", 150, 750], + ["Empty Car", 10, 50], + ], + descriptor: ["a small skyscraper", "small skyscrapers"], }, "Large Skyscraper": { "Large Skyscraper": LargeSkyscraper, mass: 8e7, area: 2000, clusters: 1, - cluster_chances: .25, - contents: [["Person", 500, 1500], ["Empty Car", 20, 100]], - descriptor: ["a large skyscraper", "large skyscrapers"] + cluster_chances: 0.25, + contents: [ + ["Person", 500, 1500], + ["Empty Car", 20, 100], + ], + descriptor: ["a large skyscraper", "large skyscrapers"], }, "Parking Garage": { "Parking Garage": ParkingGarage, mass: 1e7, area: 750, clusters: 1, - cluster_chances: .1, - contents: [["Person", 10, 200], ["Empty Car", 100, 300], ["Car", 5, 30]], - descriptor: ["a parking garage", "parking garages"] + cluster_chances: 0.1, + contents: [ + ["Person", 10, 200], + ["Empty Car", 100, 300], + ["Car", 5, 30], + ], + descriptor: ["a parking garage", "parking garages"], }, //Places - "Ranch": { - "Ranch": Ranch, + Ranch: { + Ranch: Ranch, mass: 2e7, area: 4e4, clusters: 0, cluster_chances: 0, - contents: [["Person", 10, 50], ["House", 1, 3], ["Barn", 1, 2]], - descriptor: ["a ranch", "ranchs"] + contents: [ + ["Person", 10, 50], + ["House", 1, 3], + ["Barn", 1, 2], + ], + descriptor: ["a ranch", "ranchs"], }, - "Airstrip": { - "Airstrip": Airstrip, + Airstrip: { + Airstrip: Airstrip, mass: 2e7, area: 9e5, clusters: 0, cluster_chances: 0, - contents: [["Person", 10, 50], ["Small Hangar", 1, 3], ["Plane", 0, 2], ["Helicopter", 0, 1], ["Helicopter Hangar", 0, 1], ["Car", 0, 5], ["Empty Car", 0, 20]], - descriptor: ["an airstrip", "airstrips"] + contents: [ + ["Person", 10, 50], + ["Small Hangar", 1, 3], + ["Plane", 0, 2], + ["Helicopter", 0, 1], + ["Helicopter Hangar", 0, 1], + ["Car", 0, 5], + ["Empty Car", 0, 20], + ], + descriptor: ["an airstrip", "airstrips"], }, - "Airport": { - "Airport": Airport, + Airport: { + Airport: Airport, mass: 1.5e8, area: 6e6, clusters: 0, cluster_chances: 0, - contents: [["Person", 1500, 4000], ["Small Hangar", 4, 12], ["Plane", 2, 5], ["Helicopter", 1, 3], ["Helicopter Hangar", 2, 6], ["Airliner", 1, 3], ["Large Hangar", 2, 6], ["Car", 20, 75], ["Empty Car", 400, 1000]], - descriptor: ["an airport", "airports"] + contents: [ + ["Person", 1500, 4000], + ["Small Hangar", 4, 12], + ["Plane", 2, 5], + ["Helicopter", 1, 3], + ["Helicopter Hangar", 2, 6], + ["Airliner", 1, 3], + ["Large Hangar", 2, 6], + ["Car", 20, 75], + ["Empty Car", 400, 1000], + ], + descriptor: ["an airport", "airports"], }, - "Town": { - "Town": Town, + Town: { + Town: Town, mass: 1, area: 1e7, clusters: 5, - cluster_chances: .1, - contents: [["Person", 10000, 100000], ["House", 5000, 50000], ["Empty Car", 200, 800], ["Car", 500, 80000], ["Bus", 5, 25], ["Train", 5, 25], ["Business", 500, 5000]], - descriptor: ["a town", "towns"] + cluster_chances: 0.1, + contents: [ + ["Person", 10000, 100000], + ["House", 5000, 50000], + ["Empty Car", 200, 800], + ["Car", 500, 80000], + ["Bus", 5, 25], + ["Train", 5, 25], + ["Business", 500, 5000], + ], + descriptor: ["a town", "towns"], }, - "City": { - "City": City, + City: { + City: City, mass: 1, area: 1e9, clusters: 0, - cluster_chances: .2, - contents: [["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]], - descriptor: ["a city", "cities"] + cluster_chances: 0.2, + contents: [ + ["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], + ], + descriptor: ["a city", "cities"], }, - "Continent": { - "Continent": Continent, + Continent: { + Continent: Continent, mass: 1e21, area: 1.5e13, clusters: 5, - cluster_chances: .5, - contents: [["Person", 1000000, 15000000], ["House", 2500, 10000], ["Car", 25000, 375000], ["Train", 50, 500], ["Town", 500, 1000], ["City", 50, 250], ["Business", 250, 1000]], - descriptor: ["a continent", "continents"] + cluster_chances: 0.5, + contents: [ + ["Person", 1000000, 15000000], + ["House", 2500, 10000], + ["Car", 25000, 375000], + ["Train", 50, 500], + ["Town", 500, 1000], + ["City", 50, 250], + ["Business", 250, 1000], + ], + descriptor: ["a continent", "continents"], }, //Celestial Bodies - "Planet": { - "Planet": Planet, + Planet: { + Planet: Planet, mass: 5.972e24, area: 2.5e14, clusters: 0, cluster_chances: 1, contents: [["Continent", 4, 9]], - descriptor: ["a planet", "planets"] + descriptor: ["a planet", "planets"], }, - "Star": { - "Star": Star, + Star: { + Star: Star, mass: 1e40, area: 3e18, clusters: 1, cluster_chances: 1, contents: [], - descriptor: ["a star", "stars"] + descriptor: ["a star", "stars"], }, "Solar System": { "Solar System": SolarSystem, @@ -329,108 +413,117 @@ var things = area: 3e21, clusters: 1, cluster_chances: 1, - contents: [["Star", 1, 1], ["Planet", 5, 15]], - descriptor: ["a solar system", "solar systems"] + contents: [ + ["Star", 1, 1], + ["Planet", 5, 15], + ], + descriptor: ["a solar system", "solar systems"], }, - "Galaxy": { - "Galaxy": Galaxy, + Galaxy: { + Galaxy: Galaxy, mass: 1, area: 2e45, clusters: 1, cluster_chances: 1, - contents: [["Star", 1e9, 500e9], ["Solar System", 1e8, 500e8]], - descriptor: ["a galaxy", "galaxies"] + contents: [ + ["Star", 1e9, 500e9], + ["Solar System", 1e8, 500e8], + ], + descriptor: ["a galaxy", "galaxies"], }, - "Cluster": { - "Cluster": Cluster, + Cluster: { + Cluster: Cluster, mass: 1, area: 2e49, clusters: 1, cluster_chances: 1, contents: [["Galaxy", 200, 5000]], - descriptor: ["a cluster", "clusters"] + descriptor: ["a cluster", "clusters"], }, - "Universe": { - "Universe": Universe, + Universe: { + Universe: Universe, mass: 1, area: 7e53, clusters: 1, cluster_chances: 1, contents: [["Cluster", 1.5e9, 2.5e9]], - descriptor: ["a universe", "universes"] + descriptor: ["a universe", "universes"], }, - "Multiverse": { - "Multiverse": Multiverse, + Multiverse: { + Multiverse: Multiverse, mass: 1, area: 5e56, clusters: 1, cluster_chances: 1, contents: [["Universe", 100, 1000]], - descriptor: ["a multiverse", "multiverses"] + descriptor: ["a multiverse", "multiverses"], }, - "Timeline": { - "Timeline": Timeline, + Timeline: { + Timeline: Timeline, mass: 1, area: 5e75, clusters: 1, cluster_chances: 1, contents: [["Multiverse", 1e50, 1e53]], - descriptor: ["an entire timeline", "entire timelines"] + descriptor: ["an entire timeline", "entire timelines"], }, - "Pantheon": { - "Pantheon": Pantheon, + Pantheon: { + Pantheon: Pantheon, mass: 1, area: 1e100, clusters: 1, cluster_chances: 1, - contents: [["Timeline", 1e30, 1e35], ["Deity", 10, 30]], - descriptor: ["a pantheon", "pantheons"] + contents: [ + ["Timeline", 1e30, 1e35], + ["Deity", 10, 30], + ], + descriptor: ["a pantheon", "pantheons"], }, - "Deity": { - "Deity": Deity, + Deity: { + Deity: Deity, mass: 1e100, area: 1e100, clusters: 1, cluster_chances: 1, contents: [], - descriptor: ["a deity", "deities"] + descriptor: ["a deity", "deities"], }, - "Reality": { - "Reality": Reality, + Reality: { + Reality: Reality, mass: 1, area: 1e120, clusters: 1, cluster_changes: 1, contents: [["Pantheon", 1e30, 1e35]], - descriptor: ["a reality", "realities"] + descriptor: ["a reality", "realities"], }, //Military - "Soldier": { - "Soldier": Soldier, + Soldier: { + Soldier: Soldier, mass: 80, area: 1, clusters: 2, - cluster_chances: .2, + cluster_chances: 0.2, contents: [], - descriptor: ["a soldier", "soldiers"] + descriptor: ["a soldier", "soldiers"], }, - "Tank": { - "Tank": Tank, + Tank: { + Tank: Tank, mass: 5000, area: 20, clusters: 2, - cluster_chances: .25, + cluster_chances: 0.25, contents: [["Soldier", 3, 5]], - descriptor: ["a tank", "tanks"] + descriptor: ["a tank", "tanks"], }, - "Artillery": { - "Artillery": Artillery, + Artillery: { + Artillery: Artillery, mass: 7000, area: 25, clusters: 3, - cluster_chances: .5, + cluster_chances: 0.5, contents: [["Soldier", 4, 6]], - descriptor: ["an artillery tank", "artillery tanks"] + descriptor: ["an artillery tank", "artillery tanks"], }, "Military Helicopter": { "Military Helicopter": MilitaryHelicopter, @@ -439,79 +532,82 @@ var things = clusters: 0, cluster_chances: 0, contents: [["Soldier", 4, 16]], - descriptor: ["a helicopter", "helicopters"] + descriptor: ["a helicopter", "helicopters"], }, - "Squad": { - "Squad": Squad, + Squad: { + Squad: Squad, mass: 1, area: 30, clusters: 20, - cluster_chances: .05, + cluster_chances: 0.05, contents: [["Soldier", 6, 9]], - descriptor: ["a squad", "squads"] + descriptor: ["a squad", "squads"], }, - "Platoon": { - "Platoon": Platoon, + Platoon: { + Platoon: Platoon, mass: 100, area: 150, clusters: 2, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 16, 44]], - descriptor: ["a military platoon", "platoons"] + descriptor: ["a military platoon", "platoons"], }, - "Company": { - "Company": Company, + Company: { + Company: Company, mass: 500, area: 600, clusters: 2, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 60, 200]], - descriptor: ["a company of soldiers", "companies"] + descriptor: ["a company of soldiers", "companies"], }, - "Battalion": { - "Battalion": Battalion, + Battalion: { + Battalion: Battalion, mass: 1000, area: 3500, clusters: 2, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 300, 1000]], - descriptor: ["a battalion", "battalions"] + descriptor: ["a battalion", "battalions"], }, - "Brigade": { - "Brigade": Brigade, + Brigade: { + Brigade: Brigade, mass: 1500, area: 2e4, clusters: 2, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 1500, 3200]], - descriptor: ["a brigade", "brigades"] + descriptor: ["a brigade", "brigades"], }, - "Division": { - "Division": Division, + Division: { + Division: Division, mass: 2000, area: 8e4, clusters: 3, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 10000, 16000]], - descriptor: ["a division", "divisions"] + descriptor: ["a division", "divisions"], }, "Tank Division": { "Tank Division": TankDivision, mass: 3000, area: 1e5, clusters: 1, - cluster_chances: .15, - contents: [["Soldier", 8000, 1200], ["Tank", 250, 500]], - descriptor: ["a tank division", "tank divisions"] + cluster_chances: 0.15, + contents: [ + ["Soldier", 8000, 1200], + ["Tank", 250, 500], + ], + descriptor: ["a tank division", "tank divisions"], }, - "Army": { - "Army": Army, + Army: { + Army: Army, mass: 5000, area: 1e6, clusters: 2, - cluster_chances: .1, + cluster_chances: 0.1, contents: [["Soldier", 40000, 75000]], - descriptor: ["an army", "armies"] + descriptor: ["an army", "armies"], }, }; //Alterante Army Structuring, may be used later @@ -556,13 +652,12 @@ function contents_remove(thing) { // adds thing to parent function contents_insert(parent, thing, min, max, label) { let owner = things[parent].contents; - if (label == undefined) - owner.push([thing, min, max]); - else - owner.push([thing, min, max, label]); + if (label == undefined) owner.push([thing, min, max]); + else owner.push([thing, min, max, label]); } -function initContents(name, count) { //builds the contents for each destrucable(thing) when called +function initContents(name, count) { + //builds the contents for each destrucable(thing) when called let result = {}; let type = things[name].contents; @@ -570,22 +665,29 @@ function initContents(name, count) { //builds the contents for each destrucable( let amount = distribution(type[i][1], type[i][2], count); //arrays of contents look like ["thing name",min,max,"optional name"] so those values have to pulled out if (amount > 0) { // if a custom label is supplied, use it! - if (type[i].length == 4) //if has optional name - result[type[i][3]] = new things[type[i][0]][type[i][0]](amount); //creates a "thing name" under the key of "optional name" - else - result[type[i][0]] = new things[type[i][0]][type[i][0]](amount); + if (type[i].length == 4) + //if has optional name + result[type[i][3]] = new things[type[i][0]][type[i][0]]( + amount + ); //creates a "thing name" under the key of "optional name" + else result[type[i][0]] = new things[type[i][0]][type[i][0]](amount); } } return result; } - function get_living_prey(sum) { let total = 0; for (let key in sum) { if (sum.hasOwnProperty(key)) { - if (key == "Micro" || key == "Macro" || key == "Person" || key == "Cow" || key == 'Soldier') + if ( + key == "Micro" || + key == "Macro" || + key == "Person" || + key == "Cow" || + key == "Soldier" + ) total += sum[key]; } } @@ -601,7 +703,11 @@ function fill_area(area, weights, variance = 0.15) { var candidates = []; for (var key in weights) { if (weights.hasOwnProperty(key)) { - candidates.push({ "name": key, "area": things[key].area, "weight": weights[key] }); + candidates.push({ + name: key, + area: things[key].area, + weight: weights[key], + }); } } @@ -612,8 +718,7 @@ function fill_area(area, weights, variance = 0.15) { while (candidates.length > 0) { var candidate = candidates.pop(); - if (candidate.area > area) - continue; + if (candidate.area > area) continue; var max = Math.floor(area / candidate.area); var limit = Math.min(max, 1000); @@ -628,16 +733,17 @@ function fill_area(area, weights, variance = 0.15) { // if we have nothing at all, it's even better! while (loopvar < limit) { - if (loopvar == 0 && result.length == 0) { ++count; - } - else if (loopvar <= things[candidate.name].clusters) { - if (Math.random() < candidate.weight ? 1 : Math.random() < things[candidate.name].cluster_chances) { + } else if (loopvar <= things[candidate.name].clusters) { + if ( + Math.random() < candidate.weight + ? 1 + : Math.random() < things[candidate.name].cluster_chances + ) { ++count; } - } - else { + } else { count += Math.random() < candidate.weight ? 1 : 0; } ++loopvar; @@ -647,7 +753,7 @@ function fill_area(area, weights, variance = 0.15) { if (limit < max) { const base = (max - limit) * candidate.weight; - count += Math.round(base - base / 10 + base * Math.random() / 5); + count += Math.round(base - base / 10 + (base * Math.random()) / 5); } area -= count * candidate.area; @@ -696,7 +802,6 @@ function defaultMultiply(thing) { } } }; - } function defaultArea(thing) { @@ -708,12 +813,14 @@ function defaultMass(thing) { } function defaultDescribeOne(thing) { - return function (verbose) { //verbose doesn't matter for this case, becasue it handles things with no extra text to use when being verbose + return function (verbose) { + //verbose doesn't matter for this case, becasue it handles things with no extra text to use when being verbose return things[thing.name].descriptor[0]; - } + }; } -function defaultMerge(thing) { //this merges all objects into one containers +function defaultMerge(thing) { + //this merges all objects into one containers return function (container) { var newCount = this.count + container.count; var newThing = new things[thing.name][thing.name](newCount); @@ -728,7 +835,9 @@ function defaultMerge(thing) { //this merges all objects into one containers for (key in container.contents) { if (container.contents.hasOwnProperty(key)) { if (this.contents.hasOwnProperty(key)) { - newThing.contents[key] = this.contents[key].merge(container.contents[key]); + newThing.contents[key] = this.contents[key].merge( + container.contents[key] + ); } else { newThing.contents[key] = container.contents[key]; } @@ -780,8 +889,7 @@ function defaultSum(thing) { return function () { var counts = {}; - if (thing.name != "Container") - counts[thing.name] = thing.count; + if (thing.name != "Container") counts[thing.name] = thing.count; for (var key in thing.contents) { if (thing.contents.hasOwnProperty(key)) { @@ -816,7 +924,7 @@ function defaultSumProperty(thing) { } function defaultModProperty(thing) { - return function(prop, func) { + return function (prop, func) { thing[prop] = func(thing[prop]); for (var key in thing.contents) { @@ -854,8 +962,10 @@ function DefaultEntity() { // god I love reinventing the wheel -function copy_defaults(self, proto) { //loads the values defined in things into the fuction that calls it - for (var key in proto) { //proto will always be a new DefaultEntity, self is the parent function +function copy_defaults(self, proto) { + //loads the values defined in things into the fuction that calls it + for (var key in proto) { + //proto will always be a new DefaultEntity, self is the parent function if (proto.hasOwnProperty(key)) { self[key] = proto[key](self); } @@ -890,8 +1000,7 @@ function merge_desc(list) { var result = ""; list.forEach(function (term) { - if (term != "") - result += term + " "; + if (term != "") result += term + " "; }); // knock off the last space @@ -899,22 +1008,34 @@ function merge_desc(list) { result = result.substring(0, result.length - 1); } - let article = "a " + let article = "a "; //a/an overwriting terms let forcedTerms = ["honor", "heir"]; //words that need to start with an but don't start with a,e,i,o,u let force = false; for (let i of forcedTerms) { - if (i === result.substring(0, i.length)) { force = true; } + if (i === result.substring(0, i.length)) { + force = true; + } } let exceptionTerms = ["uniform", "unique"]; //words that need to start with a and start with a,e,i,o,u let exception = false; for (let i of exceptionTerms) { - if (i === result.substring(0, i.length)) { exception = true; } + if (i === result.substring(0, i.length)) { + exception = true; + } } //check if the string should start with an - if ((force == true) || (exception == false && ((result.charAt(0) == "a") || (result.charAt(0) == "e") || (result.charAt(0) == "i") || (result.charAt(0) == "o") || (result.charAt(0) == "u")))) { + if ( + force == true || + (exception == false && + (result.charAt(0) == "a" || + result.charAt(0) == "e" || + result.charAt(0) == "i" || + result.charAt(0) == "o" || + result.charAt(0) == "u")) + ) { article = "an "; } result = article + result; @@ -933,21 +1054,21 @@ function describe_all(contents, verbose = true, except = []) { return merge_things(things); } -function random_desc(list, odds = 1) { //strings together an array into a series of words +function random_desc(list, odds = 1) { + //strings together an array into a series of words if (Math.random() < odds) return list[Math.floor(Math.random() * list.length)]; - else - return ""; + else return ""; } function defaultDescribeSimple(thing) { return function (flat) { if (flat) { - return flatten(thing).describe(false) + return flatten(thing).describe(false); } else { return thing.describe(false); } - } + }; } function defaultDescribe(verbose = true, parent, descAs) { @@ -956,7 +1077,15 @@ function defaultDescribe(verbose = true, parent, descAs) { let groupLessThan3 = false; switch (descAs) { case "vehicle": - descriptorEnd = pickString(" inside", " inside", " inside", " inside", " riding inside", " trapped inside", " sitting inside"); + descriptorEnd = pickString( + " inside", + " inside", + " inside", + " inside", + " riding inside", + " trapped inside", + " sitting inside" + ); break; case "community": groupLessThan3 = true; @@ -964,59 +1093,96 @@ function defaultDescribe(verbose = true, parent, descAs) { break; case "celestial": groupLessThan3 = true; - descriptorConjunction = pickString(" made up of ", " consisting of ", " containing "); + descriptorConjunction = pickString( + " made up of ", + " consisting of ", + " containing " + ); descriptorEnd = ""; break; case "military": groupLessThan3 = true; - descriptorConjunction = pickString(" of ", " of ", " made up of ", " comprised of ", " containing "); + descriptorConjunction = pickString( + " of ", + " of ", + " made up of ", + " comprised of ", + " containing " + ); descriptorEnd = ""; break; case "generic vehicle": groupLessThan3 = true; - descriptorEnd = pickString(" inside", " inside", " inside", " inside", " riding inside", " trapped inside", " sitting inside"); + descriptorEnd = pickString( + " inside", + " inside", + " inside", + " inside", + " riding inside", + " trapped inside", + " sitting inside" + ); break; - - } if (verbose) { - if (parent.count == 1) { //singular parent (specifying single to catch cases where groupLessThan3 = true, otherwise it would output "1 towns" instead of "a town" + } + if (verbose) { + if (parent.count == 1) { + //singular parent (specifying single to catch cases where groupLessThan3 = true, otherwise it would output "1 towns" instead of "a town" if (things[parent.name].contents.length > 0) { - return (things[parent.name].descriptor[0] + descriptorConjunction + describe_all(parent.contents, false) + descriptorEnd); + return ( + things[parent.name].descriptor[0] + + descriptorConjunction + + describe_all(parent.contents, false) + + descriptorEnd + ); } else { return parent.describeOne(verbose); } - } - else if (parent.count <= 3 && groupLessThan3 == false) { // less than 3 parents and an ojbect that has varety when described + } else if (parent.count <= 3 && groupLessThan3 == false) { + // less than 3 parents and an ojbect that has varety when described var list = []; for (var i = 0; i < parent.count; i++) { list.push(parent.describeOne(parent.count <= 2)); } if (things[parent.name].contents.length > 0) { - return (merge_things(list) + descriptorConjunction + describe_all(parent.contents, false) + descriptorEnd); + return ( + merge_things(list) + + descriptorConjunction + + describe_all(parent.contents, false) + + descriptorEnd + ); } else { return merge_things(list); } - } else {//if there are more than 3 of the object + } else { + //if there are more than 3 of the object if (things[parent.name].contents.length > 0) { - return (parent.count + " " + things[parent.name].descriptor[1] + descriptorConjunction + describe_all(parent.contents, false) + descriptorEnd); + return ( + parent.count + + " " + + things[parent.name].descriptor[1] + + descriptorConjunction + + describe_all(parent.contents, false) + + descriptorEnd + ); } else { - return (parent.count + " " + things[parent.name].descriptor[1]); + return parent.count + " " + things[parent.name].descriptor[1]; } } - } else {//not verbose - return (parent.count > 1 ? (parent.count + " " + things[parent.name].descriptor[1]) : things[parent.name].descriptor[0]); + } else { + //not verbose + return parent.count > 1 + ? parent.count + " " + things[parent.name].descriptor[1] + : things[parent.name].descriptor[0]; } } - function Container(contents = []) { this.name = "Container"; copy_defaults(this, new DefaultEntity()); - if (Number.isInteger(contents)) - this.count = contents; - else - this.count = 0; + if (Number.isInteger(contents)) this.count = contents; + else this.count = 0; this.contents = {}; @@ -1042,21 +1208,49 @@ function Person(count = 1) { copy_defaults(this, new DefaultEntity()); - this.mass = ((Math.random() - .5) * 20) + this.mass; + this.mass = (Math.random() - 0.5) * 20 + this.mass; this.count = count; this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var body = random_desc(["skinny", "fat", "tall", "short", "stocky", "spindly", "muscular", "fit", "multi-colored"], (verbose ? 0.6 : 0)); - var sex = random_desc(["male", "female"], (verbose ? 0.75 : 0)); + var body = random_desc( + [ + "skinny", + "fat", + "tall", + "short", + "stocky", + "spindly", + "muscular", + "fit", + "multi-colored", + ], + verbose ? 0.6 : 0 + ); + var sex = random_desc(["male", "female"], verbose ? 0.75 : 0); var species = ""; - species = random_desc(["wolf", "cat", "dog", "squirrel", "horse", "hyena", "fox", "jackal", "crux", "sergal", "coyote", "rabbit", "lizard", "avian"]); + species = random_desc([ + "wolf", + "cat", + "dog", + "squirrel", + "horse", + "hyena", + "fox", + "jackal", + "crux", + "sergal", + "coyote", + "rabbit", + "lizard", + "avian", + ]); return merge_desc([body, sex, species]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; return this; } @@ -1066,19 +1260,32 @@ function Human(count = 1) { copy_defaults(this, new DefaultEntity()); - this.mass = ((Math.random() - .5) * 20) + this.mass; + this.mass = (Math.random() - 0.5) * 20 + this.mass; this.count = count; this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var body = random_desc(["skinny", "fat", "tall", "short", "stocky", "spindly", "muscular", "fit", "tanned"], (verbose ? 0.6 : 0)); + var body = random_desc( + [ + "skinny", + "fat", + "tall", + "short", + "stocky", + "spindly", + "muscular", + "fit", + "tanned", + ], + verbose ? 0.6 : 0 + ); var sex = random_desc(["man", "woman"], 1); return merge_desc([body, sex]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; return this; } @@ -1092,14 +1299,20 @@ function Cow(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var body = random_desc(["skinny", "fat", "tall", "short", "stocky", "spindly", "brown"], (verbose ? 0.6 : 0)); - var sex = random_desc(["bull", "steer", "cow", "cow", "cow", "heifer"], (verbose ? 1 : 0)); + var body = random_desc( + ["skinny", "fat", "tall", "short", "stocky", "spindly", "brown"], + verbose ? 0.6 : 0 + ); + var sex = random_desc( + ["bull", "steer", "cow", "cow", "cow", "heifer"], + verbose ? 1 : 0 + ); return merge_desc([body, sex]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; return this; } @@ -1112,15 +1325,43 @@ function EmptyCar(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["black", "black", "gray", "gray", "blue", "red", "tan", "white", "white"]); - var adjective = random_desc(["rusty", "brand-new", "luxury", "beat-up", "dented", "restored", "classic"], 0.3); - var type = random_desc(["SUV", "coupe", "sedan", "truck", "van", "convertible"]); + var color = random_desc([ + "black", + "black", + "gray", + "gray", + "blue", + "red", + "tan", + "white", + "white", + ]); + var adjective = random_desc( + [ + "rusty", + "brand-new", + "luxury", + "beat-up", + "dented", + "restored", + "classic", + ], + 0.3 + ); + var type = random_desc([ + "SUV", + "coupe", + "sedan", + "truck", + "van", + "convertible", + ]); return merge_desc(["parked", adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Car(count = 1) { @@ -1131,15 +1372,46 @@ function Car(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["black", "black", "gray", "gray", "blue", "red", "tan", "white", "white"], (verbose ? 1 : 0)); - var adjective = random_desc(["rusty", "brand-new", "luxury", "beat-up", "dented", "restored", "classic"], (verbose ? 0.3 : 0)); - var type = random_desc(["SUV", "coupe", "sedan", "truck", "van", "convertible"]); + var color = random_desc( + [ + "black", + "black", + "gray", + "gray", + "blue", + "red", + "tan", + "white", + "white", + ], + verbose ? 1 : 0 + ); + var adjective = random_desc( + [ + "rusty", + "brand-new", + "luxury", + "beat-up", + "dented", + "restored", + "classic", + ], + verbose ? 0.3 : 0 + ); + var type = random_desc([ + "SUV", + "coupe", + "sedan", + "truck", + "van", + "convertible", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Bus(count = 1) { @@ -1150,15 +1422,25 @@ function Bus(count = 1) { this.contents = initContents(this.name, this.count); 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", "double-decker bus", "articulating bus", "open-top bus", "sleeper bus", "intercity bus"]); + 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", + "double-decker bus", + "articulating bus", + "open-top bus", + "sleeper bus", + "intercity bus", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Tram(count = 1) { @@ -1169,15 +1451,18 @@ function Tram(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["rusty", "weathered", "well-maintained",], (verbose ? 0.3 : 0)); - var color = random_desc(["blue", "brown", "gray"], (verbose ? 1 : 0)); + var adjective = random_desc( + ["rusty", "weathered", "well-maintained"], + verbose ? 0.3 : 0 + ); + var color = random_desc(["blue", "brown", "gray"], verbose ? 1 : 0); var type = random_desc(["tram"]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; this.anal_vore = function () { return "You slide " + this.describe() + " up your tight ass"; @@ -1192,14 +1477,24 @@ function EmptyHelicopter(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["blue", "white", "white", "red", "black", "gold", "yellow"], (verbose ? 0.6 : 0)); - var type = random_desc(["bubble coptor", "helicopter", "helicopter", "news chopper", "police helicopter", "chopper"]); + var color = random_desc( + ["blue", "white", "white", "red", "black", "gold", "yellow"], + verbose ? 0.6 : 0 + ); + var type = random_desc([ + "bubble coptor", + "helicopter", + "helicopter", + "news chopper", + "police helicopter", + "chopper", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Helicopter(count = 1) { @@ -1210,14 +1505,24 @@ function Helicopter(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["blue", "white", "white", "red", "black", "gold", "yellow"], (verbose ? 0.6 : 0)); - var type = random_desc(["bubble coptor", "helicopter", "helicopter", "news chopper", "police helicopter", "chopper"]); + var color = random_desc( + ["blue", "white", "white", "red", "black", "gold", "yellow"], + verbose ? 0.6 : 0 + ); + var type = random_desc([ + "bubble coptor", + "helicopter", + "helicopter", + "news chopper", + "police helicopter", + "chopper", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function EmptyPlane(count = 1) { @@ -1228,15 +1533,34 @@ function EmptyPlane(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["brand-new", "aging", "modern"], (verbose ? 0.2 : 0)); - var color = random_desc(["blue", "white", "white", "blue and white", "red and white", "black", "gold"], (verbose ? 0.9 : 0)); - var type = random_desc(["luxury jet", "business jet", "single-engine plane", "light aircraft"]); + var adjective = random_desc( + ["brand-new", "aging", "modern"], + verbose ? 0.2 : 0 + ); + var color = random_desc( + [ + "blue", + "white", + "white", + "blue and white", + "red and white", + "black", + "gold", + ], + verbose ? 0.9 : 0 + ); + var type = random_desc([ + "luxury jet", + "business jet", + "single-engine plane", + "light aircraft", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Plane(count = 1) { @@ -1247,15 +1571,34 @@ function Plane(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["brand-new", "aging", "modern"], (verbose ? 0.2 : 0)); - var color = random_desc(["blue", "white", "white", "blue and white", "red and white", "black", "gold"], (verbose ? 0.9 : 0)); - var type = random_desc(["luxury jet", "business jet", "single-engine plane", "light aircraft"]); + var adjective = random_desc( + ["brand-new", "aging", "modern"], + verbose ? 0.2 : 0 + ); + var color = random_desc( + [ + "blue", + "white", + "white", + "blue and white", + "red and white", + "black", + "gold", + ], + verbose ? 0.9 : 0 + ); + var type = random_desc([ + "luxury jet", + "business jet", + "single-engine plane", + "light aircraft", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function EmptyAirliner(count = 1) { @@ -1266,15 +1609,30 @@ function EmptyAirliner(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["brand-new", "aging", "modern"], (verbose ? 0.2 : 0)); - var color = random_desc(["blue", "white", "white", "blue and white"], (verbose ? 0.9 : 0)); - var type = random_desc(["airliner", "twin-engine jet", "trijet", "four engine jet", "double-decker airliner", "widebody airliner", "passenger jet", "airliner"]); + var adjective = random_desc( + ["brand-new", "aging", "modern"], + verbose ? 0.2 : 0 + ); + var color = random_desc( + ["blue", "white", "white", "blue and white"], + verbose ? 0.9 : 0 + ); + var type = random_desc([ + "airliner", + "twin-engine jet", + "trijet", + "four engine jet", + "double-decker airliner", + "widebody airliner", + "passenger jet", + "airliner", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Airliner(count = 1) { @@ -1285,15 +1643,30 @@ function Airliner(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["brand-new", "aging", "modern"], (verbose ? 0.2 : 0)); - var color = random_desc(["blue", "white", "white", "blue and white"], (verbose ? 0.9 : 0)); - var type = random_desc(["airliner", "twin-engine jet", "trijet", "four engine jet", "double-decker airliner", "widebody airliner", "passenger jet", "airliner"]); + var adjective = random_desc( + ["brand-new", "aging", "modern"], + verbose ? 0.2 : 0 + ); + var color = random_desc( + ["blue", "white", "white", "blue and white"], + verbose ? 0.9 : 0 + ); + var type = random_desc([ + "airliner", + "twin-engine jet", + "trijet", + "four engine jet", + "double-decker airliner", + "widebody airliner", + "passenger jet", + "airliner", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function Train(count = 1) { @@ -1304,8 +1677,11 @@ function Train(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["rusty", "brand-new", "steam", "freshly-painted"], (verbose ? 0.3 : 0)); - var color = random_desc(["black", "tan", "gray"], (verbose ? 1 : 0)); + var adjective = random_desc( + ["rusty", "brand-new", "steam", "freshly-painted"], + verbose ? 0.3 : 0 + ); + var color = random_desc(["black", "tan", "gray"], verbose ? 1 : 0); var type = random_desc(["train", "passenger train", "freight train"]); return merge_desc([adjective, color, type]); }; @@ -1317,19 +1693,40 @@ function Train(count = 1) { for (var i = 0; i < this.count; i++) { list.push(this.describeOne(verbose)); } - return merge_things(list) + " with " + this.contents["engine"].describe(false) + " in the engine and " + this.contents["Train Car"].describe() + " attached"; + return ( + merge_things(list) + + " with " + + this.contents["engine"].describe(false) + + " in the engine and " + + this.contents["Train Car"].describe() + + " attached" + ); } else { - return this.count + " trains with " + this.contents["engine"].describe(false) + " in the engine and " + this.contents["Train Car"].describe() + " attached"; + return ( + this.count + + " trains with " + + this.contents["engine"].describe(false) + + " in the engine and " + + this.contents["Train Car"].describe() + + " attached" + ); } } else { - return (this.count > 1 ? this.count + " trains" : "a train"); + return this.count > 1 ? this.count + " trains" : "a train"; } - }; this.anal_vore = function () { - var cars = (this.contents["Train Car"].count == 1 ? this.contents["Train Car"].describe() + " follows it inside" : this.contents["Train Car"].describe() + " are pulled slowly inside"); - return "You snatch up " + this.describeOne() + " and stuff it into your pucker, moaning as " + cars; + var cars = + this.contents["Train Car"].count == 1 + ? this.contents["Train Car"].describe() + " follows it inside" + : this.contents["Train Car"].describe() + " are pulled slowly inside"; + return ( + "You snatch up " + + this.describeOne() + + " and stuff it into your pucker, moaning as " + + cars + ); }; } @@ -1341,15 +1738,25 @@ function TrainCar(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var adjective = random_desc(["rusty", "brand-new", "vintage", "graffitied", "well-maintained"], (verbose ? 0.3 : 0)); - var color = random_desc(["black", "tan", "gray", "yellow", "steel", "wooden"], (verbose ? 1 : 0)); - var type = random_desc(["train car", "passenger train car", "freight train car"]); + var adjective = random_desc( + ["rusty", "brand-new", "vintage", "graffitied", "well-maintained"], + verbose ? 0.3 : 0 + ); + var color = random_desc( + ["black", "tan", "gray", "yellow", "steel", "wooden"], + verbose ? 1 : 0 + ); + var type = random_desc([ + "train car", + "passenger train car", + "freight train car", + ]); return merge_desc([adjective, color, type]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "vehicle"); - } + }; } function House(count = 1) { @@ -1359,15 +1766,24 @@ function House(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["little", "two-story", "large", "well-built", "run-down", "cheap",], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green", "wooden", "brick"], (verbose ? 0.5 : 0)); - var name = random_desc(["house", "home", "duplex", "house", "house", "trailer"], 1); + var size = random_desc( + ["little", "two-story", "large", "well-built", "run-down", "cheap"], + verbose ? 0.5 : 0 + ); + var color = random_desc( + ["blue", "white", "gray", "tan", "green", "wooden", "brick"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["house", "home", "duplex", "house", "house", "trailer"], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } //might split this into a general business and resutrant categories function Business(count = 1) { @@ -1377,15 +1793,48 @@ function Business(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["little", "two-story", "large", "well-built", "run-down", "cheap", "aging", "corner"], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green", "brick", "concrete"], (verbose ? 0.5 : 0)); - var name = random_desc(["mall", "resturant", "bank", "clinic", "shop", "post office", "tire shop", "chain resturant", "grocery store", "barber shop", "pizza resturant", "hardware store", "movie theather", "gas station"], 1); + var size = random_desc( + [ + "little", + "two-story", + "large", + "well-built", + "run-down", + "cheap", + "aging", + "corner", + ], + verbose ? 0.5 : 0 + ); + var color = random_desc( + ["blue", "white", "gray", "tan", "green", "brick", "concrete"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + [ + "mall", + "resturant", + "bank", + "clinic", + "shop", + "post office", + "tire shop", + "chain resturant", + "grocery store", + "barber shop", + "pizza resturant", + "hardware store", + "movie theather", + "gas station", + ], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function Barn(count = 1) { @@ -1395,15 +1844,24 @@ function Barn(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["little", "big", "large", "weathered", "rotted", "new"], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green", "red"], (verbose ? 0.5 : 0)); - var name = random_desc(["barn", "barn", "barn", "barn", "barn", "farmhouse"], 1); + var size = random_desc( + ["little", "big", "large", "weathered", "rotted", "new"], + verbose ? 0.5 : 0 + ); + var color = random_desc( + ["blue", "white", "gray", "tan", "green", "red"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["barn", "barn", "barn", "barn", "barn", "farmhouse"], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function SmallHangar(count = 1) { @@ -1413,15 +1871,21 @@ function SmallHangar(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["weathered", "aging", "new"], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green"], (verbose ? 0.5 : 0)); - var name = random_desc(["hangar", "hangar", "hangar", "aircraft hangar"], 1); + var size = random_desc(["weathered", "aging", "new"], verbose ? 0.5 : 0); + var color = random_desc( + ["blue", "white", "gray", "tan", "green"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["hangar", "hangar", "hangar", "aircraft hangar"], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function HelicopterHangar(count = 1) { @@ -1431,15 +1895,21 @@ function HelicopterHangar(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["weathered", "aging", "new"], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green"], (verbose ? 0.5 : 0)); - var name = random_desc(["hangar", "hangar", "hangar", "helicopter hangar"], 1); + var size = random_desc(["weathered", "aging", "new"], verbose ? 0.5 : 0); + var color = random_desc( + ["blue", "white", "gray", "tan", "green"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["hangar", "hangar", "hangar", "helicopter hangar"], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function LargeHangar(count = 1) { @@ -1449,15 +1919,21 @@ function LargeHangar(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["weathered", "aging", "new"], (verbose ? 0.5 : 0)); - var color = random_desc(["blue", "white", "gray", "tan", "green"], (verbose ? 0.5 : 0)); - var name = random_desc(["hangar", "hangar", "hangar", "large hangar", "spacious hangar"], 1); + var size = random_desc(["weathered", "aging", "new"], verbose ? 0.5 : 0); + var color = random_desc( + ["blue", "white", "gray", "tan", "green"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["hangar", "hangar", "hangar", "large hangar", "spacious hangar"], + 1 + ); return merge_desc([size, color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function SmallSkyscraper(count = 1) { @@ -1467,14 +1943,20 @@ function SmallSkyscraper(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["blue", "white", "gray", "tan", "green"], (verbose ? 0.5 : 0)); - var name = random_desc(["skyscraper", "office tower", "office building", "high rise"], 1); + var color = random_desc( + ["blue", "white", "gray", "tan", "green"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["skyscraper", "office tower", "office building", "high rise"], + 1 + ); return merge_desc([color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function LargeSkyscraper(count = 1) { @@ -1484,14 +1966,20 @@ function LargeSkyscraper(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var color = random_desc(["blue", "white", "gray", "tan", "green", "glass"], (verbose ? 0.5 : 0)); - var name = random_desc(["skyscraper", "office tower", "office building"], 1); + var color = random_desc( + ["blue", "white", "gray", "tan", "green", "glass"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["skyscraper", "office tower", "office building"], + 1 + ); return merge_desc(["towering", color, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function ParkingGarage(count = 1) { @@ -1502,7 +1990,7 @@ function ParkingGarage(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function Ranch(count = 1) { @@ -1512,14 +2000,20 @@ function Ranch(count = 1) { this.contents = initContents(this.name, this.count); this.describeOne = function (verbose = true) { - var size = random_desc(["little", "large", "prosperous", "run-down"], (verbose ? 0.5 : 0)); - var name = random_desc(["ranch", "farm", "ranch", "dairy farm", "cattle farm", "ranch", "farm"], 1); + var size = random_desc( + ["little", "large", "prosperous", "run-down"], + verbose ? 0.5 : 0 + ); + var name = random_desc( + ["ranch", "farm", "ranch", "dairy farm", "cattle farm", "ranch", "farm"], + 1 + ); return merge_desc([size, name]); }; this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function Airstrip(count = 1) { @@ -1531,7 +2025,7 @@ function Airstrip(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function Airport(count = 1) { @@ -1543,7 +2037,7 @@ function Airport(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function Town(count = 1) { @@ -1555,7 +2049,7 @@ function Town(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function City(count = 1) { @@ -1567,7 +2061,7 @@ function City(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function Continent(count = 1) { @@ -1579,7 +2073,7 @@ function Continent(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function Planet(count = 1) { @@ -1591,7 +2085,7 @@ function Planet(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "community"); - } + }; } function Star(count = 1) { @@ -1602,7 +2096,7 @@ function Star(count = 1) { this.contents = initContents(this.name, this.count); this.describe = function (verbose = true) { - return (this.count == 1 ? "a star" : this.count + " stars"); + return this.count == 1 ? "a star" : this.count + " stars"; }; } @@ -1615,7 +2109,7 @@ function SolarSystem(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Galaxy(count = 1) { @@ -1627,7 +2121,7 @@ function Galaxy(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Cluster(count = 1) { @@ -1639,7 +2133,7 @@ function Cluster(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Universe(count = 1) { @@ -1651,7 +2145,7 @@ function Universe(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Multiverse(count = 1) { @@ -1663,7 +2157,7 @@ function Multiverse(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Timeline(count = 1) { @@ -1675,7 +2169,7 @@ function Timeline(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Pantheon(count = 1) { @@ -1687,7 +2181,7 @@ function Pantheon(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Deity(count = 1) { @@ -1699,7 +2193,7 @@ function Deity(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Reality(count = 1) { @@ -1711,7 +2205,7 @@ function Reality(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "celestial"); - } + }; } function Soldier(count = 1) { @@ -1723,7 +2217,7 @@ function Soldier(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Tank(count = 1) { @@ -1735,7 +2229,7 @@ function Tank(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "generic vehicle"); - } + }; } function Artillery(count = 1) { @@ -1747,7 +2241,7 @@ function Artillery(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "generic vehicle"); - } + }; } function MilitaryHelicopter(count = 1) { @@ -1759,7 +2253,7 @@ function MilitaryHelicopter(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "generic vehicle"); - } + }; } function Micro(count = 1) { @@ -1771,7 +2265,7 @@ function Micro(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function Macro(count = 1) { @@ -1783,7 +2277,7 @@ function Macro(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this); - } + }; } function Squad(count = 1) { @@ -1794,7 +2288,7 @@ function Squad(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Platoon(count = 1) { @@ -1805,7 +2299,7 @@ function Platoon(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Company(count = 1) { @@ -1816,7 +2310,7 @@ function Company(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Battalion(count = 1) { @@ -1827,7 +2321,7 @@ function Battalion(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Brigade(count = 1) { @@ -1838,7 +2332,7 @@ function Brigade(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Division(count = 1) { @@ -1849,7 +2343,7 @@ function Division(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function TankDivision(count = 1) { @@ -1860,7 +2354,7 @@ function TankDivision(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } function Army(count = 1) { @@ -1871,19 +2365,17 @@ function Army(count = 1) { this.describe = function (verbose = true) { return defaultDescribe(verbose, this, "military"); - } + }; } - - - //todo - //farms - //factories - //racetracks - //more building types - //cranes and other construction equipment - //nebula - //biome magic also set it so that you can't roll your existing biome - //chemical factory - //grand army - //armada +//todo +//farms +//factories +//racetracks +//more building types +//cranes and other construction equipment +//nebula +//biome magic also set it so that you can't roll your existing biome +//chemical factory +//grand army +//armada diff --git a/sounds.js b/sounds.js index 00bc142..a1fe63a 100644 --- a/sounds.js +++ b/sounds.js @@ -1,30 +1,99 @@ let last_used = {}; let sounds = { - "crush": [["Thump.", "Thoomp."], ["Crunch."], ["Crrruunch."], ["CRUNCH!"], ["CRRRUNNCH!"], ["SKRRRRUNCH!"], ["SKRRRRRRRSMASH!"]], - "swallow": [["Ulp.", "Glp.", "Slurp."], ["Glrph.", "Glurk."], ["Gluuuurrkph!", "Glurp - GLK."], ["GLRP!", "GULP!", "GLUK!"], ["GLRRRRPKH!", "GLUUUURK!"], ["GLUUUUURRPKH!", "GLOOOORPH-GLK!"]], - "drip": - [["Drip."], ["Dribble"], ["Drip-sploosh"], ["Dribble-SPLOOSH!"], ["SPLOOOOOSH!!"]], - "liquid": [["Sploosh."], ["Gush!"], ["SPLOOSH!"], ["SPLOOSH!"], ["SPLOOOOOOSH!"]], - "insert": [["Slp.", "Shlk."], ["Shlp.", "Shlrp."], ["Shlllp."], ["SHLP!", "SQUELCH!"], ["SHLLLLRP!"]], - "drop": [["Thump."], ["Thump!"], ["Splat."], ["Splat!"], ["SPLAT!"]], - "belch": [["Burp.", "Urp."], ["Urph.", "Burph."], ["Urrrrrph."], ["UuuuuuuRRRRRPPHHHhhhh."], ["UUUURRRRPHH!"], ["BUUUURRRRRRRRPPPHHH!"]], - "fart": - [["Pft."], ["Pffft."], ["Pfffffbt."], ["Frrrrrrrt."], ["FRRRRRRRRPBBT!"]], - "scat": - [["Clench."], ["Squeeeeeze."], ["Squeeeeeeeeeeeze."], ["Sqlllllch."], ["SQLLLLLLCH!"]], - "digest": - [["Grrgle."], ["Grrrrgle"], ["Grrrrlglorp."], ["GrrrrGLRRRLPH!"], ["GRRRRRLGPRLHK!"]], - "goo": - [["Splat."], ["Squish."], ["Squish!"], ["SQLCH!"], ["SQLLLLRCH!"], ["SQQQQUEEEEELLCH!"]], - "vomit": - [["Hurk."], ["Hurrk."], ["Bleugh."], ["Bleugh!"], ["Bleeeugh!"], ["BLEEEUGHK!"]], - "breath": - [["Woosh."], ["Fwoosh."], ["FWOOSH."], ["FWOOSH!"], ["FWOOOOOOSH!"]], - "chew": - [["Snap.", "Crack."], ["Crunch."], ["Crack!"], ["CRUNCH!"], ["CRRRUNCH!"]], - "magic": - [["Zap."], ["Zap!"], ["Fwoosh!"]] + crush: [ + ["Thump.", "Thoomp."], + ["Crunch."], + ["Crrruunch."], + ["CRUNCH!"], + ["CRRRUNNCH!"], + ["SKRRRRUNCH!"], + ["SKRRRRRRRSMASH!"], + ], + swallow: [ + ["Ulp.", "Glp.", "Slurp."], + ["Glrph.", "Glurk."], + ["Gluuuurrkph!", "Glurp - GLK."], + ["GLRP!", "GULP!", "GLUK!"], + ["GLRRRRPKH!", "GLUUUURK!"], + ["GLUUUUURRPKH!", "GLOOOORPH-GLK!"], + ], + drip: [ + ["Drip."], + ["Dribble"], + ["Drip-sploosh"], + ["Dribble-SPLOOSH!"], + ["SPLOOOOOSH!!"], + ], + liquid: [ + ["Sploosh."], + ["Gush!"], + ["SPLOOSH!"], + ["SPLOOSH!"], + ["SPLOOOOOOSH!"], + ], + insert: [ + ["Slp.", "Shlk."], + ["Shlp.", "Shlrp."], + ["Shlllp."], + ["SHLP!", "SQUELCH!"], + ["SHLLLLRP!"], + ], + drop: [["Thump."], ["Thump!"], ["Splat."], ["Splat!"], ["SPLAT!"]], + belch: [ + ["Burp.", "Urp."], + ["Urph.", "Burph."], + ["Urrrrrph."], + ["UuuuuuuRRRRRPPHHHhhhh."], + ["UUUURRRRPHH!"], + ["BUUUURRRRRRRRPPPHHH!"], + ], + fart: [ + ["Pft."], + ["Pffft."], + ["Pfffffbt."], + ["Frrrrrrrt."], + ["FRRRRRRRRPBBT!"], + ], + scat: [ + ["Clench."], + ["Squeeeeeze."], + ["Squeeeeeeeeeeeze."], + ["Sqlllllch."], + ["SQLLLLLLCH!"], + ], + digest: [ + ["Grrgle."], + ["Grrrrgle"], + ["Grrrrlglorp."], + ["GrrrrGLRRRLPH!"], + ["GRRRRRLGPRLHK!"], + ], + goo: [ + ["Splat."], + ["Squish."], + ["Squish!"], + ["SQLCH!"], + ["SQLLLLRCH!"], + ["SQQQQUEEEEELLCH!"], + ], + vomit: [ + ["Hurk."], + ["Hurrk."], + ["Bleugh."], + ["Bleugh!"], + ["Bleeeugh!"], + ["BLEEEUGHK!"], + ], + breath: [["Woosh."], ["Fwoosh."], ["FWOOSH."], ["FWOOSH!"], ["FWOOOOOOSH!"]], + chew: [ + ["Snap.", "Crack."], + ["Crunch."], + ["Crack!"], + ["CRUNCH!"], + ["CRRRUNCH!"], + ], + magic: [["Zap."], ["Zap!"], ["Fwoosh!"]], }; function pickByMass(name, mass) { diff --git a/units.js b/units.js index 3330bf8..d15321c 100644 --- a/units.js +++ b/units.js @@ -1,4 +1,4 @@ -'use strict'; +"use strict"; function round(number, precision = 3) { return Math.round(number * Math.pow(10, precision)) / Math.pow(10, precision); @@ -16,34 +16,40 @@ function numberRough(value, suffix = "") { } else { var scale = Math.floor(Math.log10(value)); switch (scale) { - case 1: return "dozens " + suffix; - case 2: return "hundreds " + suffix; + case 1: + return "dozens " + suffix; + case 2: + return "hundreds " + suffix; default: let prefix = ""; - if (scale % 3 == 1) - prefix = "tens of "; - else if (scale % 3 == 2) - prefix = "hundreds of "; + if (scale % 3 == 1) prefix = "tens of "; + else if (scale % 3 == 2) prefix = "hundreds of "; let order = Math.floor(scale / 3); switch (order) { - case 1: return prefix + "thousands " + suffix; - case 2: return prefix + "millions " + suffix; - case 3: return prefix + "billions " + suffix; - case 4: return prefix + "trillions " + suffix; - case 5: return prefix + "quadrillions " + suffix; - case 6: return prefix + "quintillions " + suffix; - default: return "uncountably many"; + case 1: + return prefix + "thousands " + suffix; + case 2: + return prefix + "millions " + suffix; + case 3: + return prefix + "billions " + suffix; + case 4: + return prefix + "trillions " + suffix; + case 5: + return prefix + "quadrillions " + suffix; + case 6: + return prefix + "quintillions " + suffix; + default: + return "uncountably many"; } } } } function fixedIfDecimal(num, fixed) { - if (fixed === undefined) - return num.toString(); + if (fixed === undefined) return num.toString(); else; return num.toFixed(fixed); } @@ -56,9 +62,12 @@ function number(value, type = "full", fixed) { return fixedIfDecimal(val, fixed); } - case "scientific": return val.toExponential(3, fixed).toString(); - case "words": return number_words_repeated(val, fixed); - case "prefix": return number_prefix(val, fixed); + case "scientific": + return val.toExponential(3, fixed).toString(); + case "words": + return number_words_repeated(val, fixed); + case "prefix": + return number_prefix(val, fixed); } } @@ -68,108 +77,169 @@ function number_words(value) { return fixedIfDecimal(value, fixed); } switch (scale) { - case 0: return value.toString(); - case 1: return Math.round(value / 1e3).toString() + " thousand"; - case 2: return Math.round(value / 1e6).toString() + " million"; - case 3: return Math.round(value / 1e9).toString() + " billion"; - case 4: return Math.round(value / 1e12).toString() + " trillion"; - case 5: return Math.round(value / 1e15).toString() + " quadrillion"; - case 6: return Math.round(value / 1e18).toString() + " quintillion"; - case 7: return Math.round(value / 1e21).toString() + " sextillion"; - case 8: return Math.round(value / 1e24).toString() + " septillion"; - case 9: return Math.round(value / 1e27).toString() + " octillion"; - case 10: return Math.round(value / 1e30).toString() + " nonillion"; - case 11: return Math.round(value / 1e33).toString() + " decillion"; - case 12: return Math.round(value / 1e36).toString() + " undecillion"; - case 13: return Math.round(value / 1e39).toString() + " duodecillion"; - case 14: return Math.round(value / 1e42).toString() + " tredecillion"; - case 15: return Math.round(value / 1e45).toString() + " quattuordecillion"; - case 16: return Math.round(value / 1e48).toString() + " quindecillion"; - case 17: return Math.round(value / 1e51).toString() + " sexdecillion"; - case 18: return Math.round(value / 1e54).toString() + " septendecillion"; - case 19: return Math.round(value / 1e57).toString() + " octodecillion"; - case 20: return Math.round(value / 1e60).toString() + " novemdecillion"; - default: return Math.round(value / 1e63).toString() + " vigintillion"; + case 0: + return value.toString(); + case 1: + return Math.round(value / 1e3).toString() + " thousand"; + case 2: + return Math.round(value / 1e6).toString() + " million"; + case 3: + return Math.round(value / 1e9).toString() + " billion"; + case 4: + return Math.round(value / 1e12).toString() + " trillion"; + case 5: + return Math.round(value / 1e15).toString() + " quadrillion"; + case 6: + return Math.round(value / 1e18).toString() + " quintillion"; + case 7: + return Math.round(value / 1e21).toString() + " sextillion"; + case 8: + return Math.round(value / 1e24).toString() + " septillion"; + case 9: + return Math.round(value / 1e27).toString() + " octillion"; + case 10: + return Math.round(value / 1e30).toString() + " nonillion"; + case 11: + return Math.round(value / 1e33).toString() + " decillion"; + case 12: + return Math.round(value / 1e36).toString() + " undecillion"; + case 13: + return Math.round(value / 1e39).toString() + " duodecillion"; + case 14: + return Math.round(value / 1e42).toString() + " tredecillion"; + case 15: + return Math.round(value / 1e45).toString() + " quattuordecillion"; + case 16: + return Math.round(value / 1e48).toString() + " quindecillion"; + case 17: + return Math.round(value / 1e51).toString() + " sexdecillion"; + case 18: + return Math.round(value / 1e54).toString() + " septendecillion"; + case 19: + return Math.round(value / 1e57).toString() + " octodecillion"; + case 20: + return Math.round(value / 1e60).toString() + " novemdecillion"; + default: + return Math.round(value / 1e63).toString() + " vigintillion"; } } function number_words_repeated(value, fixed) { - if (value == Infinity) - return "a lot of"; + if (value == Infinity) return "a lot of"; var scale = Math.floor(Math.log(value) / Math.log(1000)); - if (scale < 0) - return fixedIfDecimal(value, fixed); + if (scale < 0) return fixedIfDecimal(value, fixed); switch (scale) { - case 0: return fixedIfDecimal(value, fixed); - case 1: return Math.round(value / 1e3).toString() + " thousand"; - case 2: return Math.round(value / 1e6).toString() + " million"; - case 3: return Math.round(value / 1e9).toString() + " billion"; - case 4: return Math.round(value / 1e12).toString() + " trillion"; - case 5: return Math.round(value / 1e15).toString() + " quadrillion"; - case 6: return Math.round(value / 1e18).toString() + " quintillion"; - case 7: return Math.round(value / 1e21).toString() + " sextillion"; - case 8: return Math.round(value / 1e24).toString() + " septillion"; - case 9: return Math.round(value / 1e27).toString() + " octillion"; - case 10: return Math.round(value / 1e30).toString() + " nonillion"; - case 11: return Math.round(value / 1e33).toString() + " decillion"; - default: return number_words_repeated(value / 1e33) + " decillion"; + case 0: + return fixedIfDecimal(value, fixed); + case 1: + return Math.round(value / 1e3).toString() + " thousand"; + case 2: + return Math.round(value / 1e6).toString() + " million"; + case 3: + return Math.round(value / 1e9).toString() + " billion"; + case 4: + return Math.round(value / 1e12).toString() + " trillion"; + case 5: + return Math.round(value / 1e15).toString() + " quadrillion"; + case 6: + return Math.round(value / 1e18).toString() + " quintillion"; + case 7: + return Math.round(value / 1e21).toString() + " sextillion"; + case 8: + return Math.round(value / 1e24).toString() + " septillion"; + case 9: + return Math.round(value / 1e27).toString() + " octillion"; + case 10: + return Math.round(value / 1e30).toString() + " nonillion"; + case 11: + return Math.round(value / 1e33).toString() + " decillion"; + default: + return number_words_repeated(value / 1e33) + " decillion"; } } function number_prefix(value, fixed) { var scale = Math.floor(Math.log(value) / Math.log(1000)); - if (scale < 0) - return fixedIfDecimal(value, fixed); + if (scale < 0) return fixedIfDecimal(value, fixed); switch (scale) { - case 0: return fixedIfDecimal(value, fixed); - case 1: return Math.round(value / 1e3).toString() + "K"; - case 2: return Math.round(value / 1e6).toString() + "M"; - case 3: return Math.round(value / 1e9).toString() + "G"; - case 4: return Math.round(value / 1e12).toString() + "T"; - case 5: return Math.round(value / 1e15).toString() + "P"; - case 6: return Math.round(value / 1e18).toString() + "E"; - case 7: return Math.round(value / 1e21).toString() + "Z"; - default: return Math.round(value / 1e24).toString() + "Y"; + case 0: + return fixedIfDecimal(value, fixed); + case 1: + return Math.round(value / 1e3).toString() + "K"; + case 2: + return Math.round(value / 1e6).toString() + "M"; + case 3: + return Math.round(value / 1e9).toString() + "G"; + case 4: + return Math.round(value / 1e12).toString() + "T"; + case 5: + return Math.round(value / 1e15).toString() + "P"; + case 6: + return Math.round(value / 1e18).toString() + "E"; + case 7: + return Math.round(value / 1e21).toString() + "Z"; + default: + return Math.round(value / 1e24).toString() + "Y"; } } function mass(kg, type = "metric", singular = false) { switch (type) { - case "metric": return metricMass(kg, singular); - case "SI": return metricSymMass(kg, singular); - case "customary": return customaryMass(kg, singular); - case "US": return customarySymMass(kg, singular); - case "approx": return approxMass(kg, singular); + case "metric": + return metricMass(kg, singular); + case "SI": + return metricSymMass(kg, singular); + case "customary": + return customaryMass(kg, singular); + case "US": + return customarySymMass(kg, singular); + case "approx": + return approxMass(kg, singular); } } function length(m, type = "metric", singular = false) { switch (type) { - case "metric": return metricLength(m, singular); - case "SI": return metricSymLength(m, singular); - case "customary": return customaryLength(m, singular); - case "US": return customarySymLength(m, singular); - case "approx": return approxLength(m, singular); + case "metric": + return metricLength(m, singular); + case "SI": + return metricSymLength(m, singular); + case "customary": + return customaryLength(m, singular); + case "US": + return customarySymLength(m, singular); + case "approx": + return approxLength(m, singular); } } function area(m2, type = "metric", singular = false) { switch (type) { - case "metric": return metricArea(m2, singular); - case "SI": return metricSymArea(m2, singular); - case "customary": return customaryArea(m2, singular); - case "US": return customarySymArea(m2, singular); - case "approx": return approxArea(m2, singular); + case "metric": + return metricArea(m2, singular); + case "SI": + return metricSymArea(m2, singular); + case "customary": + return customaryArea(m2, singular); + case "US": + return customarySymArea(m2, singular); + case "approx": + return approxArea(m2, singular); } } function volume(m3, type = "metric", singular = false) { switch (type) { - case "metric": return metricVolume(m3, singular); - case "SI": return metricSymVolume(m3, singular); - case "customary": return customaryVolume(m3, singular); - case "US": return customarySymVolume(m3, singular); - case "approx": return approxVolume(m3, singular); + case "metric": + return metricVolume(m3, singular); + case "SI": + return metricSymVolume(m3, singular); + case "customary": + return customaryVolume(m3, singular); + case "US": + return customarySymVolume(m3, singular); + case "approx": + return approxVolume(m3, singular); } } @@ -266,13 +336,21 @@ function approxMass(kg, singular = false) { return mass + (singular || mass == 1 ? " tank" : " tanks"); } else if (kg < 5.2e10) { let mass = round(kg / 9.7e7, 2); - return mass + (singular || mass == 1 ? " aircraft carrier" : " aircraft carriers"); + return ( + mass + + (singular || mass == 1 ? " aircraft carrier" : " aircraft carriers") + ); } else if (kg < 1.5e13) { let mass = round(kg / 5.2e10, 2); - return mass + (singular || mass == 1 ? " Great Wall of China" : " Great Wall Of Chinas"); + return ( + mass + + (singular || mass == 1 ? " Great Wall of China" : " Great Wall Of Chinas") + ); } else if (kg < 5e21) { let mass = round(kg / 1.5e15, 2); - return mass + (singular || mass == 1 ? " New York City" : " New York Cities"); + 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.6e20, 2); @@ -352,7 +430,7 @@ function customarySymLength(m, singular = false) { if (ft < 1) { let length = round(ft * 12, 0); - return length + "\""; + return length + '"'; } else if (ft < 5280) { let end = customarySymLength((ft - Math.floor(ft)) / 3.28084, singular); let length = Math.floor(ft); @@ -369,13 +447,23 @@ function approxLength(m, singular = false) { return length + (singular || length == 1 ? " person" : " people"); } else if (m < 350) { let length = round(m / 49, 1); - return length + (singular || length == 1 ? " football field" : " football fields"); + return ( + length + + (singular || length == 1 ? " football field" : " football fields") + ); } else if (m < 20000) { let length = round(m / 449, 1); - return length + (singular || length == 1 ? " Empire State Building" : " Empire State Buildings"); + return ( + length + + (singular || length == 1 + ? " Empire State Building" + : " Empire State Buildings") + ); } else if (m < 2000000) { let length = round(m / 80467.2, 1); - return length + (singular || length == 1 ? " Panama Canal" : " Panama Canals"); + return ( + length + (singular || length == 1 ? " Panama Canal" : " Panama Canals") + ); } else if (m < 3474574 * 2) { let length = round(m / 3474574, 1); return length + (singular || length == 1 ? " Moon" : " moons"); @@ -409,7 +497,10 @@ function approxLength(m, singular = false) { function metricArea(m2, singular = false) { if (m2 < 1 / 10) { let area = round(m2 * 10000, 2); - return area + (singular || area == 1 ? " square centimeter" : " square centimeters"); + return ( + area + + (singular || area == 1 ? " square centimeter" : " square centimeters") + ); } else if (m2 < 100000) { let area = round(m2, 2); return area + (singular || area == 1 ? " square meter" : " square meters"); @@ -438,7 +529,7 @@ function customaryArea(m2, singular = false) { if (ft2 < 1) { let area = round(ft2 * 144, 0); return area + (singular || area == 1 ? " square inch" : " square inches"); - } else if (ft2 < 5280 * 5280 / 10) { + } else if (ft2 < (5280 * 5280) / 10) { let area = round(ft2, 1); return area + (singular || area == 1 ? " square foot" : " square feet"); } else { @@ -463,21 +554,23 @@ function customarySymArea(m2, singular = false) { function approxArea(m2, singular = false) { if (m2 < 20000) { let area = round(m2 / 5341.85, 1); - return area + (singular || area == 1 ? " football field" : " football fields"); - } else if (m2 < 9.36e+15) { + return ( + area + (singular || area == 1 ? " football field" : " football fields") + ); + } else if (m2 < 9.36e15) { let area = round(m2 / 10117.1, 1); return area + (singular || area == 1 ? " block" : " blocks"); - } else if (m2 < 3.7920361e+13) { - let area = round(m2 / 9.36e+8, 1); + } else if (m2 < 3.7920361e13) { + let area = round(m2 / 9.36e8, 1); return area + (singular || area == 1 ? " city" : " cities"); - } else if (m2 < 9.4800902e+18) { - let area = round(m2 / 9.4800902e+12, 1); + } else if (m2 < 9.4800902e18) { + let area = round(m2 / 9.4800902e12, 1); return area + (singular || area == 1 ? " moon" : " moons"); - } else if (m2 < 2.8118957330513e+42) { - let area = round(m2 / 6.4900004e+28, 1); + } else if (m2 < 2.8118957330513e42) { + let area = round(m2 / 6.4900004e28, 1); return area + (singular || area == 1 ? " solar system" : " solar systems"); } else { - let area = round(m2 / 2.8118957330513e+42, 1); + let area = round(m2 / 2.8118957330513e42, 1); return area + (singular || area == 1 ? " milky way" : " milky ways"); } } @@ -491,13 +584,21 @@ function metricVolume(m3, singular = false) { return volume + (singular || volume == 1 ? " liter" : " liters"); } else if (m3 < 1000000) { let volume = round(m3, 0); - return volume + (singular || volume == 1 ? " cubic meter" : " cubic meters"); + return ( + volume + (singular || volume == 1 ? " cubic meter" : " cubic meters") + ); } else if (m3 < 1e12) { let volume = round(m3 / 1e9, 3); - return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); + return ( + volume + + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers") + ); } else { let volume = round(m3 / 1e9, 0); - return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); + return ( + volume + + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers") + ); } } @@ -524,7 +625,9 @@ function customaryVolume(m3, singular = false) { let gallons = m3 * 264.172; if (gallons < 1 / 16) { let volume = round(gallons * 128, 0); - return volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces"); + return ( + volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces") + ); } else if (gallons < 1 / 4) { let volume = round(gallons * 16, 1); return volume + (singular || volume == 1 ? " cup" : " cups"); @@ -570,7 +673,7 @@ function approxVolume(m3, singular = false) { if (m3 < 2 / 10000) { let volume = round(m3 * 4e5, 0); return volume + (singular || volume == 1 ? " shot" : " shots"); - } else if (m3 < .1) { + } else if (m3 < 0.1) { let volume = round(m3 * 2254, 1); return volume + (singular || volume == 1 ? " glass" : " glasses"); } else if (m3 < 100) { @@ -578,13 +681,21 @@ function approxVolume(m3, singular = false) { return volume + (singular || volume == 1 ? " bathtub" : " bathtubs"); } else if (m3 < 1e5) { let volume = round(m3 / 1000, 2); - return volume + (singular || volume == 1 ? " Olympic swimming pool" : " Olympic swimming pools"); + return ( + volume + + (singular || volume == 1 + ? " Olympic swimming pool" + : " Olympic swimming pools") + ); } else if (m3 < 1e9) { let volume = round(m3 / 3.2e5, 2); return volume + (singular || volume == 1 ? " oil tanker" : " oil tankers"); } else if (m3 < 1e15) { let volume = round(m3 / 1.8919e10, 3); - return volume + (singular || volume == 1 ? " Great Salt Lake" : " Great Salt Lakes"); + return ( + volume + + (singular || volume == 1 ? " Great Salt Lake" : " Great Salt Lakes") + ); } else if (m3 < 1e20) { let volume = round(m3 / 3.547e17, 3); return volume + (singular || volume == 1 ? " ocean" : " oceans"); @@ -597,17 +708,16 @@ function approxVolume(m3, singular = false) { } } - function makeSphere(input = 0, diameter = false) { - if (diameter = true) { + if ((diameter = true)) { input = input / 2; } - return (4 / 3) * Math.PI * (Math.pow(input, 3)); + 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) { + let output = math.pow((3 * input) / (4 * Math.PI), 1 / 3); + if ((diameter = true)) { output = output * 2; } return output;