diff --git a/CHANGELOG.md b/CHANGELOG.md index 15d75b59be77465fe4a49394ba578a1a3df8b38f..09e46ca5939dd6dd33275f6416cce5810fb529d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * player .energy and .need * tool cleaning and improvements (compilers, sanityCheck, etc) +* genetic quirk support for Autosurgery +* control options for naturally occuring exotic hair colors +* favorites system improvements +* ability to export and import starting girls and starting settings * fixes ## 0.10.7.1-4.0.0-alpha.29 - 2024-02-03 @@ -2621,7 +2625,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## 0.10.7.1-0.1.6 -* new voluntarily enslaved pairs can show their incestual love during recruitment +* new voluntarily enslaved pairs can show their incestuous love during recruitment * minor tweaks to muscle building and steroids * added fertility diet @@ -6877,7 +6881,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * possibly fixed the slave is own niece thing 58 -* incestual relationships extended to player's mother, father and sisters +* incestuous relationships extended to player's mother, father and sisters 57 * bugfixes @@ -7549,7 +7553,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) 11 * bugfixes -* implemented new javascript to hopefully fix existing issues +* implemented new JavaScript to hopefully fix existing issues 2017-02-18 diff --git a/src/Mods/Catmod/events/CMRESS/catWorship.js b/src/Mods/Catmod/events/CMRESS/catWorship.js index 333c921f174f20ab03d9b63120b59cadaee085d4..fe0c440e0da2decd515e5aee6c2b318b25c18334 100644 --- a/src/Mods/Catmod/events/CMRESS/catWorship.js +++ b/src/Mods/Catmod/events/CMRESS/catWorship.js @@ -1,4 +1,4 @@ -// cSpell:ignore gaspy +// cSpell:ignore gaspy oppurrtunities App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEvent { eventPrerequisites() { @@ -24,6 +24,9 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven const { He, he, his, him, girl, himself } = getPronouns(eventSlave); + const { + heU, hisU, himU, himselfU + } = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); const PC = V.PC; App.Events.drawEventArt(node, eventSlave); @@ -51,7 +54,7 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven function spitroast() { t = []; - t.push(`You enter into the showers yourself, accompanied by the sound of ${eventSlave.slaveName}'s mewling moans and the gentle patter of water on skin and fur. Slipping off your pants and ${PC.dick !== 0 ? "gripping your dick with one hand" : "readying the strapon you bring with you for just these sorts of oppurtunities"}, the slave servicing ${eventSlave.slaveName}'s `); + t.push(`You enter into the showers yourself, accompanied by the sound of ${eventSlave.slaveName}'s mewling moans and the gentle patter of water on skin and fur. Slipping off your pants and ${PC.dick !== 0 ? "gripping your dick with one hand" : "readying the strapon you bring with you for just these sorts of oppurrtunities"}, the slave servicing ${eventSlave.slaveName}'s `); if (eventSlave.dick > 0) { t.push(`throbbing cock`); } else if (eventSlave.vagina > 0) { @@ -59,7 +62,7 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven } else { t.push(`smooth crotchfur`); } - t.push(`yelps in surprise as you lift her up from the back, but doesn't resist as you angle and thrust ${PC.dick !== 0 ? "yourself" : "your strapon"} into her. The hard bucking immediately makes her service to ${eventSlave.slaveName}'s crotch uneven and shaky - but the sporadic lapping from your thrusts, combined with the second slave still worshipping her ass, just makes ${eventSlave.slaveName} even more of a gaspy mess. ${He} flutters ${his} big catlike eyes at you <span class="devotion inc">lovingly,</span> and leans forward to plant a <span class="trust inc">tender kiss</span> on your lips as you thrust forward into the bottom slave, before sputtering out the hardest orgasm you've ever seen with a tongue deep up ${his} ass, your lips locked together, and `); + t.push(`yelps in surprise as you lift ${himU} up from the back, but doesn't resist as you angle and thrust ${PC.dick !== 0 ? "yourself" : "your strapon"} into ${himU}. The hard bucking immediately makes ${hisU} service to ${eventSlave.slaveName}'s crotch uneven and shaky - but the sporadic lapping from your thrusts, combined with the second slave still worshipping ${his} ass, just makes ${eventSlave.slaveName} even more of a gaspy mess. ${He} flutters ${his} big catlike eyes at you <span class="devotion inc">lovingly,</span> and leans forward to plant a <span class="trust inc">tender kiss</span> on your lips as you thrust forward into the bottom slave, before sputtering out the hardest orgasm you've ever seen with a tongue deep up ${his} ass, your lips locked together, and `); if (eventSlave.dick > 0) { t.push(`a pair of lips sealed around ${his} dick.`); } else if (eventSlave.vagina > 0) { @@ -76,13 +79,13 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven t = []; t.push(`No reason to interrupt a good thing. You content yourself to lean back against the entrance to the showers and watch as ${eventSlave.slaveName} gets ${his} two little slaves to pay their respects to the feline form, the one in front `); if (eventSlave.dick > 0) { - t.push(`throating herself on cock`); + t.push(`throating ${himselfU} on cock`); } else if (eventSlave.vagina > 0) { t.push(`eating ${him} out with furry thighs locked against ${his} head`); } else { t.push(`lapping religiously at the smooth crotchfur`); } - t.push(`while the one behind buries herself deep in feline asscheeks, looking like she's trying to get her tongue deep enough up ${eventSlave.slaveName}'s butt to french kiss the feline from behind. ${eventSlave.slaveName} skillfully manages both of ${his} worshippers with ${his} hands, running them through both slave's hair and bucking ${his} ass and crotch reactively against each of their faces. Maintaining an impressive composure against the onslaught of sensation, ${eventSlave.slaveName} gives you a quivering little smile as you look onto the depraved scene, clearly <span class="trust inc">happy</span> you've let ${him} engage in ${his} dominant tendencies uninterrupted.`); + t.push(`while the one behind buries ${himselfU} deep in feline asscheeks, looking like ${heU}'s trying to get ${hisU} tongue deep enough up ${eventSlave.slaveName}'s butt to French kiss the feline from behind. ${eventSlave.slaveName} skillfully manages both of ${his} worshippers with ${his} hands, running them through both slave's hair and bucking ${his} ass and crotch reactively against each of their faces. Maintaining an impressive composure against the onslaught of sensation, ${eventSlave.slaveName} gives you a quivering little smile as you look onto the depraved scene, clearly <span class="trust inc">happy</span> you've let ${him} engage in ${his} dominant tendencies uninterrupted.`); eventSlave.trust += 10; return t; } diff --git a/src/Mods/Catmod/events/nonRandom/bodypuristriot.js b/src/Mods/Catmod/events/nonRandom/bodypuristriot.js index 24ea7cdc3aa49cb9ad8cc33666a1a076728eb723..105b28d37250d3bc2b07e19e83c07ca84ca7b205 100644 --- a/src/Mods/Catmod/events/nonRandom/bodypuristriot.js +++ b/src/Mods/Catmod/events/nonRandom/bodypuristriot.js @@ -101,7 +101,7 @@ App.Events.SEBodyPuristRiot = class SEBodyPuristRiot extends App.Events.BaseEven function reputation() { const frag = new DocumentFragment(); let r = []; - r.push(`You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire riot group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The crowd might have guns and knives, but they still quiet down at your words, balking somewhat at the threat of brutality. You take the oppurtunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who actually uses the weapons in their hands has their home, occupation, and family on file. No one moves a muscle.`); // "oppurtunity"... spelling or cat pun? 🤔 + r.push(`You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire riot group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The crowd might have guns and knives, but they still quiet down at your words, balking somewhat at the threat of brutality. You take the opportunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who actually uses the weapons in their hands has their home, occupation, and family on file. No one moves a muscle.`); App.Events.addParagraph(frag, r); r = []; r.push(`You tell the frozen crowd that you'll be continuing your work on Project N, and that if any one of them ever shows up at your house again with a gun, it'll be the worst, and last, decision they ever make. A few people at the back start to break off from the crowd. You turn back to your penthouse and walk inside as the crowd disintegrates. You have work to do, and you get the feeling these people <span class="green">aren't going to bother you again.</span>`); diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js index 8e474636ea6f8563fcfe2d9047d49c97d3f3a3ac..3d4ad025a39f22ad00c093a70a9fef8ef7a79429 100644 --- a/src/descriptions/arcologyDescription.js +++ b/src/descriptions/arcologyDescription.js @@ -938,7 +938,7 @@ App.Desc.playerArcology = function(lastElement) { } else if (A.FSChineseRevivalistDecoration >= 80) { buffer.push(`The noise in the thriving open space is almost oppressive, with the sounds of drunken merriment, traditional music, and distant intercourse forming an omnipresent hum.`); } else if (A.FSAntebellumRevivalistDecoration >= 80) { - buffer.push(`The sound of hushed gossip is just barely discernable over a waltz being played in some distant ballroom.`); + buffer.push(`The sound of hushed gossip is just barely discernible over a waltz being played in some distant ballroom.`); } return buffer.join(" "); diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js index a1fbd9a2508295c5f178a44d4f691cfe515940d0..0e6a6501b6ba526252bb29c4a21b02756ac8a034 100644 --- a/src/endWeek/economics/reputation.js +++ b/src/endWeek/economics/reputation.js @@ -445,7 +445,7 @@ App.EndWeek.reputation = function() { r.push(`Society adores huge cocks and yours is particularly popular; your meaty sausage <span class="green">improves</span> your public image.`); repX((3 * V.PC.dick), "PCappearance"); } else if (V.PC.dick > 0 && V.PC.dick < 3 && V.PC.physicalAge > 12) { - r.push(`Society adores huge cocks and yours is anything but; your pathetic weiner <span class="green">ruins</span> your public image.`); + r.push(`Society adores huge cocks and yours is anything but; your pathetic wiener <span class="green">ruins</span> your public image.`); repX(forceNeg(100), "PCappearance"); } if (V.PC.balls >= 9) { diff --git a/src/events/RE/reRelativeRecruiter.js b/src/events/RE/reRelativeRecruiter.js index 352ed5876ad18bd071f516f4f4aefb2e2bd64aba..5f5ab12dd3194005b6c84d6e2fcb78cfba828a98 100644 --- a/src/events/RE/reRelativeRecruiter.js +++ b/src/events/RE/reRelativeRecruiter.js @@ -170,7 +170,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba // pick a random background for the selected relative this.params.background = this._getRelativeBackgrounds(this.params.relative).random(); - let that = this; // fuck javascript's half-assed classes + let that = this; // fuck JavaScript's half-assed classes let cost = 0; // will be filled out later let cheatDiv = App.UI.DOM.makeElement("div", (V.debugMode > 0 && V.debugModeEventSelection > 0) ? cheatModeSelectors() : ''); diff --git a/src/events/RESS/review/masterfulEntertainer.js b/src/events/RESS/review/masterfulEntertainer.js index bf37fa91ef13884daf11a3d4df6fe06905f5c34e..28d67faea473bf666c4ddf1f5138effbcf6ecc90 100644 --- a/src/events/RESS/review/masterfulEntertainer.js +++ b/src/events/RESS/review/masterfulEntertainer.js @@ -172,7 +172,7 @@ App.Events.RESSMasterfulEntertainer = class RESSMasterfulEntertainer extends App seX(eventSlave, "penetrative", PC, "vaginal"); if (canImpreg(PC, eventSlave)) { r.push(knockMeUp(PC, 20, 0, eventSlave.ID)); - } + } if (PC.vagina === 0) { r.push(r.pop().replace(/.$/, ` <span class="virginity loss">giving ${him} your cherry.</span>`)); PC.vagina++; @@ -181,7 +181,7 @@ App.Events.RESSMasterfulEntertainer = class RESSMasterfulEntertainer extends App seX(eventSlave, "penetrative", PC, "anal"); if (canImpreg(PC, eventSlave)) { r.push(knockMeUp(PC, 20, 1, eventSlave.ID)); - } + } if (PC.anus === 0) { r.push(r.pop().replace(/.$/, ` <span class="virginity loss">giving ${him} your anal cherry.</span>`)); PC.anus++; diff --git a/src/gui/Encyclopedia/encyclopediaCredits.js b/src/gui/Encyclopedia/encyclopediaCredits.js index 6150f4a5d403adc46aafefec8450180a1f6d3e7b..905284723335f5e9de5150116601d6b3d75a8958 100644 --- a/src/gui/Encyclopedia/encyclopediaCredits.js +++ b/src/gui/Encyclopedia/encyclopediaCredits.js @@ -63,7 +63,7 @@ App.Encyclopedia.addArticle("Credits", function() { }, { n: "anon", d: ["for HGExclusion and animal pregnancy work."] }, { - n: "anon", d: ["for putting up with my javascript incompetence."] + n: "anon", d: ["for putting up with my JavaScript incompetence."] }, { n: "anon", d: ["for player family listing."] }, { diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 267009d0a3f908b95cd197070dfa62e9c5ab7ad7..69e51e3db6debdf8089b4be63705373c46de4c55 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -745,7 +745,7 @@ App.UI.optionsPassage = function() { options.addOption("Rules Assistant target growth expressions", "raGrowthExpr", V.experimental) .addValue("Enabled", 1).on().addValue("Disabled", 0).off() - .addComment("This will allow javascript expressions to be used in the Rules Assistant growth target setters."); + .addComment("This will allow JavaScript expressions to be used in the Rules Assistant growth target setters."); options.addOption("New event", "tempEventToggle") .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 154bd79bd68f3da52855f5a74445b2712e64fcbb..b7f798725c92ad6631b2964901c8db4173e6dc8c 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -2,7 +2,7 @@ /* eslint-disable no-unused-vars */ // cSpell:ignore onoffswitch, rajs, hidey -// rewrite of the rules assistant options page in javascript +// rewrite of the rules assistant options page in JavaScript // uses an object-oriented widget pattern // wrapped in a closure so as not to pollute the global namespace // the widgets are generic enough to be reusable; if similar user interfaces are ported to JS, we could move the classes to the global scope diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 21a1a9fdfabe391eb421f5d923a22d3a62f04cb2..e7a2bc319ecc3a6eed18bf73ed479745caeb5fbe 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -461,7 +461,7 @@ App.UI.DOM.cashFormat = function(s, invert) { * Renders an exception to DOM. * Tries it's best to not fail itself. * - * @param {any} ex Exception - normally of type Error, but Javascript literally lets you throw anything + * @param {any} ex Exception - normally of type Error, but JavaScript literally lets you throw anything * @param {boolean} recursion set if formatException() called itself, never set from outside * @returns {DocumentFragment|HTMLParagraphElement} */ diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js index 78074add1ba92abc3a2ac07917bb40d739167b49..4a09a4470d6613f07c53a131be083b1efffe6807 100644 --- a/src/js/utilsSlave.js +++ b/src/js/utilsSlave.js @@ -935,7 +935,7 @@ globalThis.convertCareer = function(slave) { /** * Convert a tutor key name to the corresponding leadership skill key name - * @param {string} key + * @param {string} key */ globalThis.tutorKeyToSkillKey = function(key) { if (key === "DJ") return "DJ"; diff --git a/src/js/utilsUnits.js b/src/js/utilsUnits.js index adc07720cfa2424d7273d7a064a5c5e746088780..426ae35c1e36715f8ef78eb7a92bb5ed3df51ab0 100644 --- a/src/js/utilsUnits.js +++ b/src/js/utilsUnits.js @@ -20,7 +20,7 @@ globalThis.num = function(x, printText = false) { ]; const SCALES = ["thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", - "septillion", "octillion", "nonillion", "decillion"]; + "septillion", "octillion", "nonillion", "decillion", "undecillion", "duodecillion"]; /** * helper function for use with Array.filter diff --git a/src/personalAssistant/assistantAppearance.js b/src/personalAssistant/assistantAppearance.js index 3ed3b596022511db8bf075d902e97e17cb3a640d..5674b4b81fc65266325b5e1983cc076887670322 100644 --- a/src/personalAssistant/assistantAppearance.js +++ b/src/personalAssistant/assistantAppearance.js @@ -962,7 +962,7 @@ globalThis.PersonalAssistantAppearance = function() { "edo revivalist": `${HeA}'s given ${hisA} appearance a Japanese style, making ${himA} look like a demon.`, "arabian revivalist": `${HeA}'s given ${hisA} appearance a mystical Arabian style, making ${himA} look like a djinn.`, "chinese revivalist": `${HeA}'s given ${hisA} appearance a Chinese style, making ${himA} look like a demon.`, - "antebellum revivalist": `${HeA} head has been replaced with the skull of a deer adorned with heavy antlers. An eerie red glow emits from the shadowed eye sockets. Underneath the patchwork of scarred skin and black, bristly fur, the unmistakable curve of large, teardrop-shaped breasts and wide hips is discernable.`, + "antebellum revivalist": `${HeA} head has been replaced with the skull of a deer adorned with heavy antlers. An eerie red glow emits from the shadowed eye sockets. Underneath the patchwork of scarred skin and black, bristly fur, the unmistakable curve of large, teardrop-shaped breasts and wide hips is discernible.`, "chattel religionist": `${HeA}'s wearing the garb of a priestess of the new faith, which clashes amusingly with ${hisA} demonic appearance.`, "repopulation focus": `${HeA}'s very pregnant; ${hisA} belly is covered in large bulges revealing the eggs growing within ${himA}.`, eugenics: `${HeA}'s wearing a complex chastity device, keeping ${hisA} dicks and cunt unusable.`, @@ -1028,7 +1028,7 @@ globalThis.PersonalAssistantAppearance = function() { "edo revivalist": `wearing a Japanese warrior's robe with a pair of swords tucked into its sash.`, "arabian revivalist": `with a bare chest, loose pantaloons, and a broad silk sash wound around ${hisA} waist with a scimitar thrust into it.`, "chinese revivalist": `wearing loose silk robes belted with rope and carrying a simple warrior monk's staff.`, - "antebellum revivalist": `wearing an unbuttoned Confederate army coat, exposing a loose, low-cut blouse. ${HeA} has an old-fashioned revolver holstered on one hip and a calvary saber sheathed on the other. ${HeA} confidently pushes out ${hisA} chest, giving you a nice view down ${hisA} shirt.`, + "antebellum revivalist": `wearing an unbuttoned Confederate army coat, exposing a loose, low-cut blouse. ${HeA} has an old-fashioned revolver holstered on one hip and a cavalry saber sheathed on the other. ${HeA} confidently pushes out ${hisA} chest, giving you a nice view down ${hisA} shirt.`, "chattel religionist": V.arcologies[0].FSChattelReligionistLaw2 === 1 ? `with your religion's holy symbol painted on ${hisA} nude body. ${HisA} long blonde hair cascades down ${hisA} back in golden glory.` : `wearing a crusader's mail. ${HisA} long blonde hair cascades down the back of ${hisA} surcoat in golden glory.`, "repopulation focus": `with an enormous belly. Its oversized occupant kicks and squirms ferociously, eager to be born.`, eugenics: `with a complex bone chastity belt blocking ${hisA} vagina.`,