ソースを参照

Added piss and scat. Delightful!

tags/v0.7.0
Fen Dweller 7年前
コミット
3e8fe165cd
4個のファイルの変更372行の追加7行の削除
  1. +251
    -3
      game.js
  2. +56
    -2
      recursive-desc.js
  3. +10
    -0
      recursive-macro.js
  4. +55
    -2
      stroll.html

+ 251
- 3
game.js ファイルの表示

@@ -331,7 +331,7 @@ let macro =
return this.dickLength * this.dickDiameter* Math.PI / 2;
},
get dickVolume() {
return this.dickLength * Math.pow(this.dickDiameter,2) * Math.PI;
return this.dickLength * Math.pow(this.dickDiameter/2,2) * Math.PI;
},
get dickMass() {
return this.dickVolume * this.dickDensity;
@@ -467,7 +467,12 @@ let macro =
return describe("stomach",container,this.owner,verbose);
},
"fill": function(owner,container) {
owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e4;
if (owner.gasEnabled)
owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e4;
if (owner.scatEnabled) {
owner.scatStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3;
owner.scatStorage.victims = owner.scatStorage.victims.merge(container);
}
},
get description() {
let prey = new Container();
@@ -510,7 +515,12 @@ let macro =
return describe("bowels",container,this.owner,verbose);
},
"fill": function(owner,container) {
owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3;
if (owner.gasEnabled)
owner.gasStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3;
if (owner.scatEnabled) {
owner.scatStorage.amount += container.sum_property("mass") * this.owner.gasDigestFactor / 1e3;
owner.scatStorage.victims = owner.scatStorage.victims.merge(container);
}
},
get description() {
let prey = new Container();
@@ -654,6 +664,48 @@ let macro =
"stages" : 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);
},
"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("bladder",container,this.owner,verbose);
},
"fill": function(owner,container) {
if (macro.lactationEnabled) {
owner.pissStorage.amount += container.sum_property("mass") / 1e3;
}
},
get description() {
let prey = new Container();
this.contents.forEach(function(x) {
prey = prey.merge(x);
});

if (prey.count == 0) {
return "Your bladder has nobody in it.";
} else {
if (macro.brutality > 0) {
return "Your bladder bulges, " + prey.describe(false) + " dissolving in your acrid piss.";
} else {
return "Your bladder bulges with " + prey.describe(false) + ".";
}
}
},
"contents" : [],
"stages" : 3
},

soulVoreEnabled: true,

"souls": {
@@ -777,11 +829,14 @@ let macro =
this.womb.setup(this);
this.balls.setup(this);
this.breasts.setup(this);
this.bladder.setup(this);
this.souls.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;

if (this.analVoreToStomach) {
this.bowels.moves = this.stomach;
@@ -797,6 +852,10 @@ let macro =
this.quenchExcess(this);
if (this.gasEnabled)
this.fillGas(this);
if (this.pissEnabled)
this.fillPiss(this);
if (this.scatEnabled)
this.fillScat(this);
},

"maleParts": true,
@@ -854,6 +913,36 @@ let macro =
update();
},

"pissEnabled": true,
"pissScale": 1,
"baseUrethraDiameter": 0.03,
"urethraStretch": 5,
get urethraDiameter() {
return this.scaling(this.baseUrethraDiameter, this.scale, 1);
},
get urethraStretchDiameter() {
return this.urethraDiameter * this.urethraStretch;
},
get urethraStretchArea() {
return (this.urethraStretchDiameter * this.urethraStretchDiameter / 4) * Math.PI;
},

"fillPiss": function(self) {
self.pissStorage.amount += self.pissScale * self.pissStorage.limit / 1200;
if (self.pissStorage.amount > self.pissStorage.limit * 2)
piss(null,self.pissStorage.amount);
setTimeout(function () { self.fillPiss(self); }, 100);
update();
},

// no actual filling, but it handles updates
"fillScat": function(self) {
if (self.scatStorage.amount > self.scatStorage.limit * 2)
scat(null,self.scatStorage.amount);
setTimeout(function () { self.fillScat(self); }, 100);
update();
},

"cumStorage": {
"amount": 0,
get limit() {
@@ -882,6 +971,23 @@ let macro =
}
},

"pissStorage": {
"amount": 0,
get limit() {
return Math.pow(this.owner.scale,3) / 5000;
}
},

"scatEnabled": true,

"scatStorage": {
"amount": 0,
"victims": new Container(),
get limit() {
return Math.pow(this.owner.scale,3) / 1000;
}
},

"stenchEnabled": true,
"basePawStenchArea": 1,
get pawStenchArea() {
@@ -2840,6 +2946,118 @@ function footwearUpdate() {

}

function piss(e,vol) {
if (vol == undefined) {
vol = macro.pissStorage.amount;
}

macro.pissStorage.amount -= vol;

let area = Math.pow(vol, 2/3);

let prey = getPrey(biome, area);
let line = describe("piss", prey, macro, verbose).replace("$VOLUME",volume(vol,unit,false));
let linesummary = summarize(prey.sum(), true);

let people = get_living_prey(prey.sum());

let sound = "Dribble.";

if (people < 3) {
sound = "Dribble.";
} else if (people < 10) {
sound = "Splash.";
} else if (people < 50) {
sound = "Splash!";
} else if (people < 500) {
sound = "SPLOOSH!";
} else if (people < 5000) {
sound = "SPLOOOOOOOOOOSH!!";
} else {
sound = "Oh the humanity!";
}
let preyMass = prey.sum_property("mass");

add_victim_people("piss",prey);
update([sound,line,linesummary,newline]);

macro.arouse(20);
}

function bladder_vore() {
let prey = getPrey(biome, macro.urethraStretchArea);
let line = describe("bladder-vore", prey, macro, verbose);
let linesummary = summarize(prey.sum(), false);

let people = get_living_prey(prey.sum());

let sound = "Shlp";

if (people < 3) {
sound = "Shlp.";
} else if (people < 10) {
sound = "Squelch.";
} else if (people < 50) {
sound = "Shlurrp.";
} else if (people < 500) {
sound = "SHLRP!";
} else if (people < 5000) {
sound = "SQLCH!!";
} else {
sound = "Oh the humanity!";
}

let preyMass = prey.sum_property("mass");

add_victim_people("piss",prey);

macro.bladder.feed(prey);

update([sound,line,linesummary,newline]);

macro.arouse(20);
}

function scat(e,vol) {
if (vol == undefined) {
vol = macro.scatStorage.amount;
}

macro.scatStorage.amount -= vol;

let area = Math.pow(vol, 2/3);

let scatArea = macro.analVoreArea;
let scatLength = vol / macro.analVoreArea;
let prey = getPrey(biome, area);
let line = describe("scat", prey, macro, verbose).replace("$MASS",mass(vol,unit,true)).replace("$LENGTH",length(scatLength,unit,true));
let linesummary = summarize(prey.sum(), true);

let people = get_living_prey(prey.sum());

let sound = "Thump.";

if (people < 3) {
sound = "Thump.";
} else if (people < 10) {
sound = "THUMP.";
} else if (people < 50) {
sound = "SqlllchTHUMP!";
} else if (people < 500) {
sound = "THOOMP!";
} else if (people < 5000) {
sound = "THUUUUUUUMP.";
} else {
sound = "Oh the humanity!";
}

macro.scatStorage.victims = new Container();
add_victim_people("scat",prey);
update([sound,line,linesummary,newline]);

macro.arouse(50);
}

function transformNumbers(line)
{
return line.toString().replace(/[0-9]+(\.[0-9]+)?(e\+[0-9]+)?/g, function(text) { return number(text, numbers); });
@@ -2871,6 +3089,10 @@ function update(lines = [])
document.getElementById("milkPercent").innerHTML = Math.round(macro.milkStorage.amount / macro.milkStorage.limit * 100) + "%";
document.getElementById("gas").innerHTML = "Gas: " + transformNumbers(volume(macro.gasStorage.amount,unit,false));
document.getElementById("gasPercent").innerHTML = Math.round(macro.gasStorage.amount / macro.gasStorage.limit * 100) + "%";
document.getElementById("piss").innerHTML = "Piss: " + transformNumbers(volume(macro.pissStorage.amount,unit,false));
document.getElementById("pissPercent").innerHTML = Math.round(macro.pissStorage.amount / macro.pissStorage.limit * 100) + "%";
document.getElementById("scat").innerHTML = "Scat: " + transformNumbers(volume(macro.scatStorage.amount,unit,false));
document.getElementById("scatPercent").innerHTML = Math.round(macro.scatStorage.amount / macro.scatStorage.limit * 100) + "%";

}

@@ -3360,6 +3582,32 @@ function startGame(e) {
footwearUpdate();
}

if (macro.pissEnabled) {
enable_panel("waste");

enable_button("piss");

enable_stat("piss");

enable_victim("piss","Pissed away");

if (macro.bladderVore) {
enable_button("bladder_vore");

enable_victim("bladder_vore","Dissolved into piss");
}
}

if (macro.scatEnabled) {
enable_panel("waste");

enable_button("scat");

enable_stat("scat");

enable_victim("scat","Shat on");
}

document.getElementById("button-arousal").innerHTML = (macro.arousalEnabled ? "Arousal On" : "Arousal Off");
if (!macro.arousalEnabled) {
document.getElementById("arousal").style.display = "none";


+ 56
- 2
recursive-desc.js ファイルの表示

@@ -21,8 +21,8 @@ var actions = ["eat","chew","stomp","kick","anal-vore","ass-crush","tail-slap","
"breast-vore","breast-milk","unbirth","sheath-stuff","sheath-squeeze","sheath-crush",
"sheath-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","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","soul-digest",
"wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock"];
"paw-stench","ass-stench","belch","fart","stomach","womb","balls","bowels","bowels-to-stomach","breasts","bladder","soul-digest",
"wear-shoe","remove-shoe","wear-sock","remove-sock","stuff-shoe","dump-shoe","stuff-sock","dump-sock","piss","bladder-vore","scat"];

for (let i=0; i<actions.length; i++) {
rules[actions[i]] = [];
@@ -507,6 +507,13 @@ function defaultBreasts(container, macro, verbose) {
return "Your breasts slosh as they absorb " + container.describe(false);
}

function defaultBladder(container, macro, verbose) {
if (isFatal(macro))
return "Your bladder swells as it dissolves " + container.describe(false) + " into acrid piss";
else
return "Your bladder squeezes as it absorbs " + container.describe(false);
}

function defaultSoulDigest(container, macro, verbose) {
let sum = container.sum()["Person"];
switch(macro.soulVoreType) {
@@ -587,6 +594,53 @@ function defaultDumpSock(container, macro, verbose) {
}
}

function defaultPiss(container, macro, verbose) {
if (macro.maleParts) {
if (container.count == 0) {
return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeDick + " cock.";
} else {
return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeDick + " cock, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
}
} else if (macro.femaleParts) {
if (container.count == 0) {
return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeVagina + " slit.";
} else {
return "You sigh with relief as $VOLUME of piss erupts from your " + macro.describeVagina + " slit, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
}
} else {
if (container.count == 0) {
return "You sigh with relief as $VOLUME of piss erupts from between your legs.";
} else {
return "You sigh with relief as $VOLUME of piss erupts from between your legs, spraying down " + container.describe(verbose) + " in a shower of golden, musky fluid.";
}
}
}

function defaultBladderVore(container, macro, verbose) {
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.";
}
}
}

function defaultScat(container, macro, verbose) {
if (macro.scatStorage.victims.count == 0) {
return "Your bowels are empty.";
} else if (macro.brutality > 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);
}
}

// EATING

rules["eat"].push({


+ 10
- 0
recursive-macro.js ファイルの表示

@@ -393,6 +393,16 @@ function defaultMerge(thing) {
};
}

function listSum(sum) {
let result = [];
for (let key in sum) {
if (sum.hasOwnProperty(key)) {
result.push(new things[key](sum[key]).describe(false));
}
}

return merge_things(result);
}
function defaultSum(thing) {
return function() {
var counts = {};


+ 55
- 2
stroll.html ファイルの表示

@@ -35,6 +35,10 @@
<div class="stat-line-hidden" id="milkPercent"></div>
<div class="stat-line-hidden" id="gas"></div>
<div class="stat-line-hidden" id="gasPercent"></div>
<div class="stat-line-hidden" id="piss"></div>
<div class="stat-line-hidden" id="pissPercent"></div>
<div class="stat-line-hidden" id="scat"></div>
<div class="stat-line-hidden" id="scatPercent"></div>
</div>
<div class="stat-header-self">Growth</div>
<table id="grow-panel">
@@ -84,7 +88,7 @@
</div>
<div id="log-area">
<div id="log">
<div>Welcome to Stroll 0.5.19</div>
<div>Welcome to Stroll 0.5.20</div>
<div><b>This game features 18+ content</b></div>
<div><a href="https://chemicalcrux.org/stroll">Changelog</a></div>
<div><a href="https://t.me/joinchat/BSXHzUZmSqc-CXB1khkuYw">Telegram discussion group</a></div>
@@ -101,6 +105,7 @@
<button class="action-part-button" id="action-part-tails">Tails</button>
<button class="action-part-button" id="action-part-souls">Souls</button>
<button class="action-part-button" id="action-part-shoes">Shoes</button>
<button class="action-part-button" id="action-part-waste">Waste</button>
<button class="action-part-button" id="action-part-misc">Misc</button>
</div>

@@ -160,6 +165,12 @@
<button class="action-button" id="button-action-dump_socks">Dump Socks</button>
</div>

<div class="action-tab" id="actions-waste">
<button class="action-button" id="button-action-piss">Piss</button>
<button class="action-button" id="button-action-bladder_vore">Bladder Vore</button>
<button class="action-button" id="button-action-scat">Scat</button>
</div>

<div class="action-tab" id="actions-misc">
<button class="action-button" id="button-action-pouch_stuff">Stuff Pouch</button>
<button class="action-button" id="button-action-pouch_rub">Rub Pouch</button>
@@ -169,7 +180,7 @@
</div>
</div>
<div class="character-build">
<p>Welcome to Stroll 0.5.19</p>
<p>Welcome to Stroll 0.5.20</p>
<p><b>This game features 18+ content</b></p>
<p><a href="https://chemicalcrux.org/stroll">Changelog</a></p>
<p><a href="https://t.me/joinchat/BSXHzUZmSqc-CXB1khkuYw">Telegram discussion group</a></p>
@@ -642,6 +653,48 @@
</li>
</div>
</div>

<div class="custom-category">
<input class="custom-header-checkbox" type="checkbox" id="pissEnabled" name="pissEnabled" />
<label class="custom-header" for="pissEnabled">Watersports</label>
<div class="reveal-if-active">
<li>
<label for="pissScale" >Piss production scale</label>
<input type="number" step="any" id="pissScale" name="pissScale" placeholder="1" />
</li>
<div class="custom-category-sub">
<ul class="flex-outer-sub">
<input class="custom-header-checkbox" type="checkbox" id="bladderVore" name="bladderVore" />
<label class="custom-header" for="bladderVore">Bladder Vore</label>
<div class="reveal-if-active">
<li>
<label for="baseUrethraDiameter">Urethra diameter</label>
<input type="number" step="any" id="baseUrethraDiameter" name="baseUrethraDiameter" placeholder="0.03" />
</li>
<li>
<label for="urethraStretchiness">Urethra stretchiness</label>
<input type="number" step="any" id="urethraStretchiness" name="urethraStretchiness" placeholder="5" />
</li>
</div>
</ul>
</div>
</div>
</div>

<div class="custom-category">
<input class="custom-header-checkbox" type="checkbox" id="scatEnabled" name="scatEnabled" />
<label class="custom-header" for="scatEnabled">Scat</label>
<div class="reveal-if-active">
<li>
<div>note - setting tailhole diameter requires anal vore to be enabled</div>
</li>
</div>
</div>

<div class="custom-category">
<input class="custom-header-checkbox" type="checkbox" id="gooEnabled" name="gooEnabled" />
<label class="custom-header" for="gooEnabled">Goo (not in yet)</label>
</div>
</ul>
</form>
</div>


読み込み中…
キャンセル
保存