///
///
///
///
///
///
class HumanoidPenis extends SexStick {
public sorenessWeight = Bodypart.WEIGHT_HIGH;
public genderValue = 25;
public genderWeight = Bodypart.WEIGHT_HIGHEST;
public slots : Array = [Humanoid.SLOT_CROTCH_FRONT];
public sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT;
public sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
public flaccidSize = new Measure(6);
public flaccidWidth = new Measure(3);
public erectSize = new Measure(15);
public erectWidth = new Measure(6);
private arousalMinimum : number = 5;
private arousalErect : number = 25;
private flaccidMult : number;
public getSluttiness () {
return this.getBulgeSize() * 3;
}
public isGrower () {
return this.flaccidMult < 0.5;
}
public constructor (options? : ThingOptions) {
super(options);
if (Math.random() >= 0.5) {
// grower?
this.flaccidMult = 0.33;
} else {
// shower?
this.flaccidMult = 0.77;
}
this.addGetAlterations((thing) => {
return {
FSize : this.flaccidSize.getNumber(),
FWidth : this.flaccidWidth.getNumber(),
ESize : this.erectSize.getNumber(),
EWidth : this.erectWidth.getNumber(),
AMin : this.arousalMinimum,
AErect : this.arousalErect,
FMult : this.flaccidMult
}
});
this.addSetAlterations((thing, changes) => {
this.flaccidSize = new Measure(changes.FSize);
this.flaccidWidth = new Measure(changes.FWidth);
this.erectSize = new Measure(changes.ESize);
this.erectWidth = new Measure(changes.EWidth);
this.arousalMinimum = changes.AMin;
this.arousalErect = changes.AErect;
this.flaccidMult = changes.FMult;
});
}
public getActualSize () {
let min = this.flaccidSize.getNumber();
let max = this.erectSize.getNumber();
let variableSize = (max - min);
let finalSize = min + (variableSize * this.getArousalPerc());
return finalSize;
}
public isBig () {
return this.getBulgeSize() > 22;
}
public getArousalPerc () {
//TODO: Get arousal from owner
let arousal = 0;
let numSteps = this.arousalErect - this.arousalMinimum;
let arousalPerc = (arousal - this.arousalMinimum) / numSteps;
arousalPerc = arousalPerc < 0 ? 0 :
arousalPerc > 1 ? 1 :
arousalPerc;
return arousalPerc;
}
public isFlaccid () {
return this.getArousalPerc() < 0.6;
}
public isErect () {
return !this.isFlaccid();
}
public getActualWidth () {
let min = this.flaccidWidth.getNumber();
let max = this.erectWidth.getNumber();
let variableSize = (max - min);
let numSteps = this.arousalErect - this.arousalMinimum;
//TODO: Get arousal from owner
let arousal = 0;
let arousalPerc = (arousal - this.arousalMinimum) / numSteps;
arousalPerc = arousalPerc < 0 ? 0 :
arousalPerc > 1 ? 1 :
arousalPerc;
let finalSize = min + (variableSize * arousalPerc);
return finalSize;
}
public getLong () {
return new Measure(this.getActualSize());
}
public getWide () {
return new Measure(this.getActualWidth());
}
public getBulgeSize () {
return this.getActualSize() + (3 * this.getActualWidth());
}
public getSizeText () {
return HumanoidPenis.getSizeText(this.getBulgeSize());
}
public static getSizeText (size : number) {
// size = long + (width * 3)
// so long from 1 to 20, lets say
// width from 1 to 6, so 3 to 18
let sizeTable = [
[0, "nonexistent"],
[1, "tiny"], // 3l 2w = 9
[20, "small"], // 10l 3w = 19
[23, "medium"], // 14l 3w = 24
[27, "big"],
[32, "huge"],
[36, "monstrous"]
];
let i;
for (i = 1; i < sizeTable.length && sizeTable[i][0] < size; i++) {}
return sizeTable[i - 1][1];
}
public getGenderValue () {
let sizeTable = [
[10, 60], // 3l 2w = 9
[20, 45], // 10l 3w = 19
[23, 35], // 14l 3w = 24
[27, 28],
[32, 24],
[36, 18]
];
let i;
for (i = 1; i < sizeTable.length && sizeTable[i][0] < this.getActualSize(); i++) {}
return sizeTable[i - 1][1];
}
public arrangeGenderValue (gv : number) {
let sizeTable = [
[60, 3, 2], // 3l 2w = 9
[45, 10, 3], // 10l 3w = 19
[35, 14, 3], // 14l 3w = 24
[28, 17, 3],
[24, 19, 4],
[18, 22, 4.5]
];
let i;
for (i = 1; i < sizeTable.length && sizeTable[i][0] > gv; i++) {}
this.flaccidSize = new Measure(this.flaccidMult * sizeTable[i - 1][1]);
this.flaccidWidth = new Measure(this.flaccidMult * sizeTable[i - 1][2]);
this.erectSize = new Measure(sizeTable[i - 1][1]);
this.erectWidth = new Measure(sizeTable[i - 1][2]);
( this.getPartOne()).invalidateCaches();
}
public static getSynonym () {
// TODO: Add more when creative.
let cockNames = [
"cock",
"dick"
];
return (new OneOf(OneOf.PURELY_AT_RANDOM, ...cockNames).getOne());
}
}