123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766 |
- interface HumanoidOptions extends ThingOptions {
- isMale : boolean;
- }
- interface HumanoidGender {
- hasPenis : boolean;
- hasPenisBulge : boolean;
- hasVagina : boolean;
- hasTits : boolean;
- genderValue : number;
- genderValueCorrected : number;
- }
- interface HumanoidSluttiness {
- halfNaked : boolean;
- naked : boolean;
- sluttiness : number;
- sluttinessCorrected : number;
- }
- interface HumanoidBulges {
- breasts : number;
- crotch : number;
- butt : number;
- waist : number;
- }
- class Humanoid extends Person {
- public static SEX_MALE = 0;
- public static SEX_FEMALE = 1;
- public static SEX_HERM = 2;
- public breastVisibleSize = 0;
- public isBreastVisible = false;
- public isBreastTight = false;
- public isBreastLoose = false;
- public crotchVisibleSize = 0;
- public isCrotchVisible = false;
- public isCrotchTight = false;
- public buttVisibleSize = 0;
- public isButtVisible = false;
- public isButtTight = false;
- public isGenderCached : boolean = false;
- public isSluttinessCached : boolean = false;
- public cachedGenderValue : HumanoidGender;
- public cachedSluttiness : HumanoidSluttiness;
- public cachedBulges : HumanoidBulges;
- public uncoveredSlots : Array<number> = [];
- public invalidateCaches () {
- this.isGenderCached = false;
- this.isSluttinessCached = false;
- }
- public getGenderValue () : HumanoidGender {
- if (!this.isSluttinessCached) {
- this.updateCaches();
- }
- return this.cachedGenderValue;
- }
- public getSluttiness () : HumanoidSluttiness {
- if (!this.isSluttinessCached) {
- this.updateCaches();
- }
- return this.cachedSluttiness;
- }
- public getBulges () {
- if (!this.isGenderCached) {
- this.updateCaches();
- }
- return this.cachedBulges;
- }
- public updateCaches () {
- this.updateClothing();
- this.updateSlots();
- this.updateBodyparts();
- this.updateBulges();
- this.updateGenderValue();
- this.updateSluttiness();
- }
- public updateSlots () {
- this.uncoveredSlots = [];
- for (let i = 0; i < Humanoid.SLOT_SLOT_COUNT; i++) { this.uncoveredSlots.push(i); }
- let clothing = <Array<Clothing>>Thing.WearRelation.getRightType(this, Clothing);
- for (let i = 0; i < clothing.length; i++) {
- let covering = clothing[i].getCoveringSlots();
- for (let k = 0; k < covering.length; k++) {
- let idx = this.uncoveredSlots.indexOf(covering[k]);
- if (idx >= 0) {
- this.uncoveredSlots.splice(idx, 1);
- }
- }
- if (this.uncoveredSlots.length == 0) break;
- }
- }
- public updateGenderValue () {
- let clothingGender = Clothing.getGenderValueOn(this);
- let bodypartGender = Bodypart.getGenderValueOn(this);
- let genderWeight = clothingGender.weight + bodypartGender.weight;
- let genderValue = clothingGender.value + bodypartGender.value;
- let correctionWeight = Bodypart.WEIGHT_HIGHEST;
- let correctionValue = this.getStat(Attributes.GenderIdentity) * Bodypart.WEIGHT_HIGHEST;
- let hasPenis : boolean = false;
- let hasVagina : boolean = false;
- if (this.isCrotchVisible) {
-
- if (Thing.PartRelation.getRightTypeOne(this, HumanoidPenis) != undefined) {
- hasPenis = true;
- hasVagina = false;
- correctionValue += 0 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- } else if (Thing.PartRelation.getRightTypeOne(this, HumanoidVagina) != undefined) {
- hasPenis = false;
- hasVagina = true;
- correctionValue += 100 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- }
- if (this.breastVisibleSize > 0) {
- correctionValue += 100 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- if (this.crotchVisibleSize > 0 && !hasVagina) {
- correctionValue += 0 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- let genderValueFinal = genderValue / genderWeight;
- let genderValueCorrected = (genderValue + correctionValue) / (genderWeight + correctionWeight);
- this.cachedGenderValue = {
- hasTits : this.breastVisibleSize > 1,
- hasPenisBulge : this.crotchVisibleSize > 0 && !hasVagina,
- hasPenis : hasPenis,
- hasVagina : hasVagina,
- genderValue : genderValueFinal,
- genderValueCorrected : genderValueCorrected
- };
- this.isGenderCached = true;
- }
- public isVisibleOn (slot : number) {
- return this.uncoveredSlots.indexOf(slot) != -1;
- }
-
- public updateSluttiness () {
-
-
-
- let clothingSluttiness = Clothing.getSluttinessValueOn(this);
- let bodypartSluttiness = Bodypart.getSluttinessValueOn(this);
- let sluttinessWeight = clothingSluttiness.weight + bodypartSluttiness.weight;
- let sluttinessValue = clothingSluttiness.value + bodypartSluttiness.value;
- let correctionWeight = 0;
- let correctionValue = 0;
- let somewhatSlutty = [Humanoid.SLOT_MIDRIFF, Humanoid.SLOT_LEG_UPPER, Humanoid.SLOT_WAIST, Humanoid.SLOT_HIPS, Humanoid.SLOT_BACK];
- for (let i = 0; i < somewhatSlutty.length; i++) {
- if (this.isVisibleOn(somewhatSlutty[i])) {
- correctionWeight += 1;
- correctionValue += 75;
- }
- }
- let verySlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT];
- for (let i = 0; i < verySlutty.length; i++) {
- if (this.isVisibleOn(verySlutty[i])) {
- correctionWeight += 3;
- correctionValue += 75;
- }
- }
- if ((this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) > 0.75) {
- let extremeSlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT];
- for (let i = 0; i < extremeSlutty.length; i++) {
- if (this.isVisibleOn(extremeSlutty[i])) {
- correctionWeight += 5;
- correctionValue += 85;
- }
- }
- }
- let halfNaked : boolean;
- let naked : boolean;
- if (!this.isMale()) {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- } else {
- if (this.hasBreasts()) {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- } else {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- }
- }
- let sluttinessValueFinal = sluttinessValue / sluttinessWeight;
- let sluttinessCorrected = (sluttinessValue + correctionValue) / (sluttinessWeight + correctionWeight);
- this.cachedSluttiness = {
- halfNaked : halfNaked,
- naked : naked,
- sluttiness : sluttinessValueFinal,
- sluttinessCorrected : sluttinessCorrected
- };
- this.isSluttinessCached = true;
- }
- public isVisibleOnArray (arr : Array<number>) {
- for (let i =0 ; i < arr.length; i++) {
- if (!this.isVisibleOn(arr[i])) {
- return false;
- }
- }
- return true;
- }
- public addMaleParts () {
- if (!this.isMale() && !this.isHerm()) {
- this.addParts(
- new HumanoidTesticles(), new HumanoidPenis()
- );
- }
- this.invalidateCaches();
- }
- public addFemaleParts () {
- if (!this.isFemale() && !this.isHerm()) {
- this.addParts(
- new HumanoidVagina()
- );
- }
- this.invalidateCaches();
- }
- public removeGenderedParts () {
- this.removeParts(HumanoidVagina);
- this.removeParts(HumanoidPenis);
- this.removeParts(HumanoidTesticles);
- this.invalidateCaches();
- }
- public setGenderValue (value : number) {
- let bp = this.getParts(Bodypart);
- for (let i = 0; i < bp.length; i++) {
- if (bp[i] instanceof HumanoidBreasts && this.isMale()) {
- bp[i].arrangeGenderValue(0);
- } else {
- bp[i].arrangeGenderValue(value);
- }
- }
- }
- public constructor (options? : HumanoidOptions) {
- super(options);
- this.addParts(
- new HumanoidSkin(), new HumanoidHead(), new HumanoidArms(),
- new HumanoidHands(), new HumanoidBreasts(), new HumanoidFeet(),
- new HumanoidTorso(), new HumanoidButt()
- );
- if (options.isMale) {
- this.addMaleParts();
- this.setGenderValue(25);
- } else {
- this.addFemaleParts();
- this.setGenderValue(75);
- }
- this.addGetAlterations((humanoid : Humanoid) => {
-
- if (humanoid.isPlayer()) {
- return {
- HumanoidGender: humanoid.isMale() ? Humanoid.SEX_MALE :
- humanoid.isFemale() ? Humanoid.SEX_FEMALE :
- Humanoid.SEX_HERM
- }
- }
- });
- this.addSetAlterations((humanoid : Humanoid, changes) => {
-
- if (humanoid.isPlayer()) {
- humanoid.removeGenderedParts();
- if (changes.HumanoidGender == Humanoid.SEX_MALE) {
- humanoid.addMaleParts();
- } else if (changes.HumanoidGender == Humanoid.SEX_FEMALE) {
- humanoid.addFemaleParts();
- } else {
- humanoid.addMaleParts();
- humanoid.addFemaleParts();
- }
- }
- });
- }
- public updateBodyparts () {
- let parts = <Array<Bodypart>> Thing.PartRelation.getRightType(this, Bodypart);
- for (let i = 0; i < parts.length; i++) {
- parts[i].updateStatus();
- }
- }
- public updateClothing () {
- let clothes = <Array<Clothing>> Thing.WearRelation.getRightType(this, Clothing);
- for (let i = 0; i < clothes.length; i++) {
- clothes[i].updateStatus();
- }
- }
- public updateBulges () {
- let clothes = Thing.WearRelation.getRightType(this, Clothing).sort(function (a : Clothing, b : Clothing) {
- return a.layer - b.layer;
- });
- this.isBreastVisible = true;
- this.isCrotchVisible = true;
- this.isButtVisible = true;
- let bras = [];
- let butts = [];
- let junks = [];
- clothes.forEach((cloth : Clothing) => {
- cloth.updateStatus();
- if (cloth.slots.indexOf(Humanoid.SLOT_BREASTS) != -1) {
- bras.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BREASTS) == -1) {
- this.isBreastVisible = false;
- }
- }
- if (cloth.slots.indexOf(Humanoid.SLOT_BUTT) != -1) {
- butts.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BUTT) == -1) {
- this.isButtVisible = false;
- }
- }
- if (cloth.slots.indexOf(Humanoid.SLOT_CROTCH_FRONT) != -1) {
- junks.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_CROTCH_FRONT) == -1) {
- this.isCrotchVisible = false;
- }
- }
- });
- this.updateBreastSizes(bras);
- this.updateCrotchSizes(junks);
- this.updateButtSizes(butts);
- this.cachedBulges = {
- breasts : this.breastVisibleSize,
- butt : this.buttVisibleSize,
- crotch : this.crotchVisibleSize,
- waist : 0
- };
- }
- public getTopClothOn (slot : number) {
- return Thing.WearRelation.getRightType(this, Clothing).filter(otherCloth => {
- return otherCloth.visibleOn.includes(slot);
- }).sort((a : Clothing, b : Clothing) => {
- return a.layer - b.layer;
- })[0];
- }
- public updateBreastSizes (bras : Array<Clothing>) {
- this.isBreastTight = false;
- this.isBreastLoose = true;
- let breasts = <HumanoidBreasts> Thing.PartRelation.getRightTypeOne(this, HumanoidBreasts);
- this.breastVisibleSize = breasts.getSize();
- bras.forEach((bra : Clothing) => {
- if (bra.tightBreastSize >= 0 && this.breastVisibleSize > bra.tightBreastSize) {
- this.isBreastTight = true;
- }
- if (bra.maxBreastSize >= 0 && this.breastVisibleSize > bra.maxBreastSize) {
- this.breastVisibleSize = bra.maxBreastSize;
- }
- if (this.breastVisibleSize >= bra.looseBreastSize) {
- this.isBreastLoose = false;
- }
- this.breastVisibleSize += bra.breastPadding;
- if (this.breastVisibleSize < 0) {
- this.breastVisibleSize = 0;
- }
- });
- }
- public updateCrotchSizes (cloths : Array<Clothing>) {
- this.isCrotchTight = false;
- this.crotchVisibleSize = 0;
- let penis = <HumanoidPenis> Thing.PartRelation.getRightTypeOne(this, HumanoidPenis);
- let testicles = <HumanoidTesticles> Thing.PartRelation.getRightTypeOne(this, HumanoidTesticles);
- this.crotchVisibleSize = 0;
- if (penis != undefined) {
- this.crotchVisibleSize += penis.getBulgeSize();
- }
- if (testicles != undefined) {
- this.crotchVisibleSize += testicles.getBulgeSize();
- }
- this.crotchVisibleSize = Math.floor(this.crotchVisibleSize * 10) / 10;
- cloths.forEach((worn : Clothing) => {
- if (worn.tightCrotchSize >= 0 && this.crotchVisibleSize > worn.tightCrotchSize) {
- this.isCrotchTight = true;
- }
- if (worn.maxCrotchSize >= 0 && this.crotchVisibleSize > worn.maxCrotchSize) {
- this.crotchVisibleSize = worn.maxCrotchSize;
- }
- this.crotchVisibleSize += worn.crotchPadding;
- if (this.crotchVisibleSize < 0) {
- this.crotchVisibleSize = 0;
- }
- });
- }
- public updateButtSizes (cloths : Array<Clothing>) {
- this.isButtTight = false;
- let butt = <HumanoidButt> Thing.PartRelation.getRightTypeOne(this, HumanoidButt);
- this.buttVisibleSize = butt == undefined ? 0 : butt.getSize();
- cloths.forEach((worn : Clothing) => {
- if (worn.tightButtSize >= 0 && this.buttVisibleSize > worn.tightButtSize) {
- this.isButtTight = true;
- }
- if (worn.maxButtSize >= 0 && this.buttVisibleSize > worn.maxButtSize) {
- this.buttVisibleSize = worn.maxButtSize;
- }
- this.buttVisibleSize += worn.buttPadding;
- if (this.buttVisibleSize < 0) {
- this.buttVisibleSize = 0;
- }
- });
- }
- public hasBreasts () {
- let breasts = <HumanoidBreasts> this.getPart(HumanoidBreasts);
- if (breasts.size > 1) {
- return true;
- }
- return false;
- }
- public isMale () {
- return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length == 0;
- }
- public isFemale () {
- return this.getParts(HumanoidPenis).length == 0 && this.getParts(HumanoidVagina).length > 0;
- }
- public isHerm () {
- return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length > 0;
- }
- public getShortestDescription () {
- let playerGender = this.getGenderValue();
- let playerSluttiness = this.getSluttiness();
- let presentation = "";
- if (playerSluttiness.sluttinessCorrected > 75) {
- presentation += ("slutty, ");
- } else if (playerSluttiness.sluttinessCorrected > 35) {
- } else if (playerSluttiness.sluttinessCorrected > 20) {
- presentation += ("prude, ");
- } else {
- presentation += ("saintly, ");
- }
- if (playerGender.genderValueCorrected < 40) {
- presentation += ("masculine ");
- } else if (playerGender.genderValueCorrected < 60) {
- presentation += ("androgynous ");
- } else {
- presentation += ("feminine ");
- }
- if (playerGender.hasTits) {
- if (playerGender.hasPenis || playerGender.hasPenisBulge) {
-
- presentation += ("shemale");
- } else if (playerGender.hasVagina) {
-
- presentation += ("woman");
- }
- } else {
-
- if (playerGender.hasPenis) {
-
- if (playerGender.genderValueCorrected < 60) {
- presentation += ("man");
- } else {
- presentation += ("trap");
- }
- } else if (playerGender.hasPenisBulge) {
-
- if (playerGender.genderValueCorrected < 60) {
- presentation += ("man");
- } else {
- presentation += ("trap");
- }
- } else if (playerGender.hasVagina) {
-
- presentation += ("woman");
- }
- }
- return presentation;
- }
- public static SLOT_HAIR = 0;
- public static SLOT_HEADGEAR = 1;
- public static SLOT_FACE = 2;
- public static SLOT_EARS = 3;
- public static SLOT_EYES = 4;
- public static SLOT_NOSE = 5;
- public static SLOT_MOUTH = 6;
- public static SLOT_NECK = 7;
- public static SLOT_SHOULDERS = 8;
- public static SLOT_ARMS = 9;
- public static SLOT_HANDS = 10;
- public static SLOT_FINGERS = 11;
- public static SLOT_FINGERNAILS = 12;
- public static SLOT_UPPER_CHEST = 13;
- public static SLOT_MIDRIFF = 14;
- public static SLOT_WAIST = 15;
- public static SLOT_BACK = 16;
- public static SLOT_HIPS = 17;
- public static SLOT_CROTCH_FRONT = 18;
- public static SLOT_CROTCH_BACK = 19;
- public static SLOT_BUTT = 20;
- public static SLOT_LEG_UPPER = 21;
- public static SLOT_LEG_LOWER = 22;
- public static SLOT_FEET = 23;
- public static SLOT_FEET_NAILS = 24;
- public static SLOT_BREASTS = 25;
- public static SLOT_SLOT_COUNT = 26;
- public static cacheInvalidationActionRule = new Rule({
- name : "Invalidate humanoid caches",
- firstPriority : Rule.PRIORITY_LOWEST,
- code : (runner : RulebookRunner<Action>) => {
- (<Humanoid> runner.noun.actor).invalidateCaches();
- },
- conditions : (runner : RulebookRunner<Action>) => {
- return runner.noun.actor instanceof Humanoid;
- }
- });
- public static getPlayerDescription () : Say {
- let say = new Say();
- say.add("You are ");
- let player = <Humanoid> WorldState.player;
- let male = player.getParts(HumanoidPenis).length > 0;
- let female = player.getParts(HumanoidVagina).length > 0;
- if (male && female) {
- say.add( "hermaphrodite");
- } else if (male) {
- say.add("male");
- } else {
- say.add("female");
- }
- say.add(". You are presenting as ", new SayAn(), player.getShortestDescription() + ". ");
- say.add(Attributes.GenderIdentity.getDescription(player.getStat(Attributes.GenderIdentity)));
-
- let sv = player.getSluttiness();
- let bulges = player.getBulges();
- let coveredPerc = 1 - (player.uncoveredSlots.length / Humanoid.SLOT_SLOT_COUNT);
- say.add(" ", (<HumanoidSkin> player.getPart(HumanoidSkin)).getDescription());
- if (sv.halfNaked) {
- say.add(" You are almost naked. ");
- } else if (sv.naked) {
- say.add(" You are naked. ");
- } else if (coveredPerc < 0.2) {
- say.add("You are not showing much of it, though.");
- }
- say.add(Attributes.Degeneration.getDescription(player.getStat(Attributes.Degeneration)));
- say.add(Say.PARAGRAPH_BREAK);
- say.add((<HumanoidArms> player.getPart(HumanoidArms)).getDescription(), " ");
- say.add((<HumanoidHands> player.getPart(HumanoidHands)).getDescription(), " ");
- say.add((<HumanoidFeet> player.getPart(HumanoidFeet)).getDescription(), " ");
- let penis = <HumanoidPenis> player.getPart(HumanoidPenis);
- let vagina = <HumanoidVagina> player.getPart(HumanoidVagina);
- if (penis != undefined) {
- say.add("You have a ",
- penis.getSizeText(), (penis.isFlaccid() ? " flaccid " : " erect "),
- Say.COCK, " between your legs"
- );
- if (!penis.isBig() && penis.isGrower() && penis.isFlaccid()) {
- say.add(", which is okay, since you're a grower, not a shower");
- }
- if (penis.isUncovered()) {
- let oneOf = new OneOf(OneOf.PURELY_AT_RANDOM, ...[
- ", it is not covered by any clothing",
- ", it is not covered by any clothes",
- ", it is uncovered",
- ", it is visible to all",
- ", it is hanging freely"
- ]);
- say.add(oneOf.getOne());
- }
- let testicles = <HumanoidTesticles> player.getPart(HumanoidTesticles);
- if (HumanoidPenis.getSizeText(bulges.crotch) != HumanoidPenis.getSizeText(penis.getBulgeSize() + testicles.getBulgeSize())) {
- say.add(", but it looks like it's actually ", HumanoidPenis.getSizeText(bulges.crotch), " due to your clothing")
- }
- say.add(". ");
- if (testicles != undefined) {
-
- }
- } else {
- say.add(vagina.getDescription());
- }
-
- say.add( " ");
- let breasts = <HumanoidBreasts> player.getPart(HumanoidBreasts);
- let butt = <HumanoidButt> player.getPart(HumanoidButt);
- say.add("You have ", breasts.getSizeText(), " breasts and a ", butt.getSizeText(), " butt.");
- if (bulges.breasts != breasts.getSize() && bulges.butt != butt.getSize()) {
- say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts),
- " and make your butt appear ", HumanoidButt.getSizeText(bulges.butt), ".");
- } else if (bulges.breasts != breasts.getSize()) {
- say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts), ".");
- } else if (bulges.butt != butt.getSize()) {
- say.add(" Your clothing makes your butt appear ", HumanoidButt.getSizeText(bulges.butt), ".");
- }
- say.add(Say.PARAGRAPH_BREAK);
- let clothingSluttiness = Clothing.getSluttinessValueOn(player);
- let bodypartSluttiness = Bodypart.getSluttinessValueOn(player);
- if (clothingSluttiness.weight > 0) {
- let clothingSluttinessFinal = clothingSluttiness.value / clothingSluttiness.weight;
- if (clothingSluttinessFinal > 75) {
- say.add("Your outfit can only be described as \"whore-ish\", it is far too nasty.")
- } else if (clothingSluttinessFinal > 60) {
- say.add("Your clothing are obviously making you look a bit naughty.")
- } else if (clothingSluttinessFinal < 30 && sv.sluttinessCorrected < 30) {
- say.add("Your clothing are definitely a bit prude.")
- } else if (clothingSluttinessFinal < 15 && sv.sluttinessCorrected < 30) {
- say.add("Your outfit is so prude that it could be worn by a saint.")
- }
- }
- say.add(" ");
- if (bodypartSluttiness.weight > 0) {
- let bodypartSluttinessFinal = bodypartSluttiness.value / bodypartSluttiness.weight;
- if (bodypartSluttinessFinal > 75) {
- say.add("The way your body is makes you look like you were made purely for sex");
- if (coveredPerc > 0.7) {
- say.add(", thankfully it's mostly covered")
- } else if (coveredPerc < 0.2) {
- say.add(", and you didn't even bother covering it up")
- }
- say.add(".");
- } else if (bodypartSluttinessFinal > 60) {
- say.add("Your body definitely has a lot of sex-appeal going on");
- if (coveredPerc > 0.7) {
- say.add(", although it's covered")
- } else if (coveredPerc < 0.2) {
- say.add(", proudly displayed for all to see")
- }
- say.add(".");
- } else if (bodypartSluttinessFinal < 30) {
- say.add("You have very little sex-appeal, maybe you are a kitchen table?");
- if (coveredPerc > 0.7) {
- say.add(" At least you covered it up.")
- } else if (coveredPerc < 0.2) {
- say.add(" Maybe you could cover it up a bit.")
- }
- }
- }
- say.add(Say.PARAGRAPH_BREAK);
- let stats = new SayLeftRight();
- stats.addLeft(new SayBold("Strength: "), Attributes.Strength.getDescription(player.getStat(Attributes.Strength)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Agility: "), Attributes.Agility.getDescription(player.getStat(Attributes.Agility)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Charm: "), Attributes.Charm.getDescription(player.getStat(Attributes.Charm)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Intelligence: "), Attributes.Intelligence.getDescription(player.getStat(Attributes.Intelligence)));
- Skill.getSkills().forEach((skill: Skill) => {
- if (player.getSkill(skill) > 0) {
- stats.addRight(new SayBold(skill.id + ": "), skill.getDescription(player.getSkill(skill)));
- }
- });
- say.add(stats);
- return say;
- }
- }
- ActionWear.carry.addRule(Humanoid.cacheInvalidationActionRule);
- ActionRemove.carry.addRule(Humanoid.cacheInvalidationActionRule);
|