diff --git a/src/js/utilJS.tw b/src/js/utilJS.tw index 18549d4aa775c47dcff17da733c7cbd37892327b..7fe7ed1251cc23abcdb232709428abe66539193d 100644 --- a/src/js/utilJS.tw +++ b/src/js/utilJS.tw @@ -144,13 +144,6 @@ window.Height = (function(){ return table[nationality + "." + race] || table[nationality] || table["." + race] || table[""] || def; }; - // Helper method - generate two independent Gaussian numbers using Box-Muller transform - const gaussianPair = function() { - let r = Math.sqrt(-2.0 * Math.log(1 - Math.random())); - let sigma = 2.0 * Math.PI * (1 - Math.random()); - return [r * Math.cos(sigma), r * Math.sin(sigma)]; - }; - // Helper method: Generate a skewed normal random variable with the skew s // Reference: http://azzalini.stat.unipd.it/SN/faq-r.html const skewedGaussian = function(s) { @@ -290,6 +283,96 @@ window.Height = (function(){ }; })(); +window.Intelligence = (function(){ + 'use strict'; + + // Global configuration (for different game modes/options/types) + var mean = 0; + var minMult = -3.0; + var maxMult = 3.0; + var skew = 0.0; + var spread = 45; + var minIntelligence = -101; + var maxIntelligence = 100; + + // Configuration method for the above values + const _config = function(conf) { + if(_.isUndefined(conf)) { + return {mean: mean, limitMult: [minMult, maxMult], limitIntelligence: [minIntelligence, maxIntelligence], skew: skew, spread: spread}; + } + if(_.isFinite(conf.mean)) { mean = Math.clamp(conf.mean, -100, 100); } + if(_.isFinite(conf.skew)) { skew = Math.clamp(conf.skew, -1000, 1000); } + if(_.isFinite(conf.spread)) { spread = Math.clamp(conf.spread, 0.1, 100); } + if(_.isArray(conf.limitMult) && conf.limitMult.length === 2 && conf.limitMult[0] !== conf.limitMult[1] && + _.isFinite(conf.limitMult[0]) && _.isFinite(conf.limitMult[1])) { + minMult = Math.min(conf.limitMult[0], conf.limitMult[1]); + maxMult = Math.max(conf.limitMult[0], conf.limitMult[1]); + } + if(_.isArray(conf.limitIntelligence) && conf.limitIntelligence.length === 2 && conf.limitIntelligence[0] !== conf.limitIntelligence[1] && + _.isFinite(conf.limitIntelligence[0]) && _.isFinite(conf.limitIntelligence[1])) { + minIntelligence = Math.min(conf.limitIntelligence[0], conf.limitIntelligence[1]); + maxIntelligence = Math.max(conf.limitIntelligence[0], conf.limitIntelligence[1]); + } + return {limitMult: [minMult, maxMult], limitIntelligence: [minIntelligence, maxIntelligence], skew: skew, spread: spread}; + }; + + // Helper method: Generate a skewed normal random variable with the skew s + // Reference: http://azzalini.stat.unipd.it/SN/faq-r.html + const skewedGaussian = function(s) { + let randoms = gaussianPair(); + if(s === 0) { + // Don't bother, return an unskewed normal distribution + return randoms[0]; + } + let delta = s / Math.sqrt(1 + s * s); + let result = delta * randoms[0] + Math.sqrt(1 - delta * delta) * randoms[1]; + return randoms[0] >= 0 ? result : -result; + }; + + // Height multiplier generator; skewed gaussian according to global parameters + const multGenerator = function() { + let result = skewedGaussian(skew); + while(result < minMult || result > maxMult) { + result = skewedGaussian(skew); + } + return result; + }; + + // Helper method: Generate an intelligence based on the mean one and limited according to config. + const intelligenceGenerator = function() { + let result = multGenerator() * spread + mean; + + while(result < minIntelligence || result > maxIntelligence) { + result = multGenerator() * spread + mean; + } + + return Math.ceil(result); + }; + + const _randomIntelligence = function(settings) { + if (settings) { + const currentConfig = _config(); + _config(settings); + const result = intelligenceGenerator(); + _config(currentConfig); + return result; + } + return intelligenceGenerator(); + }; + + return { + random: _randomIntelligence, + config: _config, + }; +})(); + +// Helper method - generate two independent Gaussian numbers using Box-Muller transform +window.gaussianPair = function() { + let r = Math.sqrt(-2.0 * Math.log(1 - Math.random())); + let sigma = 2.0 * Math.PI * (1 - Math.random()); + return [r * Math.cos(sigma), r * Math.sin(sigma)]; +}; + if(!Array.prototype.findIndex) { Array.prototype.findIndex = function(predicate) { if (this == null) { diff --git a/src/uncategorized/generateXXSlave.tw b/src/uncategorized/generateXXSlave.tw index d37a79497c00794e3943ac0a7773329d0acc25aa..8024fbb9225d3f971dc31c26bb4e92163101afc2 100644 --- a/src/uncategorized/generateXXSlave.tw +++ b/src/uncategorized/generateXXSlave.tw @@ -27,10 +27,11 @@ <<set $activeSlave.ID = $IDNumber++>> <<set $activeSlave.weekAcquired = $week>> -<<set $activeSlave.intelligence = random(-100,100)>> -<<if random(10,110) < $activeSlave.intelligence>> +<<set _gaussianPair = gaussianPair()>> +<<set $activeSlave.intelligence = Intelligence.random()>> +<<if _gaussianPair[0] < _gaussianPair[1] + $activeSlave.intelligence/29 - 0.35>> /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */ <<set $activeSlave.intelligenceImplant = 15>> - <<if random(50,150) < $activeSlave.intelligence>> + <<if random(15,150) < $activeSlave.intelligence>> <<set $activeSlave.intelligenceImplant = 30>> <</if>> <</if>> diff --git a/src/uncategorized/generateXYSlave.tw b/src/uncategorized/generateXYSlave.tw index c2399f4df28102ef729973152c03ba0ed12822e9..814b177681ccb45a5e129ed830bbe240aaf60e0e 100644 --- a/src/uncategorized/generateXYSlave.tw +++ b/src/uncategorized/generateXYSlave.tw @@ -26,10 +26,11 @@ <<set $activeSlave.ID = $IDNumber++>> <<set $activeSlave.weekAcquired = $week>> -<<set $activeSlave.intelligence = random(-100,100)>> -<<if random(10,110) < $activeSlave.intelligence>> +<<set _gaussianPair = gaussianPair()>> +<<set $activeSlave.intelligence = Intelligence.random()>> +<<if _gaussianPair[0] < _gaussianPair[1] + $activeSlave.intelligence/29 - 0.35>> /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */ <<set $activeSlave.intelligenceImplant = 15>> - <<if random(50,150) < $activeSlave.intelligence>> + <<if random(15,150) < $activeSlave.intelligence>> <<set $activeSlave.intelligenceImplant = 30>> <</if>> <</if>> diff --git a/src/uncategorized/lawCompliance.tw b/src/uncategorized/lawCompliance.tw index 92d39f7091c3408b3956fd014d5c66e1ee1cce5e..d0a0acbb6659130729177be7f6a638557989eec0 100644 --- a/src/uncategorized/lawCompliance.tw +++ b/src/uncategorized/lawCompliance.tw @@ -410,7 +410,7 @@ <<if $BasicIntelligenceSMR == 1>> <<if $activeSlave.intelligence <= -15>> - <<set $activeSlave.intelligence = random(0,40)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,40]})>> <</if>> While she was in the slave pens, she saw that less intelligent slaves were immediately designated as menials and fuckdolls, and she is @@.gold;terrified@@ that if she makes a mistake, she'll be thought stupid and be reassigned on the spot. <<set $activeSlave.trust -= 5>> @@ -418,7 +418,7 @@ <<if $QualityIntelligenceSMR == 1>> <<if $activeSlave.intelligence <= 15>> - <<set $activeSlave.intelligence = random(16,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [16,100]})>> <</if>> While she was in the slave pens, she saw that less intelligent slaves were immediately designated as menials and fuckdolls, and she is @@.gold;terrified@@ that if she makes a mistake, she'll be thought stupid and be reassigned on the spot. <<set $activeSlave.trust -= 5>> diff --git a/src/uncategorized/seRecruiterSuccess.tw b/src/uncategorized/seRecruiterSuccess.tw index d9fa1a9824ddcdc68c00b2bdd86485a522bd61cd..f74bac5fed5bd4d5f01df97bc3ea19c3464c87ee 100644 --- a/src/uncategorized/seRecruiterSuccess.tw +++ b/src/uncategorized/seRecruiterSuccess.tw @@ -19,7 +19,7 @@ <<set $activeSlave.analSkill = 0>> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> @@ -51,7 +51,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced a starving yo <<set $activeSlave.analSkill = 0>> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> @@ -78,7 +78,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced a recent divo <</if>> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> @@ -122,7 +122,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an old world <<set $activeSlave.sexualFlaw = "hates women">> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> @@ -156,7 +156,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an old world <<set $activeSlave.weight = random(0,50)>> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> @@ -203,7 +203,7 @@ Your recruiter $Recruiter.slaveName has succeeded; she's convinced an unhealthy <<set $activeSlave.clitPiercing = random(0,1)>> <<if $recruiterEugenics == 1>> <<if $IntelligenceEugenicsSMR == 1>> - <<set $activeSlave.intelligence = random(40,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [40,100]})>> <</if>> <<if $HeightEugenicsSMR == 1>> <<set $activeSlave.height = random(185,190)>> diff --git a/src/utility/slaveCreationWidgets.tw b/src/utility/slaveCreationWidgets.tw index 53c550bf7a4d459b92847fb5991bc61e73dd94c7..cc350a230fe3241a721b4aba8d1e5b6037869b79 100644 --- a/src/utility/slaveCreationWidgets.tw +++ b/src/utility/slaveCreationWidgets.tw @@ -1905,10 +1905,10 @@ <</if>> <<if $entrapmentUpgradeIntelligence == "intelligent">> Intelligent slaves have a high priority for training. - <<set $activeSlave.intelligence = random(30,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [30,100]})>> <<elseif $entrapmentUpgradeIntelligence == "stupid">> Stupid slaves have a high priority for training. - <<set $activeSlave.intelligence = random(-100,-30)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100,-30]})>> <<else>> Slaves' intelligence is not given special consideration. <</if>> @@ -2687,7 +2687,7 @@ <<set $activeSlave.devotion = 0>> <<set $activeSlave.trust = 0>> <<set $activeSlave.career = "a slave">> - <<set $activeSlave.intelligence = random(-100,0)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100,0]})>> <<set $activeSlave.intelligenceImplant = 0>> <<set $activeSlave.health = random(-99,0)>> <<set $activeSlave.weight = random(-100,0)>> @@ -2740,7 +2740,7 @@ <<set $activeSlave.devotion = 40>> <<set $activeSlave.trust = -100>> <<set $activeSlave.career = either("a politician", "a college scout", "a business owner", "a house DJ", "a soldier", "a prison guard", "a doctor", "a counselor", "a dairy worker", "a secretary", "a teacher")>> - <<set $activeSlave.intelligence = either(20,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [20,100]})>> <<set $activeSlave.intelligenceImplant = 30>> <<set $activeSlave.health = random(-99,-50)>> <<set $activeSlave.weight = random(-100,-50)>> @@ -2820,7 +2820,7 @@ <<set $activeSlave.origin = "You bought her from the kidnappers' slave market, so she was probably forced into slavery.">> <<set $activeSlave.devotion -= 5>> <<set $activeSlave.trust = random(-45,-25)>> - <<set $activeSlave.intelligence = either(-90,45)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-90,45]})>> <<set $activeSlave.health = random(-80,20)>> <<if $activeSlave.vagina > 1 && isFertile($activeSlave)>> <<set $activeSlave.preg = either(-2, -1, -1, -1, -1, -1, -1, -1, 1, 20, 40)>> @@ -2855,7 +2855,7 @@ <<set $activeSlave.origin = "You bought her from the runaway hunters' slave market after they recaptured her and her original owner did not pay their fee.">> <<set $activeSlave.devotion = -20>> <<set $activeSlave.trust = random(-15,15)>> - <<set $activeSlave.intelligence = random(0,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,100]})>> <<set $activeSlave.intelligenceImplant = 15>> <<if $activeSlave.physicalAge >= 12>> <<set $activeSlave.teeth = "normal">> @@ -3025,7 +3025,7 @@ <<if $activeSlave.physicalAge >= 12>> <<set $activeSlave.teeth = "normal">> <</if>> - <<set $activeSlave.intelligence = random(-20,70)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20,70]})>> <<set $activeSlave.devotion = random(25,45)>> <<set $activeSlave.trust = random(25,45)>> <<set $activeSlave.health = random(50,60)>> @@ -3120,7 +3120,7 @@ <<else>> <<set $activeSlave.intelligenceImplant = 15>> <<set $activeSlave.teeth = "normal">> - <<set $activeSlave.intelligence = random(-30,60)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-30,60]})>> <<set $activeSlave.devotion = random(25,45)>> <<set $activeSlave.trust = random(25,45)>> <</if>> @@ -3248,7 +3248,7 @@ <<set $activeSlave.career = "a slave">> <<set $activeSlave.intelligenceImplant = 30>> <<set $activeSlave.teeth = "normal">> - <<set $activeSlave.intelligence = random(-20,60)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20,60]})>> <<set $activeSlave.chem = 20>> <<if $TGA.schoolUpgrade == 1>> <<set $activeSlave.devotion = 100>> @@ -3695,7 +3695,7 @@ <<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [2, 15], spread: .1}),_minHeight, 274))>> <<set $activeSlave.muscles = random(40,80)>> <<else>> - <<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [3, 9]}),_minHeight, 274))>> + <<set $activeSlave.height = Math.trunc(Math.clamp(Height.random($activeSlave, {limitMult: [1, 4]}),_minHeight, 274))>> <<set $activeSlave.muscles = random(20,40)>> <</if>> <<if $HA.schoolUpgrade == 3>> @@ -3707,7 +3707,7 @@ <</if>> <<set $activeSlave.shoulders = 0>> <<if $HA.schoolUpgrade == 1>> - <<set $activeSlave.intelligence = random(20,70)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [20,70]})>> <<set $activeSlave.vaginalSkill = either(20,20,40)>> <<set $activeSlave.oralSkill = either(20,20,40)>> <<set $activeSlave.analSkill = either(20,20,40)>> @@ -4424,7 +4424,7 @@ <<set $activeSlave.trust = random(0,60)>> <<set $activeSlave.hStyle = "buzzcut">> <<set $activeSlave.hLength = 0>> - <<set $activeSlave.intelligence = random(0,100)>> + <<set $activeSlave.intelligence = Intelligence.random({limitIntelligence: [0,100]})>> <<set $activeSlave.health = random(0,60)>> <<case "rape">> <<set $activeSlave.origin = "You purchased her life at a prison sale. She was locked away for rape.">>