diff --git a/devNotes/twine JS b/devNotes/twine JS index 9b4057bbacc22ebf6b403a0c65db2d22ebdc6681..2fe85b60c75f229a619aee7b028291972d8b4b4e 100644 --- a/devNotes/twine JS +++ b/devNotes/twine JS @@ -3389,6 +3389,21 @@ Macro.add('foreach', { * paired with a high spread value results in the generator having to * do lots of work generating and re-generating random heights until * one "fits". + * + * Anon's explination: + *limitMult: [0, -30] + * + *This specifies a range going up from 0 to -30. It needs to go [-30, 0] instead. Same thing with [0, -5] two lines down. note: technically, this isn't true, because for some bizarre reason Height.random reverses the numbers for you if you get them wrong. But it's important to establish good habits, so. + * + *Skew, spread, limitMult: These are statistics things. BTW, a gaussian distribution is a normal distribution. Just a naming thing. + * + *Skew: See https://brownmath.com/stat/shape.htm#Skewness. Basically a measure of how asymmetrical the curve is. It doesn't change the mean, and can't move the main mass of the distribution far from the mean! The normal distribution can't do that. You can, however, use it to fatten one or the other tail. + * + *Spread: Changes the average distance from the mean, making the graph wider and shorter. Moves "mass" from the center to the tail. It's basically standard deviation, but named funny because FC codebase. + * + *limitMult: A clamp, expressed in z-score. (z=1 is one standard dev above mean, for ex.) If it excludes too much of the distribution the other parameters describe, you're going to spend lots of CPU making and throwing away heights. Don't worry about this unless you run into it. + * + *There's also limitHeight which you're not using. It's basically limitMult in different units. */ window.Height = (function(){ 'use strict'; @@ -3737,6 +3752,26 @@ window.numberWithCommas = function(x) { return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } + +window.jsRandom = function(min,max) { + return Math.floor(Math.random()*(max-min+1)+min); +} + +window.jsRandomMany = function (arr, count) { + var result = []; + var _tmp = arr.slice(); + for (var i = 0; i < count; i++) { + var index = Math.ceil(Math.random() * 10) % _tmp.length; + result.push(_tmp.splice(index, 1)[0]); + } + return result; +} + +window.jsEither = function(choices) { + var index = Math.floor(Math.random() * choices.length); + return choices[index]; +} + /* Make everything waiting for this execute. Usage: @@ -3940,9 +3975,427 @@ function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot c }).call(window,window) /*:: FamilyTreeJS [script]*/ +'use strict'; var lastActiveSlave, lastSlaves, lastPC; +var d3scr = document.createElement('script'); +d3scr.setAttribute('type', 'text/javascript'); +d3scr.setAttribute('src', 'https://d3js.org/d3.v4.min.js'); +document.getElementsByTagName('head')[0].appendChild(d3scr); + +window.renderFamilyTree = function(slaves, filterID) { + + var ftreeWidth,ftreeHeight; + var chartWidth, chartHeight; + var margin; + var svg = d3.select('#familyTree').append('svg'); + var chartLayer = svg.append('g').classed('chartLayer', true); + + var range = 100; + var data = buildFamilyTree(slaves, filterID); + + initFtreeSVG(data); + runFtreeSim(data); + + function initFtreeSVG(data) { + ftreeWidth = data.nodes.length * 45; + ftreeHeight = data.nodes.length * 35; + if(ftreeWidth < 600) { + ftreeWidth = 600; + } + if(ftreeHeight < 480) { + ftreeHeight = 480; + } + + margin = {top:0, left:0, bottom:0, right:0 } + + + chartWidth = ftreeWidth - (margin.left+margin.right) + chartHeight = ftreeHeight - (margin.top+margin.bottom) + + svg.attr('width', ftreeWidth).attr('height', ftreeHeight) + + var defs = svg.append('defs'); + + svg.append('defs').append('marker') + .attr('id','arrowhead') + .attr('viewBox','-0 -5 10 10') + .attr('refX',13) + .attr('refY',0) + .attr('orient','auto') + .attr('markerWidth',13) + .attr('markerHeight',13) + .attr('xoverflow','visible') + .append('svg:path') + .attr('d', 'M 0,-1 L 5,0 L 0,1') + .attr('fill', '#a1a1a1') + .style('stroke','none'); + + chartLayer + .attr('width', chartWidth) + .attr('height', chartHeight) + .attr('transform', 'translate('+[margin.left, margin.top]+')') + } + + function runFtreeSim(data) { + var simulation = d3.forceSimulation() + .force('link', d3.forceLink().id(function(d) { return d.index })) + .force('collide',d3.forceCollide( function(d){ return 60; }).iterations(4) ) + .force('charge', d3.forceManyBody().strength(-200).distanceMin(100).distanceMax(1000)) + .force('center', d3.forceCenter(chartWidth / 2, chartHeight / 2)) + .force('y', d3.forceY(100)) + .force('x', d3.forceX(200)) + + var link = svg.append('g') + .attr('class', 'link') + .selectAll('link') + .data(data.links) + .enter() + .append('line') + .attr('marker-end','url(#arrowhead)') + .attr('stroke', function(d) { + if(d.type == 'homologous') { + return '#862d59'; + } else if(d.type == 'paternal') { + return '#24478f'; + } else { + return '#aa909b'; + } + }) + .attr('stroke-width', 2) + .attr('fill', 'none'); + + var node = svg.selectAll('.node') + .data(data.nodes) + .enter().append('g') + .attr('class', 'node') + .call(d3.drag() + .on('start', dragstarted) + .on('drag', dragged) + .on('end', dragended)); + + node.append('circle') + .attr('r', function(d){ return d.r }) + .attr('stroke', '#5a5a5a') + .attr('class', 'node-circle') + .attr('r', 20); + + node.append('text') + .text(function(d) { + var ssym; + if(d.ID == -1) { + ssym = ''; + } else if(d.dick > 0 && d.vagina > -1) { + ssym = '☿' + } else if (d.dick > 0) { + ssym = '♂'; + } else if (d.vagina > -1) { + ssym = '♀'; + } else { + ssym = '?'; + } + return d.name + '('+ssym+')'; + }) + .attr('dy', 4) + .attr('dx', function(d) { return -(8*d.name.length)/2; }) + .attr('class', 'node-text') + .style('fill', function(d) { + if(d.is_mother && d.is_father) { + return '#b84dff'; + } else if(d.is_father) { + return '#00ffff'; + } else if(d.is_mother) { + return '#ff3399'; + } else if(d.unborn) { + return '#a3a3c2'; + } else { + return '#66cc66'; + } + }); + + var circles = svg.selectAll('.node-circle'); + var texts = svg.selectAll('.node-text'); + + var ticked = function() { + link + .attr('x1', function(d) { return d.source.x; }) + .attr('y1', function(d) { return d.source.y; }) + .attr('x2', function(d) { return d.target.x; }) + .attr('y2', function(d) { return d.target.y; }); + + node + .attr("transform", function (d) {return "translate(" + d.x + ", " + d.y + ")";}); + } + + simulation.nodes(data.nodes) + .on('tick', ticked); + + simulation.force('link') + .links(data.links); + + function dragstarted(d) { + if (!d3.event.active) simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + } + + function dragged(d) { + d.fx = d3.event.x; + d.fy = d3.event.y; + } + + function dragended(d) { + if (!d3.event.active) simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + } + + } +}; + +window.buildFamilyTree = function(slaves = SugarCube.State.variables.slaves, filterID) { + var family_graph = { + nodes: [], + links: [] + }; + var node_lookup = {}; + var preset_lookup = { + '-2': 'Social elite', + '-3': 'Client', + '-4': 'Former master', + '-5': 'An arcology owner', + '-6': 'A citizen' + }; + var outdads = {}; + var outmoms = {}; + var kids = {}; + + var fake_pc = { + slaveName: SugarCube.State.variables.PC.name + '(You)', + mother: SugarCube.State.variables.PC.mother, + father: SugarCube.State.variables.PC.father, + dick: SugarCube.State.variables.PC.dick, + vagina: SugarCube.State.variables.PC.vagina, + ID: SugarCube.State.variables.PC.ID + }; + var charList = [fake_pc]; + charList.push.apply(charList, slaves); + charList.push.apply(charList, SugarCube.State.variables.tanks); + + var unborn = {}; + for(var i = 0; i < SugarCube.State.variables.tanks.length; i++) { + unborn[SugarCube.State.variables.tanks[i].ID] = true; + } + + for(var i = 0; i < charList.length; i++) { + var mom = charList[i].mother; + var dad = charList[i].father; + + if(mom) { + if(!kids[mom]) { + kids[mom] = {}; + } + kids[mom].mother = true; + } + if(dad) { + if(!kids[dad]) { + kids[dad] = {}; + } + kids[dad].father = true; + } + } + + for(var i = 0; i < charList.length; i++) { + var character = charList[i]; + if(character.mother == 0 && character.father == 0 && !kids[character.ID]) { + continue; + } + var mom = character.mother; + if(mom < -6) { + if(typeof outmoms[mom] == 'undefined') { + outmoms[mom] = []; + } + outmoms[mom].push(character.slaveName); + } else if(mom < 0 && typeof node_lookup[mom] == 'undefined' && typeof preset_lookup[mom] != 'undefined') { + node_lookup[mom] = family_graph.nodes.length; + charList.push({ID: mom, mother: 0, father: 0, is_father: true, dick: 0, vagina: 1, slaveName: preset_lookup[mom]}); + } + + var dad = character.father; + if(dad < -6) { + if(typeof outdads[dad] == 'undefined') { + outdads[dad] = []; + } + outdads[dad].push(character.slaveName); + } else if(dad < 0 && typeof node_lookup[dad] == 'undefined' && typeof preset_lookup[dad] != 'undefined') { + node_lookup[dad] = family_graph.nodes.length; + charList.push({ID: dad, mother: 0, father: 0, is_father: true, dick: 1, vagina: -1, slaveName: preset_lookup[dad]}); + } + } + var mkeys = Object.keys(outmoms); + for(var i = 0; i < mkeys.length; i++) { + var name; + var key = mkeys[i]; + var names = outmoms[key]; + if(names.length == 1) { + name = names[0]; + } else if(names.length == 2) { + name = names.join(' and '); + } else { + names[-1] = 'and '+names[-1]; + name = names.join(', '); + } + node_lookup[key] = family_graph.nodes.length; + //Outside extant slaves set + charList.push({ID: key, mother: 0, father: 0, is_mother: true, dick: 0, vagina: 1, slaveName: name+"'s mother"}); + } + + var dkeys = Object.keys(outdads); + for(var i = 0; i < dkeys.length; i++) { + var name; + var key = dkeys[i]; + var names = outdads[key]; + if(names.length == 1) { + name = names[0]; + } else if(names.length == 2) { + name = names.join(' and '); + } else { + names[-1] = 'and '+names[-1]; + name = names.join(', '); + } + node_lookup[key] = family_graph.nodes.length; + //Outside extant slaves set + charList.push({ID: key, mother: 0, father: 0, is_father: true, dick: 1, vagina: -1, slaveName: name+"'s father"}); + } + + var charHash = {}; + for(var i = 0; i < charList.length; i++) { + charHash[charList[i].ID] = charList[i]; + } + + var related = {}; + var seen = {}; + var saveTree = {}; + function relatedTo(character, targetID, relIDs = {tree: {}, related: false}) { + relIDs.tree[character.ID] = true; + if(related[character.ID]) { + relIDs.related = true; + return relIDs; + } + if(character.ID == targetID) { + relIDs.related = true; + } + if(seen[character.ID]) { + return relIDs; + } + seen[character.ID] = true; + if(character.mother != 0) { + if(charHash[character.mother]) { + relatedTo(charHash[character.mother], targetID, relIDs); + } + } + if(character.father != 0) { + if(charHash[character.father]) { + relatedTo(charHash[character.father], targetID, relIDs); + } + } + return relIDs; + } + if(filterID) { + if(charHash[filterID]) { + var relIDs = relatedTo(charHash[filterID], filterID); + for(var k in relIDs.tree) { + related[k] = true; + } + for(var i = 0; i < charList.length; i++) { + if(charHash[charList[i].ID]) { + var pRelIDs = relatedTo(charHash[charList[i].ID], filterID); + if(pRelIDs.related) { + for(var k in pRelIDs.tree) { + related[k] = true; + if(saveTree[k]) { + for(var k2 in saveTree[k].tree) { + related[k2] = true; + } + } + } + } + saveTree[charList[i].ID] = pRelIDs; + } + } + } + } + + for(var i = 0; i < charList.length; i++) { + var character = charList[i]; + var char_id = character.ID; + if(character.mother == 0 && character.father == 0 && !kids[char_id]) { + continue; + } + if(filterID && !related[char_id]) { + continue; + } + node_lookup[char_id] = family_graph.nodes.length; + var char_obj = { + id: char_id, + name: character.slaveName, + dick: character.dick, + unborn: !!unborn[char_id], + vagina: character.vagina + }; + if(kids[char_id]) { + char_obj.is_mother = !!kids[char_id].mother; + char_obj.is_father = !!kids[char_id].father; + } else { + char_obj.is_mother = false; + char_obj.is_father = false; + } + family_graph.nodes.push(char_obj); + } + + for(var i = 0; i < charList.length; i++) { + var character = charList[i]; + var char_id = character.ID; + if(character.mother == 0 && character.father == 0 && !kids[char_id]) { + continue; + } + if(filterID && !related[char_id]) { + if(related[character.mother]) { + console.log('wtf, mom'); + } + if(related[character.father]) { + console.log('wtf, dad'); + } + continue; + } + if(typeof node_lookup[character.mother] != 'undefined') { + var ltype; + if(character.mother == character.father) { + ltype = 'homologous'; + } else { + ltype = 'maternal'; + } + family_graph.links.push({ + type: ltype, + target: node_lookup[char_id]*1, + source: node_lookup[character.mother]*1 + }); + } + if(character.mother == character.father) { + continue; + } + if(typeof node_lookup[character.father] != 'undefined') { + family_graph.links.push({ + type: 'paternal', + target: node_lookup[char_id]*1, + source: node_lookup[character.father]*1 + }); + } + } + return family_graph; +}; + window.updateFamilyTree = function(activeSlave = lastActiveSlave, slaves = lastSlaves, PC = lastPC) { lastActiveSlave = activeSlave; lastSlaves = slaves; @@ -3955,6 +4408,11 @@ window.updateFamilyTree = function(activeSlave = lastActiveSlave, slaves = lastS return; graphElement.innerHTML = ""; + /* The way this code works is that we start with the activeSlave then we call + slaveInfo() recursively to work our way up the tree finding their parents. + + */ + function getSlave(id, expectedGenes) { if(id == -1) { return {"slaveName":"YOU", "ID":id, "physicalAge":PC.physicalAge, "genes":PC.genes, father:PC.father, mother:PC.mother}; diff --git a/player variables documentation - Pregmod.txt b/player variables documentation - Pregmod.txt index e744dc815ceb404e8e8fbf6f17a1f9337de2f3a6..9f754af8c7484631336e6535dabd1426f5c56453 100644 --- a/player variables documentation - Pregmod.txt +++ b/player variables documentation - Pregmod.txt @@ -445,6 +445,12 @@ have you been drugged with fertility drugs 0 - no 1+ - how many weeks they will remain in your system +staminaPills: + +Are you taking pills to fuck more slaves each week? +0 - no +1 - yes + ovaryAge: How old your ovaries are diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index 98c03f4a12681dff9f23c7e859904d9ba9a1db9b..a9858f4337c624d2e36ccbd8f1e7040a740328f8 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -2587,7 +2587,7 @@ __I do not give credit without explicit permission to do so.__ If you have contr <br>''anonNeo'' for spellchecking. <br>''Utopia'' for dirty dealings gang leader focus and updates to it. <br>''hexall90'' for height growth drugs, incubator organ farm support and detailing, the dispensary cleanup, the joint Eugenics bad end rework, the Hippolyta Academy, and the Security Expansion Mod. -<br>''sensei'' for coding in support for commas. +<br>''sensei'' for coding in support for commas and an excellent family tree rework. <br>''laziestman'' for sexy spats. <br>''SFanon (blank)'' for SF related work, passive player skill gain and the joint Eugenics bad end rework. <br>''anon'' for extending FCGudder's economy reports to the other facilities. diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index 899b767ea79596c7a5a63b72ddaad75bf7a96793..33f26125b83729704192ec27582c9a29bfdccbb4 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -238,7 +238,7 @@ You should have received a copy of the GNU General Public License along with thi <<if $saveImported == 0>> <<set $cheater = 0>> -<<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, dick: 1, vagina: 0, preg: 0, pregType: 0, pregKnown: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, career: "capitalist", rumor: "wealth", indenture: -1, indentureRestrictions: 0, birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 3, face: 100, actualAge: 35, physicalAge: 35, visualAge: 35, birthWeek: 0, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, fertDrugs: 0, forcedFertDrugs: 0, ovaryAge: 35}>> +<<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, dick: 1, vagina: 0, preg: 0, pregType: 0, pregKnown: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, career: "capitalist", rumor: "wealth", indenture: -1, indentureRestrictions: 0, birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 3, face: 100, actualAge: 35, physicalAge: 35, visualAge: 35, birthWeek: 0, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, fertDrugs: 0, forcedFertDrugs: 0, staminaPills: 0, ovaryAge: 35}>> <<set $cash = 10000>> <<set $normalizedEvents = 0>> <<set $autosave = 1>> @@ -353,7 +353,7 @@ You should have received a copy of the GNU General Public License along with thi <<else>> <<set $cheater = 0>> <<set $cash = 10000>> - <<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, dick: 1, vagina: 0, preg: 0, pregType: 0, pregKnown: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, career: "capitalist", rumor: "wealth", indenture: -1, indentureRestrictions: 0, birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 3, face: 100, actualAge: 35, physicalAge: 35, visualAge: 35, birthWeek: 0, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, fertDrugs: 0, forcedFertDrugs: 0, ovaryAge: 35}>> + <<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, dick: 1, vagina: 0, preg: 0, pregType: 0, pregKnown: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, career: "capitalist", rumor: "wealth", indenture: -1, indentureRestrictions: 0, birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 3, face: 100, actualAge: 35, physicalAge: 35, visualAge: 35, birthWeek: 0, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, fertDrugs: 0, forcedFertDrugs: 0, staminaPills: 0, ovaryAge: 35}>> <</if>> <</if>> diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index 7aa51831d0f3e6686efdb12fb2abc0ecf08cb830..f84ed53cbf709749c153c09be0ab1d3c64d463b1 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -229,6 +229,9 @@ <<if ndef $PC.ovaryAge>> <<set $PC.ovaryAge = $PC.physicalAge>> <</if>> +<<if ndef $PC.staminaPills>> + <<set $PC.staminaPills = 0>> +<</if>> <<if ndef $universalRulesImmobileSlavesMaintainMuscles>> <<set $universalRulesImmobileSlavesMaintainMuscles = 0>> diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw index 60e8b35d7c759daf23b20174626248f2a5e35954..9ee8007a2a899811ceda763ddd99301b966991de 100644 --- a/src/uncategorized/saRules.tw +++ b/src/uncategorized/saRules.tw @@ -4260,6 +4260,10 @@ <<set $slaves[$i].trust -= _punishments>> <</switch>> <</if>> + <<if $subSlaves > 0 && ($slaves[$i].releaseRules == "permissive" || $slaves[$i].releaseRules == "sapphic") && $slaves[$i].assignment != "serve your other slaves">> + <<set $slaves[$i].need -= (20*$subSlave)>> /* make those serve your other slaves do some work for once */ + <</if>> <</switch>> <</if>> /*Closes mindbreak exemption*/ + <</if>> /*Closes fuckdoll exemption*/ \ No newline at end of file diff --git a/src/uncategorized/saServeYourOtherSlaves.tw b/src/uncategorized/saServeYourOtherSlaves.tw index b02f45edec724e64079676b10adff17305d4631c..e5302bb231e2664fefeb528186afe4c1c4dcaa03 100644 --- a/src/uncategorized/saServeYourOtherSlaves.tw +++ b/src/uncategorized/saServeYourOtherSlaves.tw @@ -50,7 +50,71 @@ <<if $slaves[$i].amp != 1 && !canWalk($slaves[$i])>> Since she's forced to crawl around, she's especially vulnerable. <</if>> -<<set _fuckCount = (($dormitoryPopulation+$roomsPopulation)+random((($dormitoryPopulation+$roomsPopulation)*1),($dormitoryPopulation+$roomsPopulation)*7))>> +<<if $dormitoryPopulation+$roomsPopulation > 10+$subSlaves>> /*rework me to be percent based */ + <<if $subSlaves > 5>> + Since there are so many other slaves servicing your stock, she sees limited action. + <<elseif $subSlaves > 3>> + With her servicing sisters, her workload is reasonable and she isn't overworked. + <<elseif $subSlaves > 1>> + While she may have support in servicing your stock, she is overwhelmed by their collective need. + <<set $slaves[$i].tired = 1>> + <<if $slaves[$i].sexualFlaw == "self hating">> + With so many other slaves taking advantage of her body, her life's purpose of @@.hotpink;being nothing more than a piece of meat@@ has come true. + <<set $slaves[$i].deovtion += 5>> + <<elseif $slaves[$i].sexualFlaw == "attention whore">> + With little competition for her body and so many slaves eager to use her, her dreams of being the center of attention are @@.hotpink;have come true.@@ + <<if $slaves[$i].weight < 10 && $slaves[$i].belly < 100>> + <<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0 && canDoAnal($slaves[$i]) && $slaves[$i].anus > 0>> + She ends each day cradling her cum swollen stomach, marvelling at the "attention" bestowed upon her. + <<elseif (canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0) || (canDoAnal($slaves[$i]) && $slaves[$i].anus > 0)>> + By the end of the day, her stomach has a noticible bulge to it from all the "attention" bestowed upon her. + <</if>> + <</if>> + <<set $slaves[$i].deovtion += 5>> + <<elseif $slaves[$i].energy > 95>> + With so many other slaves using her body, her @@.hotpink;burning libido is finally sated.@@ + <<set $slaves[$i].deovtion += 2>> + <</if>> + <</if>> + <<else>> + Since she is the only slave servicing your stock, she is used to the @@.red;point of exhaustion.@@ + <<set $slaves[$i].tired = 1, $slaves[$i].health -= 10>> + <<if $averageDick > 5>> + <<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0 && $slaves[$i].vagina < 4>> + <<if ($slaves[$i].vagina*40)-($averageDick*5) < random(1,100)>> + So many huge dicks pistoning in and out of her pussy @@.lime;loosen her up.@@ + <<set $slaves[$i].vagina++>> + <<set $slaves[$i].vaginalCount += 3, $vaginalTotal += 3>> + <</if>> + <</if>> + <<if canDoAnal($slaves[$i]) && $slaves[$i].anus > 0 && $slaves[$i].anus < 4 + <<if ($slaves[$i].anus*40)-($averageDick*5) < random(1,100)>> + @@.lime;Her asshole is loosened@@ after being pounded by so many giant cocks. + <<set $slaves[$i].anus++>> + <<set $slaves[$i].analCount += 3, $analTotal += 3>> + <</if>> + <</if>> + <</if>> + <<if $slaves[$i].sexualFlaw == "self hating">> + With so many other slaves taking advantage of her body, her life's purpose of @@.hotpink;being nothing more than a piece of meat@@ has come true. + <<set $slaves[$i].deovtion += 5>> + <<elseif $slaves[$i].sexualFlaw == "attention whore">> + With little competition for her body and so many slaves eager to use her, her dreams of being the center of attention are @@.hotpink;have come true.@@ + <<if $slaves[$i].weight < 10 && $slaves[$i].belly < 100>> + <<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0 && canDoAnal($slaves[$i]) && $slaves[$i].anus > 0>> + She ends each day cradling her cum swollen stomach, marvelling at the "attention" bestowed upon her. + <<elseif (canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0) || (canDoAnal($slaves[$i]) && $slaves[$i].anus > 0)>> + By the end of the day, her stomach has a noticible bulge to it from all the "attention" bestowed upon her. + <</if>> + <</if>> + <<set $slaves[$i].deovtion += 5>> + <<elseif $slaves[$i].energy > 95>> + With so many other slaves using her body, her @@.hotpink;burning libido is finally sated.@@ + <<set $slaves[$i].deovtion += 2>> + <</if>> + <</if>> +<</if>> +<<set _fuckCount = Math.ciel((($dormitoryPopulation+$roomsPopulation)+random((($dormitoryPopulation+$roomsPopulation)*1),($dormitoryPopulation+$roomsPopulation)*7))/$subSlaves)>> <<SimpleSlaveFucking $slaves[$i] _fuckCount>> <<set $slaves[$i].need -= 2*_fuckCount>> @@ -79,26 +143,46 @@ is serving ''$slaves[_dom].slaveName'' this week. <</if>> <</if>> -<<if canPenetrate($slaves[$i]) && canDoAnal($slaves[_dom]) && ($slaves[_dom].anus != 0) && ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "buttslut")>> - <<if ($slaves[$i].devotion < -20)>> - Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself forced to use her stiff prick to please $slaves[_dom].slaveName's insatiable ass. She spends the week trying to avoid $slaves[_dom].slaveName, because $slaves[_dom].slaveName won't stop forcing her to get her _subRace dick hard so $slaves[_dom].slaveName can ride her _domRace butt up and down on it. @@.hotpink;$slaves[_dom].slaveName enjoys having her own personal cock for the week,@@ even if it does have to be persuaded. - <<elseif ($slaves[$i].devotion <= 50)>> - Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself constantly asked to use her stiff prick to please $slaves[_dom].slaveName's insatiable ass. She spends the week desperately trying to keep herself hard, because $slaves[_dom].slaveName constantly expects her _subRace dick to be hard so $slaves[_dom].slaveName can ride her _domRace butt up and down on it. @@.hotpink;$slaves[_dom].slaveName enjoys having her own personal cock for the week.@@ - <<else>> - $slaves[_dom].slaveName loves anal and $slaves[$i].slaveName has a stiff prick. The two of them have good fun together. - <<if $slaves[_dom].amp != 1>> - $slaves[_dom].slaveName pulls her anal girltoy into bathrooms and corners constantly +<<if ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "buttslut")>> + <<if canPenetrate($slaves[$i]) && canDoAnal($slaves[_dom]) && ($slaves[_dom].anus != 0)>> + <<if ($slaves[$i].devotion < -20)>> + Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself forced to use her stiff prick to please $slaves[_dom].slaveName's insatiable ass. She spends the week trying to avoid $slaves[_dom].slaveName, because $slaves[_dom].slaveName won't stop forcing her to get her _subRace dick hard so $slaves[_dom].slaveName can ride her _domRace butt up and down on it. @@.hotpink;$slaves[_dom].slaveName enjoys having her own personal cock for the week,@@ even if it does have to be persuaded. + <<elseif ($slaves[$i].devotion <= 50)>> + Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself constantly asked to use her stiff prick to please $slaves[_dom].slaveName's insatiable ass. She spends the week desperately trying to keep herself hard, because $slaves[_dom].slaveName constantly expects her _subRace dick to be hard so $slaves[_dom].slaveName can ride her _domRace butt up and down on it. @@.hotpink;$slaves[_dom].slaveName enjoys having her own personal cock for the week.@@ + <<else>> + $slaves[_dom].slaveName loves anal and $slaves[$i].slaveName has a stiff prick. The two of them have good fun together. + <<if $slaves[_dom].amp != 1>> + $slaves[_dom].slaveName pulls her anal girltoy into bathrooms and corners constantly + <<else>> + $slaves[_dom].slaveName has her anal girltoy hold her limbless torso + <</if>> + so she can ride that _subRace dick with her _domRace butt. @@.hotpink;$slaves[_dom].slaveName enjoys a week of constant butt loving.@@ + <</if>> + <<set _penetrativeUse = random(9,12)>> + <<set $slaves[_dom].analCount += _penetrativeUse, $analTotal += _penetrativeUse>> + <<if canImpreg($slaves[_dom], $slaves[$i])>> + <<KnockMeUp $slaves[_dom] 30 1 $slaves[$i].ID>> + <<if $slaves[_dom].pregKnown == 1>> + With so many potent deposits into her fertile rear, it comes as little surprise when @@.lime;she ends up pregnant with $slaves[$i].slaveName's child.@@ + <</if>> + <</if>> + <<elseif canDoAnal($slaves[_dom])>> + <<if ($slaves[$i].devotion < -20)>> + Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself forced to give analingus on command. She spends the week trying to avoid servicing $slaves[_dom].slaveName's insatiable _domRace ass with her _subRace mouth, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to service her butt.@@ + <<elseif ($slaves[$i].devotion <= 50)>> + Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself giving analingus on command. She spends the week servicing $slaves[_dom].slaveName's insatiable _domRace ass with her _subRace mouth. @@.hotpink;$slaves[_dom].slaveName enjoys having her ass pleasured whenever she wants it.@@ <<else>> - $slaves[_dom].slaveName has her anal girltoy hold her limbless torso + Since $slaves[_dom].slaveName loves anal play, $slaves[$i].slaveName lavishes attention on her butt. She spends the week servicing $slaves[_dom].slaveName's insatiable _domRace ass with her _subRace mouth. @@.hotpink;$slaves[_dom].slaveName enjoys having an enthusiastic anal playmate.@@ <</if>> - so she can ride that _subRace dick with her _domRace butt. @@.hotpink;$slaves[_dom].slaveName enjoys a week of constant butt loving.@@ - <</if>> - <<set _penetrativeUse = random(9,12)>> - <<set $slaves[_dom].analCount += _penetrativeUse, $analTotal += _penetrativeUse>> - <<if canImpreg($slaves[_dom], $slaves[$i])>> - <<KnockMeUp $slaves[_dom] 30 1 $slaves[$i].ID>> - <<if $slaves[_dom].pregKnown == 1>> - With so many potent deposits into her fertile rear, it comes as little surprise when @@.lime;she ends up pregnant with $slaves[$i].slaveName's child.@@ + <<set _oralUse = random(9,12)>> + <<set $slaves[_dom].analCount += _oralUse, $analTotal += _oralUse>> + <<else>> + <<if ($slaves[$i].devotion < -20)>> + Since $slaves[_dom].slaveName loves her rear, $slaves[$i].slaveName finds herself forced to <<if $slaves[$i].amp == 1>>massage<<else>>fondle<</if>> it on command. She spends the week trying to avoid servicing $slaves[_dom].slaveName's _domRace ass with her _subRace <<if $slaves[$i].amp>>face<<else>>hands<</if>>, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to service her butt.@@ + <<elseif ($slaves[$i].devotion <= 50)>> + Since $slaves[_dom].slaveName loves her rear, $slaves[$i].slaveName finds herself <<if $slaves[$i].amp == 1>>massaging<<else>>fondling<</if>> it on command. She spends the week servicing $slaves[_dom].slaveName's _domRace ass with her _subRace <<if $slaves[$i].amp>>face<<else>>hands<</if>>. @@.hotpink;$slaves[_dom].slaveName enjoys having her ass pleasured whenever she wants it.@@ + <<else>> + Since $slaves[_dom].slaveName loves her rear played with, $slaves[$i].slaveName lavishes attention on her butt. She spends the week fondling $slaves[_dom].slaveName's _domRace ass with her _subRace <<if $slaves[$i].amp>>face<<else>>hands<</if>>. @@.hotpink;$slaves[_dom].slaveName enjoys having a playmate so fond of her booty.@@ <</if>> <</if>> <<elseif ($slaves[$i].devotion > -20) && ($slaves[_dom].fetish == "submissive") && ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60)>> @@ -208,7 +292,7 @@ is serving ''$slaves[_dom].slaveName'' this week. <<elseif ($slaves[$i].devotion >= -20) && ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "dom") && canWalk($slaves[_dom])>> $slaves[_dom].slaveName loves to dominate, and the first indication $slaves[$i].slaveName gets of what she's in for this week is when $slaves[_dom].slaveName ambushes her in the dormitory, tackles her from behind, and <<if $slaves[$i].amp == 1>> - bursts out laughing at her inability to right herself without limbs. + bursts out <<if canTalk($slaves[_dom])>>laughing<<else>>in silent laughter<</if>> at her inability to right herself without limbs. <<else>> hogties her with sheets. <</if>> @@ -242,35 +326,23 @@ is serving ''$slaves[_dom].slaveName'' this week. <<elseif ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "boobs") <<if ($slaves[_dom].lactation > 0)>> <<if ($slaves[$i].devotion < -20)>> - Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName finds herself forced to nurse. She spends the week trying to avoid guzzling down milk from $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>nipples with her <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to drink from her.@@ + Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName finds herself forced to nurse. She spends the week trying to avoid guzzling down milk from $slaves[_dom].slaveName's <<print nippleColor($slaves[_dom])>> _domRace nipples with her _subRace mouth, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to drink from her.@@ <<elseif ($slaves[$i].devotion <= 50)>> - Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName finds herself constantly nursing. She spends the week obediently taking milk from $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>nipples with her <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth, to $slaves[_dom].slaveName's motherly satisfaction. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to drink from her whenever she feels overfull.@@ + Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName finds herself constantly nursing. She spends the week obediently taking milk from $slaves[_dom].slaveName's <<print nippleColor($slaves[_dom])>> _domRace nipples with her _subRace mouth, to $slaves[_dom].slaveName's motherly satisfaction. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to drink from her whenever she feels overfull.@@ <<else>> - Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName constantly nurses from her. She spends the week happily taking milk from $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>nipples with her hungry <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth, to $slaves[_dom].slaveName's motherly delight. @@.hotpink;$slaves[_dom].slaveName loves having $slaves[$i].slaveName to feed and fill.@@ + Since $slaves[_dom].slaveName loves giving milk, $slaves[$i].slaveName constantly nurses from her. She spends the week happily taking milk from $slaves[_dom].slaveName's <<print nippleColor($slaves[_dom])>> _domRace nipples with her hungry _subRace mouth, to $slaves[_dom].slaveName's motherly delight. @@.hotpink;$slaves[_dom].slaveName loves having $slaves[$i].slaveName to feed and fill.@@ <</if>> - <<set _oralUse = random(9,12)>> - <<set $slaves[_dom].mammaryCount += _oralUse, $mammaryTotal += _oralUse>> <<else>> <<if ($slaves[$i].devotion < -20)>> - Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName finds herself forced to knead, massage, and even suck. She spends the week trying to avoid servicing $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>breasts with her <<if $seeRace == 1>>$slaves[$i].race <</if>>hands, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to see to her tits.@@ + Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName finds herself forced to <<if $slaves[$i].amp == 1>>nuzzle and suck<<else>>knead, massage, and even suck<</if>>. She spends the week trying to avoid servicing $slaves[_dom].slaveName's _domRace breasts with her _subRace <<if $slaves[$i].amp == 1>>face<<else>>hands<</if>>, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to see to her tits.@@ <<elseif ($slaves[$i].devotion <= 50)>> - Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName finds herself kneading, massaging, and even sucking. She spends the week obediently servicing $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>breasts with her <<if $seeRace == 1>>$slaves[$i].race <</if>>hands, to $slaves[_dom].slaveName's languorous pleasure. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to see to her tits.@@ + Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName finds herself <<if $slaves[$i].amp == 1>>nuzzling and sucking<<else>>kneading, massaging, and even sucking<</if>>. She spends the week obediently servicing $slaves[_dom].slaveName's _domRace breasts with her _subRace <<if $slaves[$i].amp == 1>>face<<else>>hands<</if>>, to $slaves[_dom].slaveName's languorous pleasure. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to see to her tits.@@ <<else>> - Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName pampers her breasts shamelessly. She spends the week devotedly massaging $slaves[_dom].slaveName's <<if $seeRace == 1>>$slaves[_dom].race <</if>>breasts with her <<if $seeRace == 1>>$slaves[$i].race <</if>>hands, sucking lovingly at her nipples, and caring for everything with lotions and oils. They sleep together so that $slaves[$i].slaveName can hold her boobs as she goes to sleep, which sometimes results in less sleep for both as the $slaves[_dom].slaveName keeps them at breast play into the night. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to see to her tits.@@ + Since $slaves[_dom].slaveName loves having her breasts attended to, $slaves[$i].slaveName pampers her breasts shamelessly. She spends the week devotedly massaging $slaves[_dom].slaveName's _domRace breasts with her _subRace <<if $slaves[$i].amp == 1>>face<<else>>hands<</if>>, sucking lovingly at her nipples, and caring for everything with lotions and oils<<if $slaves[$i].amp == 1>> (as best she can without hands)<</if>>. They sleep together so that $slaves[$i].slaveName can <<if $slaves[$i].amp == 1>>snuggle into her bust<<else>>hold her boobs<</if>> as she goes to sleep, which sometimes results in less sleep for both as the $slaves[_dom].slaveName keeps them at breast play into the night. @@.hotpink;$slaves[_dom].slaveName enjoys having $slaves[$i].slaveName to see to her tits.@@ <</if>> - <<set _oralUse = random(9,12)>> - <<set $slaves[_dom].mammaryCount += _oralUse, $mammaryTotal += _oralUse>> - <</if>> -<<elseif canDoAnal($slaves[_dom]) && ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "buttslut")>> - <<if ($slaves[$i].devotion < -20)>> - Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself forced to give analingus on command. She spends the week trying to avoid servicing $slaves[_dom].slaveName's insatiable <<if $seeRace == 1>>$slaves[_dom].race <</if>>ass with her <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth, but $slaves[_dom].slaveName insists. @@.hotpink;$slaves[_dom].slaveName enjoys being able to force $slaves[$i].slaveName to service her butt.@@ - <<elseif ($slaves[$i].devotion <= 50)>> - Since $slaves[_dom].slaveName loves anal, $slaves[$i].slaveName finds herself giving analingus on command. She spends the week servicing $slaves[_dom].slaveName's insatiable <<if $seeRace == 1>>$slaves[_dom].race <</if>>ass with her <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth. @@.hotpink;$slaves[_dom].slaveName enjoys having her ass pleasured whenever she wants it.@@ - <<else>> - Since $slaves[_dom].slaveName loves anal play, $slaves[$i].slaveName lavishes attention on her butt. She spends the week servicing $slaves[_dom].slaveName's insatiable <<if $seeRace == 1>>$slaves[_dom].race <</if>>ass with her <<if $seeRace == 1>>$slaves[$i].race <</if>>mouth. @@.hotpink;$slaves[_dom].slaveName enjoys having an enthusiastic anal playmate.@@ <</if>> <<set _oralUse = random(9,12)>> - <<set $slaves[_dom].analCount += _oralUse, $analTotal += _oralUse>> + <<set $slaves[_dom].mammaryCount += _oralUse, $mammaryTotal += _oralUse>> <<elseif ($slaves[$i].dick > 0) && !canAchieveErection($slaves[$i]) && ($slaves[_dom].fetishKnown == 1) && ($slaves[_dom].fetishStrength > 60) && ($slaves[_dom].fetish == "cumslut")>> Since $slaves[_dom].slaveName loves cum, and $slaves[$i].slaveName has a dick, $slaves[_dom].slaveName has her own private semen dispenser, even if it's rather limp. $slaves[_dom].slaveName sometimes gets tired of having to work hard for cum, so she spends the week making $slaves[$i].slaveName painstakingly bring her flaccid dick almost to orgasm before $slaves[_dom].slaveName wraps her <<if $seeRace == 1>>$slaves[_dom].race <</if>>lips around $slaves[$i].slaveName's <<if $seeRace == 1>>$slaves[$i].race <</if>>soft dickhead to suck down the cum. @@.hotpink;$slaves[_dom].slaveName enjoys having a servile dick on demand.@@ <<set _penetrativeUse = random(9,12)>> @@ -345,6 +417,7 @@ is serving ''$slaves[_dom].slaveName'' this week. <<set $slaves[$i].mammaryCount += _mammaryUse, $mammaryTotal += _mammaryUse>> <<set $slaves[$i].penetrativeCount += _penetrativeUse, $mammaryTotal += _penetrativeUse>> <<set _cervixPump = _vaginalUse>> +<<set $slaves[$i].need -= ((_penetrativeUse+_vaginalUse+_analUse)*5)>> <<if $slaves[$i].need>> <<if $slaves[$i].fetishKnown>>