diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js index c6cdac06ce129c3c1b327e12c92bcddda968d3f3..fa59d1c1f69730334c3b71e249532c596cb6bf02 100644 --- a/src/data/backwardsCompatibility/backwardsCompatibility.js +++ b/src/data/backwardsCompatibility/backwardsCompatibility.js @@ -1986,9 +1986,6 @@ App.Update.oldVersions = function(node) { if (typeof V.PC.markings === "undefined") { V.PC.markings = "none"; } - if (typeof V.PC.pronoun === "undefined") { - generatePlayerPronouns(V.PC); - } if (typeof V.PC.pregKnown === "undefined") { if (V.PC.preg > 0) { V.PC.pregKnown = 1; diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index dbccd3d3c04dc8082f0e7f17414d63de36f25648..ef2e3672e016d15606c6f87ed5358cbe2cff31fb 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1168,8 +1168,10 @@ globalThis.PCDatatypeCleanup = (function PCDatatypeCleanup() { PCRulesDatatypeCleanup(PC); PCCustomStatsDatatypeCleanup(PC); PCMiscellaneousDatatypeCleanup(PC); - App.Entity.Utils.migratePronouns(PC); - generatePlayerPronouns(PC); + if (typeof PC.pronoun !== "number") { + App.Entity.Utils.migratePronouns(PC); + generatePlayerPronouns(PC); + } } /** diff --git a/src/events/RE/reRelativeRecruiter.js b/src/events/RE/reRelativeRecruiter.js index 94cbdc5b6408c75ff3b75d55a95db641599a42a9..8d2e6a2ec87ec1a3d463bf223d6dbfe15bf9ab6b 100644 --- a/src/events/RE/reRelativeRecruiter.js +++ b/src/events/RE/reRelativeRecruiter.js @@ -589,8 +589,9 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba const origSlave = BaseSlave(); const genepoolRec = V.genePool.find(s => s.ID === that.actors[0]); App.Entity.Utils.GenePoolRecordCleanup(genepoolRec); - Object.assign(origSlave, genepoolRec); + deepAssign(origSlave, genepoolRec); updateGPRecordAgeFromEventSlave(origSlave); + generatePronouns(origSlave); const newSlave = generateRelatedSlave(origSlave, that.params.relative); clearMods(newSlave); diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js index 406545b0ee52099bdcb7f60f293ed94ca932e42c..b8cf1d6b39b9fa3b0902d094109980f4412ebdd7 100644 --- a/src/events/intro/pcAppearance.js +++ b/src/events/intro/pcAppearance.js @@ -525,7 +525,7 @@ App.UI.Player.design = function() { if (V.PC.title === 1) { r.push(`masculine <strong>Master</strong>`); } else { - r.push(`feminine ''Mistress'`); + r.push(`feminine <strong>Mistress</strong>`); } r.push(`and everyone that matters calls you ${PlayerName()}.`); diff --git a/src/interaction/siCustom.js b/src/interaction/siCustom.js index 3cfde0243b1b2a4cbc9e31186f432dce1217d3b9..797495faef7e3444db6a3f307e9fa19fc345e886 100644 --- a/src/interaction/siCustom.js +++ b/src/interaction/siCustom.js @@ -22,7 +22,8 @@ App.UI.SlaveInteract.custom = function(slave, refresh) { App.UI.DOM.appendNewElement("h3", el, `Names`); el.append( playerTitle(), - slaveFullName() + slaveFullName(), + pronouns() ); App.UI.DOM.appendNewElement("h3", el, `Description`); @@ -446,6 +447,23 @@ App.UI.SlaveInteract.custom = function(slave, refresh) { } } + function pronouns() { + const pnNode = new DocumentFragment(); + + const grp = new App.UI.OptionsGroup(); // note that OptionsGroup's default refresh will reload the entire page, which is desirable in this case + grp.addOption("Pronouns to use:", "pronoun", slave) + .addValue("Feminine", App.Data.Pronouns.Kind.female) + .addValue("Masculine", App.Data.Pronouns.Kind.male) + .addValue("Neuter/Toy", App.Data.Pronouns.Kind.neutral) + // .addValue("Epicene/Plural", App.Data.Pronouns.Kind.epicene) - TODO: epicene pronouns have verb tense problems ("they is...") + // .addValue("Custom", App.Data.Pronouns.Kind.custom) - TODO: custom pronoun mechanism is incomplete/broken right now + .addComment(`${slave.slaveName} will be addressed as "${he}/${him}."`); + + pnNode.append(grp.render()); + + return pnNode; + } + function hair() { let hairNode = new DocumentFragment(); hairNode.appendChild(hairStyle()); diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js index 94142b5de8ad06136adddd3661dcb53b5813ac71..c8f8c97c3cd6505036901c924e690bac25d4e122 100644 --- a/src/player/managePersonalAffairs.js +++ b/src/player/managePersonalAffairs.js @@ -137,6 +137,7 @@ App.UI.managePersonalAffairs = function() { const textBoxDiv = document.createElement("div"); const renamePlayerDiv = document.createElement("div"); const newNameDiv = document.createElement("div"); + const pronounsDiv = document.createElement("div"); const rumorsDiv = document.createElement("div"); const familyDiv = document.createElement("div"); const pregnancyDiv = document.createElement("div"); @@ -153,6 +154,7 @@ App.UI.managePersonalAffairs = function() { `On formal occasions, you are announced as ${PCTitle()}. By slaves, however, you prefer to be called ${properMaster()}.`, customTitle(), renamePlayer(), + // pronouns(), // TODO: waiting for 5.0 per pregmodder rumors(), family(), ); @@ -240,6 +242,20 @@ App.UI.managePersonalAffairs = function() { return customTitleDiv; } + // TODO: waiting for 5.0 per pregmodder + function pronouns() { + const options = new App.UI.OptionsGroup(); + const {he, him} = getPronouns(V.PC); + options.addOption("", "pronoun", V.PC) + .addValue("She/Her", App.Data.Pronouns.Kind.female) + .addValue("He/Him", App.Data.Pronouns.Kind.male) + .addValue("It", App.Data.Pronouns.Kind.neutral); + // .addValue("They/Them", App.Data.Pronouns.Kind.epicene) - TODO: epicene pronouns have verb tense problems ("they is...") + // .addValue("Custom", App.Data.Pronouns.Kind.custom) - TODO: custom pronoun mechanism is incomplete/broken right now + pronounsDiv.append("Your preferred pronouns are ", App.UI.DOM.linkReplace(`${he}/${him}.`, options.render())); + return pronounsDiv; + } + function renamePlayer() { newNameDiv.append( `New name: `,