diff --git a/css/gui/encyclopedia.css b/css/gui/encyclopedia.css index 9cd84398b514dfad886a5eef12650c5f4a6fc474..6ca860782e9ad394ef990160b91611365cd6540e 100644 --- a/css/gui/encyclopedia.css +++ b/css/gui/encyclopedia.css @@ -1,3 +1,14 @@ .encyclopedia.topic { font-weight: bold; } + +/* mark text that is a link/button somewhere else */ +/* Click <span class="encyclopedia interaction">X</span> to do Y */ +.encyclopedia.interaction { + background: #203e6c; + border-radius: 5px; + border: hidden; + padding: 2px 4px; + white-space: nowrap; + font-size: smaller; +} diff --git a/devTools/types/FC/data.d.ts b/devTools/types/FC/data.d.ts index 48e6a8e94a673b25ced0e5a153d3eb5d24006772..eee7fbaa16b826501ad409826b823341c80dd7fb 100644 --- a/devTools/types/FC/data.d.ts +++ b/devTools/types/FC/data.d.ts @@ -60,6 +60,7 @@ declare namespace FC { jobs: Record<string, JobDesc>; defaultJob: string; manager: ManagerJobDesc | null; + decorated: boolean; } namespace SlaveSummary { diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index e1cebc9bf31f26d2c27a825565e79546585b189a..ce97e37f3e67a773b31d9905e1e10191a265f0cd 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -76,6 +76,7 @@ App.Data.defaultGameStateVariables = { dangerousPregnancy: 0, debugMode: 0, debugModeCustomFunction: 0, + debugModeEventSelection: 0, difficultySwitch: 0, disableLisping: 0, displayAssignments: 1, diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index 5d0c318ff3484e04543706ca3428502ca6761555..b51ecbc0720c5ee7275a26f60f3eb99044fc3f69 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "3.9.6", commitHash: null, - release: 1128 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. + release: 1129 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. }; diff --git a/src/004-base/facility.js b/src/004-base/facility.js index e2c964b78b266485d9de4ced1e28891ab4ce401a..dbfcf5be075cab9fc60d10ab5d5cd08a70547730 100644 --- a/src/004-base/facility.js +++ b/src/004-base/facility.js @@ -11,6 +11,7 @@ App.Data.FacilityDesc = class { this.defaultJob = ""; /** @type {FC.Data.ManagerJobDesc} */ this.manager = null; + this.decorated = false; } }; @@ -321,7 +322,7 @@ App.Entity.Facilities.Facility = class { /** Facility slave capacity * @returns {number} */ get capacity() { - return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].capacity : V[this.desc.baseName]; + return V[this.desc.baseName] !== null && ((typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].capacity : V[this.desc.baseName]); } get established() { @@ -381,26 +382,34 @@ App.Entity.Facilities.Facility = class { * @returns {number} */ upgrade(name) { - return this.option("Upgrade" + name); + return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].upgrade[name] : this.option("Upgrade" + name); } - /** - * How is this facility currently decorated? + /** Can this facility be decorated? */ + get isDecorated() { + return this.desc.decorated; + } + + /** How is this facility currently decorated? * @returns {FC.FutureSocietyDeco} */ get decoration() { + if (!this.isDecorated) { + return "standard"; + } return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].decoration : V[this.desc.baseName + "Decoration"]; } - /** - * Configure facility decoration + /** Configure facility decoration * @param {FC.FutureSocietyDeco} val */ set decoration(val) { - if (typeof V[this.desc.baseName] === "object") { - V[this.desc.baseName].decoration = val; - } else { - V[this.desc.baseName + "Decoration"] = val; + if (this.isDecorated) { + if (typeof V[this.desc.baseName] === "object") { + V[this.desc.baseName].decoration = val; + } else { + V[this.desc.baseName + "Decoration"] = val; + } } } diff --git a/src/cheats/cheatEditSlave.js b/src/cheats/cheatEditSlave.js index 39835b4cb3096d7791a83bcfde0a3ca1e76eb5bb..35c2be24e62f969221dd9e41b6b401f1bd008258 100644 --- a/src/cheats/cheatEditSlave.js +++ b/src/cheats/cheatEditSlave.js @@ -135,7 +135,7 @@ App.UI.SlaveInteract.cheatEditSlave = function(slave) { option = options.addOption(`Porn ${he} is known for`, "fameType", porn).addValue("None", "none").pulldown(); for (const genre of App.Porn.getAllGenres()) { - option.addValue(genre.uiName(), genre.fameVar); + option.addValue(genre.uiName(), genre.fameName); } option = options.addOption(`Porn the studio focuses on`, "focus", porn).addValue("None", "none").pulldown(); diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js index 213025c4c2c01282dd8a94b7f2ed440c8f933635..389fdb27dfa8fbd100a240e0babcd10f5432cb43 100644 --- a/src/endWeek/reports/farmyardReport.js +++ b/src/endWeek/reports/farmyardReport.js @@ -11,15 +11,17 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { - // MARK: Farmer + // Farmer function farmerChanges() { - farmerHealth(Farmer); - farmerDevotion(Farmer); - farmerTrust(Farmer); - farmerLivingRules(Farmer); - farmerRestRules(Farmer); - farmerCashBonus(Farmer); + if (Farmer) { + farmerHealth(Farmer); + farmerDevotion(Farmer); + farmerTrust(Farmer); + farmerLivingRules(Farmer); + farmerRestRules(Farmer); + farmerCashBonus(Farmer); + } } function farmerHealth(slave) { @@ -125,9 +127,9 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { const {he, his, himself, He} = getPronouns(slave); if (fetish === 1) { - return `${He} isn't above sampling the merchandise ${himself}; before long it's obvious to ${his} workers that ${he} <span class="lightcoral">really likes fucking them.</span> `; + return `${He} isn't above sampling the merchandise ${himself}; before long it's obvious to ${his} workers that ${he} <span class="fetish gain">really likes fucking them.</span> `; } else if (fetish === 2) { - return `${He}'s careful that all of the farmhands under ${his} supervision are all ready to work every morning, and ${he} <span class="lightsalmon">becomes more dominant.</span> `; + return `${He}'s careful that all of the farmhands under ${his} supervision are all ready to work every morning, and ${he} <span class="fetish inc">becomes more dominant.</span> `; } } @@ -139,13 +141,13 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { if (slave.skill.farmer <= 10) { r.push(`Though ${slave.slaveName} does ${his} best to manage the farmyard, with ${his} lack of skill ${he} can do little.`); } else if (slave.skill.farmer <= 30) { - r.push(`${slave.slaveName}'s basic skills marginally <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`); + r.push(`${slave.slaveName}'s basic skills marginally <span class="cash">improve</span> business at ${V.farmyardName}.`); } else if (slave.skill.farmer <= 60) { - r.push(`${slave.slaveName}'s skills <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`); + r.push(`${slave.slaveName}'s skills <span class="cash">improve</span> business at ${V.farmyardName}.`); } else if (slave.skill.farmer < 100) { - r.push(`${slave.slaveName}'s skills greatly <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`); + r.push(`${slave.slaveName}'s skills greatly <span class="cash">improve</span> business at ${V.farmyardName}.`); } else { - r.push(`${slave.slaveName}'s mastery immensely <span class="yellowgreen">improves</span> business at ${V.farmyardName}.`); + r.push(`${slave.slaveName}'s mastery immensely <span class="cash">improves</span> business at ${V.farmyardName}.`); } if (slave.actualAge > 35) { @@ -217,9 +219,9 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { let seed = V.farmyardShowgirls ? App.Facilities.Farmyard.farmShowsIncome(slave) : jsRandom(1, 10) * (jsRandom(150, 170) + (farmerBonus * 10)); if (V.farmyardShows && !V.farmyardShowgirls) { - r.push(`<p class="indent">Since ${he} doesn't have enough showgirls to entertain your arcology's citizens, ${he} puts on shows with your animals on ${his} own, earning <span class="yellowgreen">${cashFormat(seed)}.</span></p>`); + r.push(`<p class="indent">Since ${he} doesn't have enough showgirls to entertain your arcology's citizens, ${he} puts on shows with your animals on ${his} own, earning <span class="cash">${cashFormat(seed)}.</span></p>`); } else if (!V.farmyardFarmers) { - r.push(`<p class="indent">Since ${V.farmyardName} doesn't have anyone tending to the crops, ${he} looks after them ${himself}, earning <span class="yellowgreen">${cashFormat(seed)}.</span></p>`); + r.push(`<p class="indent">Since ${V.farmyardName} doesn't have anyone tending to the crops, ${he} looks after them ${himself}, earning <span class="cash">${cashFormat(seed)}.</span></p>`); } return r; @@ -257,7 +259,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { if (V.showEWD) { const farmerEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(farmerEntry, Farmer); - App.SlaveAssignment.appendSlaveLinks(farmerEntry, slave); + App.SlaveAssignment.appendSlaveLinks(farmerEntry, Farmer); $(farmerEntry).append(`<span class="slave-name">${SlaveFullName(Farmer)}</span> is serving as the Farmer.`); farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer, false)); } else { @@ -270,7 +272,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { - // MARK: Farmhands + // Farmhands function farmhandCount(count) { return `<strong>There ${count > 1 ? `are ${count} farmhands` : `is one farmhand`} working out of ${V.farmyardName}.</strong>`; @@ -278,7 +280,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { function farmhandLivingRules(slave) { switch (V.farmyardDecoration) { - case 'Degradation': + case 'Degradationist': case 'standard': slave.rules.living = 'spare'; break; @@ -383,7 +385,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { - // MARK: Menials + // Menials if (V.farmMenials) { let farmMenialProductivity = 9; @@ -409,7 +411,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { - // MARK: Farmyard + // Farmyard function farmyardStatsRecords() { const f = V.facility.farmyard; @@ -448,11 +450,11 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { r.push(`${farmyardNameCaps}'s customer's enjoyed`); if (V.seeBestiality && V.policies.bestialityOpenness && (V.canine || V.hooved || V.feline)) { - r.push(`<span class="green">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`); + r.push(`<span class="reputation inc">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`); } else if (V.farmyardShows) { - r.push(`<span class="green">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`); + r.push(`<span class="reputation inc">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`); } else { - r.push(`<span class="green">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`); + r.push(`<span class="reputation inc">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`); } $(decorationEffects).append(r.join(' ')); @@ -473,7 +475,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { r.push(farmyardNameCaps); if (profit) { - r.push(`makes you <span class="yellowgreen">${cashFormat(Math.trunc(profit))}</span>`); + r.push(`makes you <span class="cash">${cashFormat(Math.trunc(profit))}</span>`); } if (V.foodMarket) { @@ -490,7 +492,6 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { return $(profitContent).append(r.join(' ')); } - // FIXME: no idea what I'm doing here const statsSpan = document.createElement("span"); farmyardStatsRecords(); diff --git a/src/events/RE/reNickname.js b/src/events/RE/reNickname.js index 8dff51b9311c1d3b6a97121de148d83e9a51fa46..5db2cfcb7fe0afd3166af8c274b557918ccffb5b 100644 --- a/src/events/RE/reNickname.js +++ b/src/events/RE/reNickname.js @@ -335,10 +335,10 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent { const r = []; const {nicknameArray, situationDesc, applyDesc, notApplyDesc} = _this.data(slave, seed); let nickname = either(...nicknameArray); - const catEl = App.UI.DOM.makeElement("div", selectCategory(V.cheatMode)); + const catEl = App.UI.DOM.makeElement("div", selectCategory(V.debugMode > 0 && V.debugModeEventSelection > 0)); r.push(catEl); r.push(App.UI.DOM.slaveDescriptionDialog(slave), situationDesc); - const nickEl = App.UI.DOM.makeElement("span", selectNickname(V.cheatMode)); + const nickEl = App.UI.DOM.makeElement("span", selectNickname(V.debugMode > 0 && V.debugModeEventSelection > 0)); r.push(`You begin to overhear your other slaves refer to ${him} as`, nickEl); App.Events.addParagraph(el, r); diff --git a/src/events/RE/reRelativeRecruiter.js b/src/events/RE/reRelativeRecruiter.js index 340d7aaeb9305fd083d4f63a3ccf9ff2a21fbf00..bbf5c1a9e6e0a28e23277a0c1ecc7e5240277df0 100644 --- a/src/events/RE/reRelativeRecruiter.js +++ b/src/events/RE/reRelativeRecruiter.js @@ -172,7 +172,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba let _this = this; // fuck javascript's half-assed classes let cost = 0; // will be filled out later - let cheatDiv = App.UI.DOM.makeElement("div", (V.cheatMode === 1) ? cheatModeSelectors() : ''); + let cheatDiv = App.UI.DOM.makeElement("div", (V.debugMode > 0 && V.debugModeEventSelection > 0) ? cheatModeSelectors() : ''); node.appendChild(cheatDiv); let eventTextDiv = App.UI.DOM.makeElement("div", eventText()); diff --git a/src/events/RE/reRoyalBlood.js b/src/events/RE/reRoyalBlood.js index 775ab9641a222d49a4a9d5d33a03a5256885b59c..f647a70bfe6aa814557b61e0742b32e32a8d14c9 100644 --- a/src/events/RE/reRoyalBlood.js +++ b/src/events/RE/reRoyalBlood.js @@ -1,7 +1,7 @@ App.Events.RERoyalBlood = class RERoyalBlood extends App.Events.BaseEvent { eventPrerequisites() { return [ - () => (V.rep - 10000 > random(1, 12500) || V.cheatMode !== 0) + () => ((V.rep - 10000 > random(1, 12500)) || (V.debugMode > 0 && V.debugModeEventSelection > 0)) ]; } diff --git a/src/events/legacy/RECI.tw b/src/events/legacy/RECI.tw index 86254cbb1751f59e88f8c4ed55416342a0091c08..6a8f1360c601d2aac042e354ab440b3abab499f0 100644 --- a/src/events/legacy/RECI.tw +++ b/src/events/legacy/RECI.tw @@ -27,7 +27,7 @@ <<if Array.isArray($RECIevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random check-in event would have been selected from the following:'' <br> @@ -83,7 +83,7 @@ <br>ERROR: bad RECI event $RECIevent <</switch>> -<<if $cheatMode == 1>> +<<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/events/legacy/REFI.tw b/src/events/legacy/REFI.tw index 9c1c5341c73717d282f91b5ce9b25d8dcd39232b..ee7edebe8298df89f329fc94818f58c468880baf 100644 --- a/src/events/legacy/REFI.tw +++ b/src/events/legacy/REFI.tw @@ -25,7 +25,7 @@ <<if Array.isArray($REFIevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random fetish interest event would have been selected from the following:'' <br> @@ -43,7 +43,7 @@ <<set $nextButton = "Continue", $nextLink = "AS Dump", $returnTo = "RIE Eligibility Check">> <span id="result"> -<<if $cheatMode == 1>> +<<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/events/legacy/RETS.tw b/src/events/legacy/RETS.tw index d72dea312921662a38205799a31126cb9cc7e5b4..eed6401c9cf1be515af691c24f3cb0307a07f80b 100644 --- a/src/events/legacy/RETS.tw +++ b/src/events/legacy/RETS.tw @@ -27,7 +27,7 @@ <<if Array.isArray($RETSevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random two slave event would have been selected from the following:'' <br> @@ -47,7 +47,7 @@ <br><br> <span id="result"> -<<if $cheatMode == 1>> +<<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/events/nonRandomEvent.js b/src/events/nonRandomEvent.js index 7f4d2661dc738f2dc49ab40d0de42b7449c8363d..279e9a13162f9ecbaf085876489a60d7e8a130b7 100644 --- a/src/events/nonRandomEvent.js +++ b/src/events/nonRandomEvent.js @@ -155,7 +155,7 @@ App.Events.playNonrandomEvent = function() { V.event.execute(d); V.passageSwitchHandler = clearEvent; } else { - if (V.cheatMode) { + if (V.debugMode > 0 && V.debugModeEventSelection) { V.nextButton = "Refresh"; // show all the scheduled, nonrandom, and queued events, and allow the cheater to play them in any order and skip the remainder App.UI.DOM.appendNewElement("h2", d, "Scheduled and Nonrandom Events"); diff --git a/src/events/reRecruit.js b/src/events/reRecruit.js index 7fa8670531e6eb57689a5cc454e85becdaa6d9ae..85b20f5e756dc3faaf49a08ad2135d1dd7b8ad92 100644 --- a/src/events/reRecruit.js +++ b/src/events/reRecruit.js @@ -82,21 +82,21 @@ App.Events.RERecruit = class RERecruit extends App.Events.BaseEvent { get weight() { let weight = 1; // one generic recruit event guaranteed to always be possible - if ((random(1, 100) < V.rep/200) || V.cheatMode) { + if ((random(1, 100) < V.rep/200) || (V.debugMode && V.debugModeEventSelection)) { weight++; } if (V.policies.proRecruitment === 1) { - if ((random(1, 100) < V.rep/200) || V.cheatMode) { + if ((random(1, 100) < V.rep/200) || (V.debugMode && V.debugModeEventSelection)) { weight++; } } if (V.policies.enslavementRep !== -1) { - if ((random(1, 100) < V.rep/300) || V.cheatMode) { + if ((random(1, 100) < V.rep/300) || (V.debugMode && V.debugModeEventSelection)) { weight++; } } if (V.policies.enslavementCash !== -1) { - if ((random(1, 100) < V.rep/300) || V.cheatMode) { + if ((random(1, 100) < V.rep/300) || (V.debugMode && V.debugModeEventSelection)) { weight++; } } @@ -110,7 +110,7 @@ App.Events.RERecruit = class RERecruit extends App.Events.BaseEvent { execute(node) { V.encyclopedia = "Enslaving People"; V.nextLink = "RIE Eligibility Check"; - if (V.cheatMode) { + if (V.debugMode && V.debugModeEventSelection) { const el = App.UI.DOM.appendNewElement("span", node); App.UI.DOM.appendNewElement("span", el, `One of the following recruitment events would have appeared: `); const select = App.UI.DOM.appendNewElement("select", el); diff --git a/src/events/reRecruit/cleaningHouse.js b/src/events/reRecruit/cleaningHouse.js index 3f118cb986e6466fc8e804a4ecfa2f7c2110c22a..74b9e574efd204e1b5c646e5e151c515d6f0d2b0 100644 --- a/src/events/reRecruit/cleaningHouse.js +++ b/src/events/reRecruit/cleaningHouse.js @@ -8,7 +8,7 @@ App.Events.recCleaningHouse = class recCleaningHouse extends App.Events.BaseEven () => V.seeDicks !== 100, () => V.seePreg !== 0, () => V.rep > 16000, - () => (random(1, 100) < V.rep/1000) || V.cheatMode === 1, + () => (random(1, 100) < V.rep/1000) || (V.debugMode > 0 && V.debugModeEventSelection > 0), () => V.cash >= 50000 ]; } diff --git a/src/events/reRecruit/embryoAppropriation.js b/src/events/reRecruit/embryoAppropriation.js index bd84aa19653a09cd0243af36cc7d1bb829fcbef3..8c3fcecd1e6a8a72ecfeff1afac2e9d8e7f1318a 100644 --- a/src/events/reRecruit/embryoAppropriation.js +++ b/src/events/reRecruit/embryoAppropriation.js @@ -7,7 +7,7 @@ App.Events.recEmbryoAppropriation = class recEmbryoAppropriation extends App.Eve return [ () => V.seeDicks !== 100, () => V.seePreg !== 0, - () => (V.PC.skill.medicine > 50 && V.PC.skill.hacking > 75 && (random(0, 100) > 75 || V.cheatMode === 1)), + () => (V.PC.skill.medicine > 50 && V.PC.skill.hacking > 75 && (random(0, 100) > 75 || (V.debugMode > 0 && V.debugModeEventSelection > 0))), ]; } diff --git a/src/events/reRecruit/forbiddenLove.js b/src/events/reRecruit/forbiddenLove.js index eb40a4e5ac0af8736312f10c52a90477526ac0be..eaf87801e40be1492ba8b22d1dde979cd0b29adc 100644 --- a/src/events/reRecruit/forbiddenLove.js +++ b/src/events/reRecruit/forbiddenLove.js @@ -7,7 +7,7 @@ App.Events.recForbiddenLove = class recForbiddenLove extends App.Events.BaseEven return [ () => V.seeDicks !== 0, () => V.rep > 16000, - () => (random(1, 100) < V.rep/1000) || V.cheatMode === 1, + () => (random(1, 100) < V.rep/1000) || (V.debugMode > 0 && V.debugModeEventSelection > 0), () => V.cash >= 100000 ]; } diff --git a/src/events/reRecruit/handsomePC.js b/src/events/reRecruit/handsomePC.js index f95046967625778ea520b6ab63cb92b935f0ba3f..5262e01542ef9aad784ab5d2548fca3c79a70bd6 100644 --- a/src/events/reRecruit/handsomePC.js +++ b/src/events/reRecruit/handsomePC.js @@ -9,7 +9,7 @@ App.Events.recHandsomePC = class recHandsomePC extends App.Events.BaseEvent { () => V.PC.vagina === -1, () => V.PC.boobs < 300, () => V.PC.title === 1, - () => (V.rep/250) > (random(1, 100) || V.cheatMode === 1), + () => (V.rep/250) > (random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)), ]; } diff --git a/src/events/reRecruit/heldPOW.js b/src/events/reRecruit/heldPOW.js index a4231e122e28de46bde1158f1b86f68b0980ab1a..abb79b2fb4a51f98055537ba68e4da4ebf9d91a1 100644 --- a/src/events/reRecruit/heldPOW.js +++ b/src/events/reRecruit/heldPOW.js @@ -6,7 +6,7 @@ App.Events.recHeldPOW = class recHeldPOW extends App.Events.BaseEvent { eventPrerequisites() { return [ () => V.seeDicks !== 100, - () => (V.PC.skill.hacking >= 50 && (random(0, 100) < V.PC.skill.hacking) || V.cheatMode === 1), + () => (V.PC.skill.hacking >= 50 && (random(0, 100) < V.PC.skill.hacking) || (V.debugMode > 0 && V.debugModeEventSelection > 0)), ]; } diff --git a/src/events/reRecruit/homelessBreakIn.js b/src/events/reRecruit/homelessBreakIn.js index 69ef3aedc90a0a1e5bcde5b99e52fcf1001887a8..b9156e6cd1c3fb78793c6073723546c0f49fe7a3 100644 --- a/src/events/reRecruit/homelessBreakIn.js +++ b/src/events/reRecruit/homelessBreakIn.js @@ -6,7 +6,7 @@ App.Events.recHomelessBreakIn = class recHomelessBreakIn extends App.Events.Base eventPrerequisites() { return [ () => V.week > 46, - () => ((V.rep/100) > random(1, 100)) || V.cheatMode === 1 + () => ((V.rep/100) > random(1, 100)) || (V.debugMode > 0 && V.debugModeEventSelection > 0) ]; } diff --git a/src/events/reRecruit/immigrant.js b/src/events/reRecruit/immigrant.js index 11c2fb5d24a50a434389f6507e817305bd390a73..1177933fe66a7fe90db7cbfdb2230df9227c7f4e 100644 --- a/src/events/reRecruit/immigrant.js +++ b/src/events/reRecruit/immigrant.js @@ -5,7 +5,7 @@ App.Events.recImmigrant = class recImmigrant extends App.Events.BaseEvent { eventPrerequisites() { return [ - () => ((V.rep/250) > (random(1, 100) || V.cheatMode === 1)) + () => ((V.rep/250) > (random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0))) ]; } diff --git a/src/events/reRecruit/overwhelmedFarmgirl.js b/src/events/reRecruit/overwhelmedFarmgirl.js index 1f99b38648b9892efbd0a908d16e2743c3b96f05..7c1705b5e02eea4de8232a7b9f237c1c42a74e1f 100644 --- a/src/events/reRecruit/overwhelmedFarmgirl.js +++ b/src/events/reRecruit/overwhelmedFarmgirl.js @@ -8,7 +8,7 @@ App.Events.recOverwhelmedFarmgirl = class recOverwhelmedFarmgirl extends App.Eve () => V.seeDicks !== 100, () => V.seePreg !== 0, () => V.seeHyperPreg === 1, - () => V.cheatMode === 1, + () => (V.debugMode > 0 && V.debugModeEventSelection > 0), ]; } diff --git a/src/events/reRecruit/princelyBetrayal.js b/src/events/reRecruit/princelyBetrayal.js index 138929b260816a4b885f9c0e93593b226d77216b..d5377e9904cae7eaf85f1bc4f4f763d43fc60428 100644 --- a/src/events/reRecruit/princelyBetrayal.js +++ b/src/events/reRecruit/princelyBetrayal.js @@ -7,7 +7,7 @@ App.Events.recPrincelyBetrayal = class recPrincelyBetrayal extends App.Events.Ba return [ () => V.seeDicks !== 0, () => V.rep > 16000, - () => ((random(1, 100) < V.rep/1000) || V.cheatMode === 1), + () => ((random(1, 100) < V.rep/1000) || (V.debugMode > 0 && V.debugModeEventSelection > 0)), () => V.cash >= 100000 ]; } diff --git a/src/events/reRecruit/rogueCyborg.js b/src/events/reRecruit/rogueCyborg.js index 6c6eb054d48bc17f0d61b4deb7cd754bdf5159bd..386e0ff53794895a012e8f8e959fffbdb7efb115 100644 --- a/src/events/reRecruit/rogueCyborg.js +++ b/src/events/reRecruit/rogueCyborg.js @@ -7,7 +7,7 @@ App.Events.recRogueCyborg = class recRogueCyborg extends App.Events.BaseEvent { return [ () => V.seeDicks !== 100, () => V.PC.skill.hacking >= 100, - () => (random(0, 100) > 95 || V.cheatMode === 1), + () => (random(0, 100) > 95 || (V.debugMode > 0 && V.debugModeEventSelection > 0)), () => V.cash >= 100000 ]; } diff --git a/src/events/reRecruit/shemalePC.js b/src/events/reRecruit/shemalePC.js index e97f242293798b7846ca64a70f3a8c081b6b9bf7..5bb69ea45a0c51ffe0eb9f55d7fdff15e984a260 100644 --- a/src/events/reRecruit/shemalePC.js +++ b/src/events/reRecruit/shemalePC.js @@ -7,7 +7,7 @@ App.Events.recShemalePC = class recShemalePC extends App.Events.BaseEvent { return [ () => V.PC.dick !== 0, () => V.PC.boobs >= 300, - () => (V.rep/250) > (random(1, 100) || V.cheatMode === 1), + () => (V.rep/250) > (random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)), ]; } diff --git a/src/events/reRecruit/starvingMigrant.js b/src/events/reRecruit/starvingMigrant.js index 0f27f265d7fcb572b7797f696b857a234ee08f17..a2f5360e3de23f7e341260cf367e92b468361c17 100644 --- a/src/events/reRecruit/starvingMigrant.js +++ b/src/events/reRecruit/starvingMigrant.js @@ -6,7 +6,7 @@ App.Events.recStarvingMigrant = class recStarvingMigrant extends App.Events.Base eventPrerequisites() { return [ () => V.week > 46, - () => ((V.rep/100) > (random(1, 100)) || V.cheatMode === 1) + () => ((V.rep/100) > (random(1, 100)) || (V.debugMode > 0 && V.debugModeEventSelection > 0)) ]; } diff --git a/src/events/reRecruit/wanderingHomeless.js b/src/events/reRecruit/wanderingHomeless.js index 08a67b93fe7d93b982cfd8d78ec6d4cbaed078ae..6111929fd58f8596a06d5281c54e33a5caeb44fe 100644 --- a/src/events/reRecruit/wanderingHomeless.js +++ b/src/events/reRecruit/wanderingHomeless.js @@ -7,7 +7,7 @@ App.Events.recWanderingHomeless = class recWanderingHomeless extends App.Events. return [ () => V.seeDicks !== 100, () => V.seePreg !== 0, - () => (random(1, 1000) < 5) || V.cheatMode === 1, + () => (random(1, 1000) < 5) || (V.debugMode > 0 && V.debugModeEventSelection > 0), ]; } diff --git a/src/events/reRecruit/womanlyPC.js b/src/events/reRecruit/womanlyPC.js index 13fcf8e2e19ff0d51cb58cd957818279c4220c59..697f34190040da0c34705949965c9460fd33ceb5 100644 --- a/src/events/reRecruit/womanlyPC.js +++ b/src/events/reRecruit/womanlyPC.js @@ -8,7 +8,7 @@ App.Events.recWomanlyPC = class recWomanlyPC extends App.Events.BaseEvent { () => V.PC.dick === 0, () => V.PC.boobs >= 300, () => V.PC.title === 0, - () => (V.rep/250) > (random(1, 100) || V.cheatMode === 1), + () => (V.rep/250) > (random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)), ]; } diff --git a/src/facilities/arcade/arcadeFramework.js b/src/facilities/arcade/arcadeFramework.js index 1aefdf6abbc4cb49c2f70ef11627d932c80300c5..4093d972395e50c7181ea436ee24ac4f157c2aff 100644 --- a/src/facilities/arcade/arcadeFramework.js +++ b/src/facilities/arcade/arcadeFramework.js @@ -10,7 +10,8 @@ App.Data.Facilities.arcade = { }, }, defaultJob: "assignee", - manager: null + manager: null, + decorated: true }; App.Entity.Facilities.ArcadeJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/armory/armoryFramework.js b/src/facilities/armory/armoryFramework.js index c2a595acecf80bdf0230b4a64636faa1bc82ca73..9e8adb220d52853e8477d91232ba6396217dc7d1 100644 --- a/src/facilities/armory/armoryFramework.js +++ b/src/facilities/armory/armoryFramework.js @@ -19,7 +19,8 @@ App.Data.Facilities.armory = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.facilities.armory = new App.Entity.Facilities.Facility(App.Data.Facilities.armory); diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js index f6dfc9e01f3198437539074db6023a42a43dacaf..7cb155dd010df61ea9ddf0dfcc040d25904b2fc9 100644 --- a/src/facilities/bodyModification/bodyModification.js +++ b/src/facilities/bodyModification/bodyModification.js @@ -856,6 +856,7 @@ App.UI.bodyModification = function(slave, cheat = false) { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("h2", el, "Scars"); let r = []; + const bodyPartData = App.Data.Slave.body.get(V.scarTarget.local); for (const _scarName in slave.scar) { const scarDiv = document.createElement("div"); @@ -884,10 +885,7 @@ App.UI.bodyModification = function(slave, cheat = false) { r = []; if (["exotic", "menacing"].includes(V.scarDesign.local) && !V.scarTarget.local.endsWith("cheek")) { r.push(`"${capFirstChar(V.scarDesign.local)}" scars can only be applied to cheeks.`); - } else if ( - App.Data.Slave.body.has(V.scarTarget.local) && - App.Data.Slave.body.get(V.scarTarget.local).isPair - ) { + } else if (bodyPartData && bodyPartData.isPair) { r.push(`Choose a side to scar.`); } else { if (slave.scar.hasOwnProperty(V.scarTarget.local)) { @@ -951,6 +949,7 @@ App.UI.bodyModification = function(slave, cheat = false) { const el = new DocumentFragment(); let p = document.createElement('p'); let div = document.createElement('div'); + const bodyPartData = App.Data.Slave.body.get(V.brandTarget.local); App.UI.DOM.appendNewElement("h2", el, "Branding"); @@ -999,10 +998,7 @@ App.UI.bodyModification = function(slave, cheat = false) { if (slave.brand[V.brandTarget.local] === V.brandDesign.local) { p.append(`${He} already has ${V.brandDesign.local} on ${his} ${V.brandTarget.local}.`); - } else if ( - App.Data.Slave.body.has(V.brandTarget.local) && - App.Data.Slave.body.get(V.brandTarget.local).isPair - ) { + } else if (bodyPartData && bodyPartData.isPair) { p.append(`Choose a side to brand.`); } else { p.append( @@ -1107,11 +1103,8 @@ App.UI.brandSelect = function(category, slave, cheat = false) { App.UI.bodyPartSelector(V.brandTarget, "primary", true) ); const bodyPartRoot = App.UI.bodyPartRoot(V.brandTarget.primary); - if ( - App.Data.Slave.body.has(bodyPartRoot) && - !App.Data.Slave.body.get(bodyPartRoot).isPair && - (App.Data.Slave.body.get(bodyPartRoot)).hasOwnProperty("requirements") - ) { + const bodyPartData = App.Data.Slave.body.get(bodyPartRoot); + if (bodyPartData && (bodyPartData).hasOwnProperty("requirements")) { r.push(`It's possible that <strong>${V.brandTarget.primary}</strong> may be missing from a slave. Choose a fallback in case it is not available: Current backup is <strong>${V.brandTarget.secondary}</strong>:`); App.Events.addNode(el, r, "div"); r = []; @@ -1221,11 +1214,8 @@ App.UI.scarSelect = function(category, slave, cheat = false) { App.UI.bodyPartSelector(V.scarTarget, "primary", true) ); const bodyPartRoot = App.UI.bodyPartRoot(V.scarTarget.primary); - if ( - App.Data.Slave.body.has(bodyPartRoot) && - !App.Data.Slave.body.get(bodyPartRoot).isPair && - (App.Data.Slave.body.get(bodyPartRoot)).hasOwnProperty("requirements") - ) { + const bodyPartData = App.Data.Slave.body.get(bodyPartRoot); + if (bodyPartData && bodyPartData.hasOwnProperty("requirements")) { r.push(`It's possible that <strong>${V.scarTarget.primary}</strong> may be missing from a slave. Choose a fallback in case it is not available: Current backup is <strong>${V.scarTarget.secondary}</strong>:`); App.Events.addNode(el, r, "div"); r = []; @@ -1279,10 +1269,8 @@ App.UI.bodyPartSelector = function(variable, property, selector) { } // Choose a side - if ( - App.Data.Slave.body.has(variable[property]) && - App.Data.Slave.body.get(variable[property]).isPair - ) { + const bodyPartData = App.Data.Slave.body.get(variable[property]); + if (bodyPartData && bodyPartData.isPair) { const linkArray = []; for (const side of ["left", "right"]) { linkArray.push(App.UI.DOM.link(capFirstChar(side), () => { diff --git a/src/facilities/brothel/brothelFramework.js b/src/facilities/brothel/brothelFramework.js index 1230827d0d541a6de0c078b0056317913dcb87b1..394381ad87e8e52292525ef29efdf12c8f9d8d26 100644 --- a/src/facilities/brothel/brothelFramework.js +++ b/src/facilities/brothel/brothelFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.brothel = { shouldTalk: true, shouldThink: true, requiredDevotion: 50 - } + }, + decorated: true }; App.Entity.Facilities.BrothelJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/cellblock/WardenessSelect.js b/src/facilities/cellblock/WardenessSelect.js index ab9b749520f639806bb2db72f841b5958d28ba8e..b9dfea914f6dada4b993c7ab2a302fed9c2d865a 100644 --- a/src/facilities/cellblock/WardenessSelect.js +++ b/src/facilities/cellblock/WardenessSelect.js @@ -4,7 +4,7 @@ App.Facilities.WardenessSelect = function() { if (S.Wardeness) { f.append(`Wardeness: ${SlaveFullName(S.Wardeness)}, helps breaking your prisoners. `); f.append(App.UI.DOM.link("Remove Wardeness", () => { - removeJob(S.Wardeness, Job.WARDENESS); + removeJob(S.Wardeness, Job.WARDEN); }, [], "Cellblock" )); diff --git a/src/facilities/cellblock/cellblockFramework.js b/src/facilities/cellblock/cellblockFramework.js index 627cf6d90468e0587ff5d3d963e1f954b8109952..4c3edfa4186f730e4eadb2aad9138fd7092d669f 100644 --- a/src/facilities/cellblock/cellblockFramework.js +++ b/src/facilities/cellblock/cellblockFramework.js @@ -25,8 +25,8 @@ App.Data.Facilities.cellblock = { shouldTalk: false, shouldThink: false, requiredDevotion: 51 - - } + }, + decorated: false }; App.Entity.Facilities.CellblockJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/clinic/clinicFramework.js b/src/facilities/clinic/clinicFramework.js index 23dd472c60def174c852bae283bbe3f97835d0db..dbdde301ccfaae7ce7f3ad2f810862a83a48e022 100644 --- a/src/facilities/clinic/clinicFramework.js +++ b/src/facilities/clinic/clinicFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.clinic = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ClinicPatientJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/club/clubFramework.js b/src/facilities/club/clubFramework.js index e34db004dfcebbd2ca273ba0be575a48ed1fb8f8..19bb8d05833876586882ba767e0f60968580b8a6 100644 --- a/src/facilities/club/clubFramework.js +++ b/src/facilities/club/clubFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.club = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ClubSlutJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/dairy/dairyFramework.js b/src/facilities/dairy/dairyFramework.js index 36515b4243a65a91a71839a295f421b29e24bb6c..3c3b1db0d8054ae929590e721fe46151f87aa6c8 100644 --- a/src/facilities/dairy/dairyFramework.js +++ b/src/facilities/dairy/dairyFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.dairy = { shouldTalk: false, shouldThink: true, requiredDevotion: 21 - } + }, + decorated: true }; App.Entity.Facilities.DairyCowJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/farmyard/farmyardFramework.js b/src/facilities/farmyard/farmyardFramework.js index b79c787e6c8c1c5e224dbe567e50bc4b5ec5d4c1..399caad3194f222d414b4d7d0866f8bc75f9375a 100644 --- a/src/facilities/farmyard/farmyardFramework.js +++ b/src/facilities/farmyard/farmyardFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.farmyard = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.FarmHandJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/headGirlSuite/headGirlSuiteFramework.js b/src/facilities/headGirlSuite/headGirlSuiteFramework.js index cfc1d1c3e3c05660d37be15d75ccac12c44abe74..ae9d465fd8b0f4adcd058cbb7f45e03c076500d2 100644 --- a/src/facilities/headGirlSuite/headGirlSuiteFramework.js +++ b/src/facilities/headGirlSuite/headGirlSuiteFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.headGirlSuite = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.Facilities.HeadGirlSuite = class extends App.Entity.Facilities.SingleJobFacility { diff --git a/src/facilities/incubator/incubatorFramework.js b/src/facilities/incubator/incubatorFramework.js index 22d9d4bae2006f146dd16321fd9f202ea6aa6669..dce45c6cd6c235338f01d2d59d97953f0ded7dcb 100644 --- a/src/facilities/incubator/incubatorFramework.js +++ b/src/facilities/incubator/incubatorFramework.js @@ -10,7 +10,8 @@ App.Data.Facilities.incubator = { } }, defaultJob: "tank", - manager: null + manager: null, + decorated: false }; App.Entity.Facilities.IncubatorTankJob = class extends App.Entity.Facilities.Job { diff --git a/src/facilities/masterSuite/masterSuiteFramework.js b/src/facilities/masterSuite/masterSuiteFramework.js index cdcc7d5f28a3333deb02e45c2f636ded2d546429..83e67a773242e968831fc29ed8c173bd852b533e 100644 --- a/src/facilities/masterSuite/masterSuiteFramework.js +++ b/src/facilities/masterSuite/masterSuiteFramework.js @@ -26,7 +26,8 @@ App.Data.Facilities.masterSuite = { shouldTalk: false, shouldThink: false, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.MasterSuiteFuckToyJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/nursery/nurseryFramework.js b/src/facilities/nursery/nurseryFramework.js index daa83f65ceeb4065faef20f304a1e19b84844514..94597390d5e89097835c89ea7548d6fcbb570ac2 100644 --- a/src/facilities/nursery/nurseryFramework.js +++ b/src/facilities/nursery/nurseryFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.nursery = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.NurseryNannyJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/penthouse/penthouseFramework.js b/src/facilities/penthouse/penthouseFramework.js index b7fa25023b6df5cad44b3e2a6d57d542319290f7..de971b63f50cb9e1eaa743077cec05aaf0c481ae 100644 --- a/src/facilities/penthouse/penthouseFramework.js +++ b/src/facilities/penthouse/penthouseFramework.js @@ -85,7 +85,8 @@ App.Data.Facilities.penthouse = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.Facilities.PenthouseJobs = { diff --git a/src/facilities/pit/pitFramework.js b/src/facilities/pit/pitFramework.js index 88c32bb2f2f30e36a1988674701b6e0ca07fd647..9401caf98b6190bcd06014cbbe54350956456467 100644 --- a/src/facilities/pit/pitFramework.js +++ b/src/facilities/pit/pitFramework.js @@ -11,7 +11,8 @@ App.Data.Facilities.pit = { } }, defaultJob: "fighter", - manager: null + manager: null, + decorated: false }; App.Entity.Facilities.PitFighterJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index 50d64781d12252d8674937bd4f9ac27b2f0b348a..c6d257eb7c3561b331f86f9bd422a48b5ea856dc 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -99,7 +99,7 @@ App.UI.salon = function(slave, cheat = false) { } el.append(options.render()); - el.append(App.Medicine.Salon.ears(slave)); + el.append(App.Medicine.Salon.ears(slave, cheat)); return el; } @@ -515,6 +515,8 @@ App.UI.salon = function(slave, cheat = false) { } el.append(options.render()); + + el.append(App.Medicine.Salon.tail(slave, cheat)); return el; } diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js index 2770017ce38892cba7f962c7c118b51b94a345cd..0c22037161a18f55bd44bea535b338322133af54 100644 --- a/src/facilities/schoolroom/schoolroomFramework.js +++ b/src/facilities/schoolroom/schoolroomFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.schoolroom = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.SchoolroomStudentJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/servantsQuarters/servantsQuartersFramework.js b/src/facilities/servantsQuarters/servantsQuartersFramework.js index e908720753a47c470b97dd722a3e1bee70473b33..48a10fbb637c1ea7cb5dd3ff5306cc5618fabbc0 100644 --- a/src/facilities/servantsQuarters/servantsQuartersFramework.js +++ b/src/facilities/servantsQuarters/servantsQuartersFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.servantsQuarters = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ServantsQuartersServantJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/spa/spaFramework.js b/src/facilities/spa/spaFramework.js index 02d9f7f0e8f410739a3cc5c44c033bd16a1d9ee0..95012872750b1a9f1bd59dcdcf13595504f43099 100644 --- a/src/facilities/spa/spaFramework.js +++ b/src/facilities/spa/spaFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.spa = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.SpaAssigneeJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/futureSocieties/fsDecoration.js b/src/futureSocieties/fsDecoration.js index e55d8887e3cc72fe0057768c2ce798463f60f247..9547267c3e33721f2da7da5748a372369fb4455f 100644 --- a/src/futureSocieties/fsDecoration.js +++ b/src/futureSocieties/fsDecoration.js @@ -11,20 +11,7 @@ App.UI.facilityRedecoration = function() { const applicableFS = FutureSocieties.activeFSes(arc).filter(name => (arc[name] > 20)); const decorationNames = Array.from(applicableFS, FS => FutureSocieties.decorationName(FS)).filter(Boolean); - const activeFacilities = [ - App.Entity.facilities.brothel, - App.Entity.facilities.club, - App.Entity.facilities.dairy, - App.Entity.facilities.farmyard, - App.Entity.facilities.spa, - App.Entity.facilities.nursery, - App.Entity.facilities.clinic, - App.Entity.facilities.schoolroom, - App.Entity.facilities.cellblock, - App.Entity.facilities.servantsQuarters, - App.Entity.facilities.arcade, - App.Entity.facilities.masterSuite - ].filter(f => f.established); + const activeFacilities = Object.values(App.Entity.facilities).filter(f => f.isDecorated && f.established); // dummy variable to make sure the first option is selected by default const currentSelected = {value: "none"}; @@ -64,7 +51,7 @@ App.UI.facilityRedecoration = function() { }).pulldown(); for (const facility of activeFacilities) { - options.addOption(`The decoration style of ${facility.nameCaps} is`, "decoration", facility) + options.addOption(`The decoration style of ${facility.name} is`, "decoration", facility) .addValue("Standard", "standard") .addValueList(decorationNames) .addCallbackToEach(value => { diff --git a/src/futureSocieties/futureSociety.js b/src/futureSocieties/futureSociety.js index a170f1a7a5d4a14c9e69e067bdb90deed1aecb28..be020a5b19869e7ea5ce2a0a4e1f55e4e762ad51 100644 --- a/src/futureSocieties/futureSociety.js +++ b/src/futureSocieties/futureSociety.js @@ -406,18 +406,9 @@ globalThis.FutureSocieties = (function() { /* call as FutureSocieties.DecorationCleanup() */ function DecorationCleanup() { - ValidateFacilityDecoration(App.Entity.facilities.brothel); - ValidateFacilityDecoration(App.Entity.facilities.dairy); - ValidateFacilityDecoration(App.Entity.facilities.club); - ValidateFacilityDecoration(App.Entity.facilities.servantsQuarters); - ValidateFacilityDecoration(App.Entity.facilities.schoolroom); - ValidateFacilityDecoration(App.Entity.facilities.spa); - ValidateFacilityDecoration(App.Entity.facilities.clinic); - ValidateFacilityDecoration(App.Entity.facilities.arcade); - ValidateFacilityDecoration(App.Entity.facilities.cellblock); - ValidateFacilityDecoration(App.Entity.facilities.masterSuite); - ValidateFacilityDecoration(App.Entity.facilities.nursery); - ValidateFacilityDecoration(App.Entity.facilities.farmyard); + for (const facility of Object.values(App.Entity.facilities).filter(f => f.isDecorated)) { + ValidateFacilityDecoration(facility); + } } /** helper function, not callable externally diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index 8bec530a64d37e17818470fdcf6d9474fbbfb5be..edffac124be14157666322313a29a1dee2fa2dcb 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -51,168 +51,9 @@ $encyclopedia <br><<= App.Encyclopedia.Dialog.linkSC("Credits", "Credits")>> </div> -/********** -Design Your Master TODO unify with "Design Your Master" article -**********/ -<<case "Design Your Master in SecExp">> - This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options. - - <br><br>''Wealth'' is a choice for both the ''career background'' and ''rumored method of acquiring the arcology'' options. Both provide you with @@.yellowgreen;<<print cashFormat(10000)>>@@ each for a total of @@.yellowgreen;<<print cashFormat(30000)>>@@ if both are chosen. As a ''background option'' it means that your starting slaves will have two free levels of sex skills available and maintaining @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("authority", "Security Expansion")>>@@ will be harder, but upgrades in the propaganda hub will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@. - - <br><br>__Career background options__ - <br>Being an ex- - <br>''business owner'' (also referred to as capitalist) enhances the business-focused personal attention, increasing the @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ it produces and improving arcology prosperity when business-focused personal attention is selected. Also, upgrades in the propaganda hub will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@ and your starting slaves will have a free level of prostitution skill available. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Trading", "PC Skills")>>. - - <br><br>''private security contractor'' (also referred to as a //mercenary background//) greatly reduces the cost of keeping mercenaries in your employ. Upgrades in the security HQ will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>.@@ - Your starting slaves will have free @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ available. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Warfare", "PC Skills")>>. - - <br><br>''slave driver'' enhances slave-focused personal attention, adding bonus @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ or @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ to many training applications or preventing their loss. @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("Authority", "Security Expansion")>>@@ will be easier to maintain. Plus upgrades in the security HQ will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>.@@ - Starting slaves will be cheaper, in addition having already mastered <<= App.Encyclopedia.Dialog.linkSC("Slaving", "PC Skills")>>. - - <br><br>''arcology engineer'' provides a significant discount on many @@.yellowgreen;arcology upgrades and expansions.@@ In addition to the arcology starting off with @@.green;basic economic upgrades@@ already installed. Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Engineering", "PC Skills")>>. - - <br><br>''doctor'' allows the player character to perform surgery personally, providing a @@.yellowgreen;discount on surgery costs@@ and a @@.green;reduction to resulting health damage.@@ Additionally, slaves may react differently to surgery if the player character performs it and starting slaves will have free implants available. Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Medicine", "PC Skills")>>. - - <br><br>''escort'' provides a one-time bonus to a slave's entertainment, whoring, and two sexual skills when a new slave is acquired. Furthermore, society will not take lightly to being run by an ex-whore, and you will receive heavy @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ and @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("authority", "Security Expansion")>>@@ losses each week. You can spend your free time selling your body for @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>,@@ at the cost of a large amount of @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>.@@ - - <br><br>''celebrity'' provides extra @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ at game start and upgrades in the propaganda hub will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@. - Starting slaves will have a free level of entertainment skill available. - - <br><br>''servant'' provides a one-time bonus to a slave's @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ and @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>.@@ Furthermore, society will not approve of being run by an ex-servant, and you will face @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ and @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("authority", "Security Expansion")>>@@ losses each week. You can spend your free time, putting your previous experience to use, by greatly reducing the costs of your penthouse. You also passively reduce costs when not focusing on doing so. - - <br><br>''gang leader'' provides a one-time bonus to a slave's health and a free level of combat skill. Furthermore, society will not approve of being run by a gang-banger, and you will face @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ losses each week. New slaves will likely have heard of your previous exploits and fear you. - You know how to haggle slaves and assert your @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("authority", "Security Expansion")>>.@@ Plus upgrades in the security HQ will be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@. - You can spend your free time, putting your previous experience to use, proving another source of income however this isn't guaranteed. - - <br><br>''incursion specialist'' provides starting slaves with a free level of @@.cyan;intelligence.@@ Also certain upgrades may be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@ and you may find alternative approaches to problems, but you will find @@.darkviolet;<<= App.Encyclopedia.Dialog.linkSC("authority", "Security Expansion")>>@@ quite hard to maintain. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Hacking", "PC Skills")>>. - - <br><br> - <<= App.Encyclopedia.Dialog.linkSC("Hide SecExp details", "Design Your Master")>>. - - <br><br>__Rumored acquisition options__ - <br>''Hard Work'' provides a one-time bonus to both @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ when a new slave is acquired. - - <br><br>''Force'' means that if a slave does not have enough @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ to obey when acquired, this option will terrify her and reduce her @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ to the point where she should comply. - - <br><br>''Social Engineering'' means that you will start with the first societal option unlocked, since you manipulated the arcology's citizens. - - <br><br>''Luck'' provides extra @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ at game start, but no ongoing advantages once the main game begins. - - <br><br>__Age groups__ - <br>Older PCs enjoy easier @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ maintenance, but possess lower <<= App.Encyclopedia.Dialog.linkSC("sexual energy", "Sexual Energy")>> while younger PC's are the opposite. - - <br><br>__Body and gender options__ - <br>All PC body changes will alter scenes, but their main mechanical effect is on @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ maintenance. Feminine options will make it harder to maintain @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ without providing any gameplay advantage, making playing as a feminine PC a form of increased difficulty. There are other minor gameplay differences including differing slave reactions to the PC based on attraction, but these are fairly minor. - /********** BEING IN CHARGE **********/ -<<case "Being in Charge">> - //Future room for lore text// - - <br><br> - Choose a more particular entry below: - <br> - -<<case "Arcologies and Reputation">> - Arcologies are the urban buildings of the future: almost completely self-contained, almost completely self sufficient. In the anarcho-liberal 'paradise' of the Free Cities, as owner of your own arcology you are like a modern-day feudal suzerain, lord and master. - - <br><br>Your arcology is a flared structure, needle thin at the top where you live in your penthouse, and broad at the base. The base below ground contains storage and machinery. The lowest aboveground levels are commercial; above them are the residential areas. The entire structure is jacketed in dense gardens and solar arrays, cleverly structured to create naturally lit corridors and beautiful park-like balconies. - - <br><br>— Owner's Report - - <br><br>//You may wish to improve your arcology, but should be able to ignore its development, if you wish.// - - <br><br>//Your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ is, of course, already quite impressive. The @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ tracked in the sidebar is specifically your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ as a slaveowner. It can be raised through decadent actions that display your munificence and opulence. Some random events can increase it, but the most reliable way to improve your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ is to send sexually skilled slaves out into the arcology to offer free sexual services. This assignment is very similar to prostitution, but produces @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ rather than @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@.// - - <br><br>//As your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ develops, you may have the opportunity to guide the future of your arcology's society. Successfully doing so will increase your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ in turn, which will duly enable you to further shape society. Managing societal development well will have a recursive effect on your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>,@@ and can drive it to great heights.// - - <br><br>//The benefits of high @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ are numerous. Many business and enslavement opportunities will open to you once you are reputable. Some of the most advanced technology is only available to those with impeccable @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputations", "Arcologies and Reputation")>>@@ as slaveowners, and many of the finer slave markets will only consider reputable buyers. You may eventually become so renowned that merely branding a slave with your mark will increase her value on the open market.// - - <br><br>//However, your @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ will not look after itself. At a certain point, you will become so reputable that continual effort will be necessary to maintain your renown. The old world question "What have you done for me lately?" is asked with twice the force in the Free Cities! You will quickly find that this natural decay of @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ can overwhelm your efforts to improve it by the end of the week. A concerted strategy will be necessary to overcome this.// - - -<<case "Random Events">> - At the end of every turn, a random event may occur. Almost all random events are tied to necessary preconditions. For example, events concerning @@.mediumorchid;<<= App.Encyclopedia.Dialog.linkSC("rebellious", "From Rebellious to Devoted")>>@@ slaves will stop happening if all the player's slaves become obedient. - - <br><br>Usually, a situation will be presented and the player may choose one of two or three resolutions. Please note that the player may also to choose none of these by using the "continue" button in the sidebar; in effect, this usually means the player's character has simply declined to involve himself. - - <br><br>Almost all choices will result in small effects. The most common are changes to a slave's attitude towards the player's character, but there are others. - - <br><br>Finally, there are events that can result in the player being offered the chance to acquire new slaves, some of which can be unique or valuable. Generally, these events offer this livestock at an extremely discounted price. These events will appear more often the higher the player's @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ becomes. - - -<<case "Costs Summary">> - Aphrodisiacs are @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheap", "Money")>>@@ and cost @@.yellowgreen;<<print cashFormat($drugsCost)>>@@ weekly; curatives are expensive and cost @@.yellowgreen;<<print cashFormat(($drugsCost*3))>>@@ weekly; while all other drug regimes cost @@.yellowgreen;<<print cashFormat(($drugsCost*2))>>.@@ Standard hormone regimens cost @@.yellowgreen;<<print Math.trunc($drugsCost*1*0.5)>>@@ while intensive hormone treatment costs @@.yellowgreen;<<print Math.trunc($drugsCost*2*0.5)>>.@@ Contraceptives cost @@.yellowgreen;<<print Math.trunc($drugsCost*0.5)>>.@@ - - <br><br> - Slaves on spare living standards are fed a bland diet and obliged to sleep on bedrolls. Keeping a slave under restrictive rules costs @@.yellowgreen;<<print cashFormat($rulesCost)>>@@ weekly. - - <br><br> - Slaves enjoying luxurious living standards on the other hand are fed a tasty diet and permitted to sleep in comfortable beds, and are generally pampered. The increased luxury of permissive rules costs @@.yellowgreen;<<print cashFormat(($rulesCost*3))>>@@ weekly. - - <br><br> - Some arcology upgrades may have associated upkeep costs as well. - - -<<case "Rules Assistant">> - ''The Rules Assistant'' is a system to apply multiple rule sets to multiple slaves at once. You can apply rules to slaves based on slave ''@@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@'', ''@@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@'', ''sex drive'', ''health'', ''<<= App.Encyclopedia.Dialog.linkSC("weight", "Weight")>>'', ''<<= App.Encyclopedia.Dialog.linkSC("muscles", "Musculature")>>'', ''lactation'', ''pregnancy'', ''number of fetuses'', ''abdominal implants'' and ''age''. - - <br><br>__Rule settings:__ - Rules can be used to control certain aspects of slaves everyday lives, for example to automatically give slaves a certain clothing option, collar, footwear or allow slaves to choose their own outfit. They can be used to give unhealthy slaves curatives to improve their health or to put slaves on a diet so that their <<= App.Encyclopedia.Dialog.linkSC("weight", "Weight")>> can be closer to the ideal weight. Rules set to 'No default setting' will not apply that particular condition to slaves. - Rules can also be renamed to be more indicative of their intended purpose. - - <br><br>__Rule activation:__ - In order to apply a rule to slaves, the activation will need to be set. Choose an activation type (@@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>,@@ @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>,@@ sex drive, <<= App.Encyclopedia.Dialog.linkSC("health", "Health")>>, <<= App.Encyclopedia.Dialog.linkSC("weight", "Weight")>>, <<= App.Encyclopedia.Dialog.linkSC("muscles", "Musculature")>>, lactation, pregnancy, fetuses, implant size, or age) and then choose the level at which to apply. For example to apply a rule to obedient slaves, choose '@@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@' for the activation and 4 or more for the lower limit by selecting '>='. - - <br><br>__Selecting or excluding slaves from a rule:__ - Slaves can be selected for a rule by selecting slaves from the list so that a rule can apply only to them. Slaves can similarly be excluded from a rule. - - <br><br>__Applying a rule to specific assignments:__ - You can apply a rule only to slaves on individual assignments by selecting them under 'Apply to assignments'. For example a rule can give aphrodisiacs to slaves on whoring assignments. ''This is mutually exclusive to automatically giving an assignment to slaves''. - - <br><br>__Automatically giving an assignment:__ - A rule can be set to automatically set a slave to an assignment when activated. For example a @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devoted", "From Rebellious to Devoted")>>@@ slave can be set to automatically be put on the whoring assignment. ''This is mutually exclusive to applying a rule to assignments''. - - <br><br>__Applying a rule to facilities:__ - You can apply a rule to slaves in any or all facilities as long as that facility has been constructed. The rule will only apply to slaves within the selected facilities. ''This is mutually exclusive to automatically putting slaves into a facility''. - - <br><br>__Automatically assigning slaves to a facility:__ - A rule can be set to automatically put a slave into a facility when activated. For example disobedient slaves can be set to automatically be confined in the arcade if it has been constructed. ''This is mutually exclusive to applying a rule to facilities''. - - <br><br>__Saving a rule:__ - If you are finished setting up a rule ''make sure to save it'' by clicking 'Save rule' at the bottom before clicking another link otherwise your settings will be lost. - - <br><br>__Applying a rule:__ - Clicking on 'Apply rules' will automatically save the current rule and apply all rules to slaves at once. - - <br><br>__Adding or removing a rule:__ - The game starts with 3 basic default rule settings but more can be added and/or removed as needed. To add a new rule, click 'Add a new rule' at the bottom, removing a rule is the same by clicking 'Remove rule'. - - -<<case "The Corporation">> - Once you are fairly reputable and have a large sum of cash in the bank, you will receive a brief end of turn event that unlocks the ability to found a corporation dedicated to slaving. Once this happens, you can incorporate from the 'Manage Corporation' link on the sidebar, and once you've done that, you can manage your corporation every week from the same place. - - <br><br>__Shares__ - Buying shares from the corporation or issuing new shares will create new shares in the corporation. If you buy them yourself, cash will be transferred from you to the corporation in return for the shares; if you direct the corporation to issue new public shares, @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ will come into the corporation from the market. If you direct the corporation to buy back shares from the public, cash will be transferred from the corporation to reduce the number of public shares, which will increase your ownership percentage. You are not permitted to give up majority ownership of the corporation. Selling your shares or buying publicly held shares are both transactions between you and your shares and shareholders and their shares. All transactions impact the stock price. - - <br><br>__Divisions__ - The corporation consists of divisions. Starting up your corporation requires you to choose a single division as starting point and you will be able to expand into linked divisions once you have grown sufficiently in size. There are 3 general categories of divisions; acquisition, modification and exploitation. The first consists of legal and extralegal enslavement and they feed fresh slaves into either your corporation or the market at large. Investing in one of these is a good starting point when slave prices are high. Do note that each slave acquired and sold reduces the demand for slaves on the market. This means little at first, but when large enough will impact the market significantly.<br> - The second category consists of slave breaking, physical slave modifications and slave training. These divisions either take improvable slaves from your acquisition divisions or the slave market and improve them. Slaves can go from breaking to physical modifications to training and become highly valuable slaves by the end of it. If the slave market is balanced or you are looking for a safe initial investment these divisions are a good choice. Their market impact is neutral, buying slaves reduces supply but selling them back onto the market reduces demand by the same amount.<br> - The final category consists of an arcade, menial services, dairy and escort division. These divisions require a particular quality of slave and then put them to work in their respective fields. As these divisions operate they will have to write off some of their slaves and replace them with fresh ones, you can provide these slaves through your acquisition or modification divisions or the market. Whenever prices are low these divisions operate at a higher margin, making them a great first division when slave prices are low. Do note that each slave bought from the market reduces the supply of slaves. As these divisions grow and write off more and more slaves each week, replenishing them from the market will begin to impact the market significantly. - - <br><br>__Management__ - Your first division will automatically buy and/or sell slaves in order to do business and make money. It is up to the player to decide when to expand the division's capacity, but investing aggressively early will pay off in the long run. Once your corporation has gotten a little time to grow its value (the sum of slave value, division value, cash on hand and dividends reserved) the end of week report will prompt you that a new division can be added. This requires a significant cash investment so you may have to save up a little. Adding divisions comes with efficiency benefits, but also adds overhead costs. Adding a second division will hardly slow you down, but as you grow these costs grow ever larger; depending on the number of divisions, but also the size of them.<br> - Any new division will have at least one direct link to your current divisions, meaning it can either use slaves from a division or provide them to another division. New divisions are not automatically set to buy and/or sell slaves from the market. It is expected the player either manually moves slaves between divisions or sets up automatic links between them using several rules.<br> - You have the ability to reduce the size of your divisions or dissolve them entirely. While this only recoups 80% of the investment it may sometimes be prudent to do so, i.e. in case market conditions have become unfavorable for the division and/or overhead costs are becoming oppressively high. Also note that divisions become less efficient the larger they get (even without considering overhead), eventually growing it further will hurt your profit, not improve it. You will want to cut your losses early or otherwise suffer the consequences.<br> - In order to personally benefit monetarily from your corporation you will have to decide how much of its profit will be set aside to be paid out as dividends. Setting low or no dividends allows for rapid development, while siphoning a lot of profits away from the corporation will slow it down significantly. Please note that the corporation does not pay out every week but only every quarter (13 weeks). - - <br><br>__Slave Sales__ - Once a corporation is created, it will get its own establishment in the slave market. As the corporation's value increase, it can be given direction about what kind of slaves it should train and how it should train them, which will affect the slaves seen in the corporate catalog. As with divisions; the higher your corporation's value, the more specializations you are allowed to choose. Your corporation's divisions determine which specialization options are available. Each division has a unique specialization associated with it while many others are slightly more general and linked to either acquisition or modification. All kinds of restrictions may apply depending on Future Society choices and the size of your divisions. Several specializations can be enhanced beyond the first choice, but again you may need to satisfy certain conditions first.<br> - If the corporation's slaves have qualities that make them especially appealing to an arcology's citizens, the corporation will enjoy increased profits, and the <<= App.Encyclopedia.Dialog.linkSC("future society", "Future Societies")>> creating the demand will progress more rapidly due to the supply of appealing slaves. All arcologies present in the Free City will interact with the corporation this way, making shares in a corporation which supplies girls that appeal to the whole city extremely lucrative. <<case "Demand for Sex">> The Free Cities naturally facilitate a healthy sex industry which provides lucrative business opportunities. But you are not the only one who can provide sexual services and you may find yourself in competition for the large, but ultimately limited, amount of sexual desires within the arcology. Clever manipulations can influence both the demand as well as the supply to improve the attractiveness of your arcology and fill your coffers. @@ -223,36 +64,6 @@ BEING IN CHARGE <br><br>Slaves assigned as whores can be used to satisfy any of the different classes of citizens, if they are desirable and skilled enough, that is. Slaves assigned to serve the public are suitable for the sexual relief of the lower half of your citizenry and the arcade generally only serves the very bottom of your arcology. -<<case "Sexual Energy">> - <<setPlayerPronouns>> - Though you're (naturally) a virile, oversexed oligarch, even your reserves of sexual energy are not infinite. They're impressive, but not infinite. Since one turn represents one week, the game does not allow the player direct control over every sexual interaction between the player character and _hisP slaves. Put another way, the game assumes there's an impressive amount of off-screen sex going on between the <<= properMaster()>> and _hisP chattel. - - <br><br>The player character's sexual energy can have gameplay effects. Though of course all slaves are at the <<= properMaster()>>'s sexual beck and call, some assignments and training methods involve close sexual attention by the player character. If a large number of slaves are subject to this, the player character's attention will be somewhat diluted, and the effects on each slave will be reduced. Slaves assigned to be __fucktoys__ and serve in the __master suite__ count towards a hidden estimation of the player character's sexual foci. With two or fewer such slaves, the player character's sexual attention on these slaves will be intense and have intense effects. With five or more, the player character may have some difficulty in using every slave every day, diluting the mental effects of being the <<= properMaster()>>'s personal sex toy. - - <br><br>It is possible to raise these limits by focusing on sexual decadence for the week. By paying less attention to business and not using sexual training on specific slaves, the player character will have more energy to spare and can offer intense sexual attention to three slaves or give sexual attention to up to seven slaves without dilution. - - <br><br>There exist several other ways to raise the player's sexual energy as well. - -<<case "PC Skills">> - <br><br>''Trading'' signifies how efficient you are at making exchanges. Provides more passive income the higher it is. - Can be increased through acquiring slaves. - - <br>''Warfare'' is an indication your combat prowess. Cuts cost of housing mercs in half. - Can be increased through use in relevant situations. - - <br>''Hacking'' is an indication of your effectiveness at manipulating computer systems. Higher levels make technological upgrades @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@ or free, provides a boost situations where fame is measured digitally. - Can be increased through choosing to 'Sell your intrusion services to the highest bidder' once the option becomes available after having 'some' skill and purchasing technological upgrades. - - <br>''Slaving'' improves your effectiveness as a slave driver. At max level it allows you to more easily spot <<= App.Encyclopedia.Dialog.linkSC("gingering", "Gingering")>>. - Can be increased through acquiring performing the duties of a slave driver. - - <br>''Engineering'' is a sign of how effective you are building and maintenance. Mastering the skill reduces the cost of @@.yellowgreen;arcology upgrades and expansions.@@ - Can be increased through purchasing arcology upgrades or expanding facility capacity. If the <<= App.Encyclopedia.Dialog.linkSC("Security Expansion", "Security Expansion")>> mod is enabled, the skill is also increased by repairing your arcology. - - <br>''Medicine'' shows how effective you are treating wounds. Max level reduces a slave's health and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ loss during surgery. - - In addition to the above methods of increasing a skill (if any), all of them can be learnt by retaining a trainer<<if $SF.Toggle && $SF.Active >= 1>> or by talking to/learning from The Colonel<</if>>. - /********** SLAVES **********/ diff --git a/src/gui/Encyclopedia/encyclopediaBeingInCharge.js b/src/gui/Encyclopedia/encyclopediaBeingInCharge.js new file mode 100644 index 0000000000000000000000000000000000000000..1ecaad5891f0851a62cbb19beca7430c8e98bf59 --- /dev/null +++ b/src/gui/Encyclopedia/encyclopediaBeingInCharge.js @@ -0,0 +1,296 @@ +App.Encyclopedia.addArticle("Being in Charge", function() { + const f = new DocumentFragment(); + App.UI.DOM.appendNewElement("p", f, "Future room for lore text", "scene-intro"); + App.UI.DOM.appendNewElement("p", f, "Choose a more particular entry below:"); + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("Arcologies and Reputation", function() { + const f = new DocumentFragment(); + let r; + + App.UI.DOM.appendNewElement("p", f, "Arcologies are the urban buildings of the future: almost completely self-contained, almost completely self sufficient. In the anarcho-liberal 'paradise' of the Free Cities, as owner of your own arcology you are like a modern-day feudal suzerain, lord and master."); + + App.UI.DOM.appendNewElement("p", f, "Your arcology is a flared structure, needle thin at the top where you live in your penthouse, and broad at the base. The base below ground contains storage and machinery. The lowest aboveground levels are commercial; above them are the residential areas. The entire structure is jacketed in dense gardens and solar arrays, cleverly structured to create naturally lit corridors and beautiful park-like balconies."); + + App.UI.DOM.appendNewElement("p", f, "— Owner's Report"); + + const p = document.createElement("p"); + p.classList.add("scene-intro"); + + App.UI.DOM.appendNewElement("p", p, "You may wish to improve your arcology, but should be able to ignore its development, if you wish."); + + r = []; + r.push("Your <span class='reputation inc'>reputation</span> is, of course, already quite impressive. The <span class='reputation inc'>reputation</span> tracked in the sidebar is specifically your <span class='reputation inc'>reputation</span> as a slaveowner. It can be raised through decadent actions that display your munificence and opulence. Some random events can increase it, but the most reliable way to improve your <span class='reputation inc'>reputation</span> is to send sexually skilled slaves out into the arcology to offer free sexual services. This assignment is very similar to prostitution, but produces <span class='reputation inc'>reputation</span> rather than"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money"), "."), "cash")); + App.Events.addParagraph(p, r); + + r = []; + r.push("As your <span class='reputation inc'>reputation</span> develops, you may have the opportunity to guide the future of your arcology's society. Successfully doing so will increase your <span class='reputation inc'>reputation</span> in turn, which will duly enable you to further shape society. Managing societal development well will have a recursive effect on your <span class='reputation inc'>reputation,</span> and can drive it to great heights."); + App.Events.addParagraph(p, r); + + r = []; + r.push("The benefits of high <span class='reputation inc'>reputation</span> are numerous. Many business and enslavement opportunities will open to you once you are reputable. Some of the most advanced technology is only available to those with impeccable <span class='reputation inc'>reputations</span> as slaveowners, and many of the finer slave markets will only consider reputable buyers. You may eventually become so renowned that merely branding a slave with your mark will increase her value on the open market."); + App.Events.addParagraph(p, r); + + r = []; + r.push("However, your <span class='reputation inc'>reputation</span> will not look after itself. At a certain point, you will become so reputable that continual effort will be necessary to maintain your renown. The old world question <span class='clear-formatting'>\"What have you done for me lately?\"</span> is asked with twice the force in the Free Cities! You will quickly find that this natural decay of <span class='reputation inc'>reputation</span> can overwhelm your efforts to improve it by the end of the week. A concerted strategy will be necessary to overcome this."); + App.Events.addParagraph(p, r); + f.append(p); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("Random Events", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("At the end of every turn, a random event may occur. Almost all random events are tied to necessary preconditions. For example, events concerning"); + r.push(App.Encyclopedia.Dialog.linkDOM("rebellious", "From Rebellious to Devoted", "devotion resistant")); + r.push("slaves will stop happening if all the player's slaves become obedient."); + App.Events.addParagraph(f, r); + + r = []; + r.push("Usually, a situation will be presented and the player may choose one of two or three resolutions. Please note that the player may also to choose none of these by using the <span class='encyclopedia interaction'>Continue</span> button in the sidebar; in effect, this usually means the player's character has simply declined to involve himself."); + App.Events.addParagraph(f, r); + + r = []; + r.push("Almost all choices will result in small effects. The most common are changes to a slave's attitude towards the player's character, but there are others."); + App.Events.addParagraph(f, r); + + r = []; + r.push("Finally, there are events that can result in the player being offered the chance to acquire new slaves, some of which can be unique or valuable. Generally, these events offer this livestock at an extremely discounted price. These events will appear more often the higher the player's"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("becomes."); + App.Events.addParagraph(f, r); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("Costs Summary", function() { + const f = new DocumentFragment(); + let r; + + const basicDrugCost = 100; + const basicRulesCost = 100; + + r = []; + r.push("Aphrodisiacs are"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheap", "Money", "cash")); + r.push(`and cost <span class='cash'>${cashFormat(basicDrugCost)}</span> weekly; curatives are expensive and cost <span class='cash'>${cashFormat((basicDrugCost * 3))}</span> weekly; while all other drug regimes cost <span class='cash'>${cashFormat((basicDrugCost * 2))}.</span> Standard hormone regimens cost <span class='cash'>${Math.trunc(basicDrugCost * 0.5)}</span> while intensive hormone treatment costs <span class='cash'>${Math.trunc(basicDrugCost * 2 * 0.5)}.</span> Contraceptives cost <span class='cash'>${Math.trunc(basicDrugCost * 0.5)}.</span>`); + App.Events.addParagraph(f, r); + + r = []; + r.push(`Slaves on spare living standards are fed a bland diet and obliged to sleep on bedrolls. Keeping a slave under restrictive rules costs <span class='cash'>${cashFormat(basicRulesCost)}</span> weekly.`); + App.Events.addParagraph(f, r); + + r = []; + r.push(`Slaves enjoying luxurious living standards on the other hand are fed a tasty diet and permitted to sleep in comfortable beds, and are generally pampered. The increased luxury of permissive rules costs <span class='cash'>${cashFormat((basicRulesCost * 3))}</span> weekly.`); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("p", f, "Costs given are only the base costs, they can be affected by a variety of modifiers, for example economy settings, player background and arcology upgrades. Some upgrades may have associated upkeep costs as well."); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("Rules Assistant", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push(App.Encyclopedia.topic("The Rules Assistant")); + r.push("is a system to apply multiple rule sets to multiple slaves at once. You can apply rules to slaves based on slave"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), ","), ["devotion", "accept"])); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("trust", "Trust"), ","), ["trust", "careful"])); + r.push("sex drive, health,"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("weight", "Weight"), ",")); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("muscles", "Musculature"), ",")); + r.push("lactation, pregnancy, number of fetuses, abdominal implants and age."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Rule settings")); + r.push("Rules can be used to control certain aspects of slaves everyday lives, for example to automatically give slaves a certain clothing option, collar, footwear or allow slaves to choose their own outfit. They can be used to give unhealthy slaves curatives to improve their health or to put slaves on a diet so that their"); + r.push(App.Encyclopedia.Dialog.linkDOM("weight", "Weight")); + r.push("can be closer to the ideal weight. Rules set to <span class='encyclopedia interaction'>No default setting</span> will not apply that particular condition to slaves. Rules can also be renamed to be more indicative of their intended purpose."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Rule activation")); + r.push("In order to apply a rule to slaves, the activation will need to be set. Choose an activation type"); + r.push(App.UI.DOM.combineNodes("(", + App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), ","), ["devotion", "accept"]))); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("trust", "Trust"), ","), ["trust", "careful"])); + r.push("sex drive,"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("health", "Health"), ",")); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("weight", "Weight"), ",")); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("muscles", "Musculature"), ",")); + r.push("lactation, pregnancy, fetuses, implant size, or age) and then choose the level at which to apply. For example to apply a rule to obedient slaves, choose"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("for the activation and 4 or more for the lower limit by selecting <span class='encyclopedia interaction'>>=</span>."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Selecting or excluding slaves from a rule")); + r.push("Slaves can be selected for a rule by selecting slaves from the list so that a rule can apply only to them. Slaves can similarly be excluded from a rule."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Applying a rule to specific assignments")); + r.push("You can apply a rule only to slaves on individual assignments by selecting them under <span class='encyclopedia interaction'>Apply to assignments</span>. For example a rule can give aphrodisiacs to slaves on whoring assignments. <span class='note'>This is mutually exclusive to automatically giving an assignment to slaves.</span>"); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Automatically giving an assignment")); + r.push("A rule can be set to automatically set a slave to an assignment when activated. For example a"); + r.push(App.Encyclopedia.Dialog.linkDOM("devoted", "From Rebellious to Devoted", "devotion accept")); + r.push("slave can be set to automatically be put on the whoring assignment. <span class='note'>This is mutually exclusive to applying a rule to assignments.</span>"); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Applying a rule to facilities")); + r.push("You can apply a rule to slaves in any or all facilities as long as that facility has been constructed. The rule will only apply to slaves within the selected facilities. <span class='note'>This is mutually exclusive to automatically putting slaves into a facility.</span>"); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Automatically assigning slaves to a facility")); + r.push("A rule can be set to automatically put a slave into a facility when activated. For example disobedient slaves can be set to automatically be confined in the arcade if it has been constructed. <span class='note'>This is mutually exclusive to applying a rule to facilities.</span>"); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Saving a rule")); + r.push("If you are finished setting up a rule <em>make sure to save it</em> by clicking <span class='encyclopedia interaction'>Save rule</span> at the bottom before clicking another link otherwise your settings will be lost."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Applying a rule")); + r.push("Clicking on <span class='encyclopedia interaction'>Apply rules</span> will automatically save the current rule and apply all rules to slaves at once."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Adding or removing a rule")); + r.push("The game starts with 3 basic default rule settings but more can be added and/or removed as needed. To add a new rule, click <span class='encyclopedia interaction'>Add a new rule</span> at the bottom, removing a rule is the same by clicking <span class='encyclopedia interaction'>Remove rule</span>."); + App.Events.addParagraph(f, r); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("The Corporation", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("Once you are fairly reputable and have a large sum of cash in the bank, you will receive a brief end of turn event that unlocks the ability to found a corporation dedicated to slaving. Once this happens, you can incorporate from the <span class='encyclopedia interaction'>Manage Corporation</span> link on the sidebar, and once you've done that, you can manage your corporation every week from the same place."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Shares"); + r = []; + r.push("Buying shares from the corporation or issuing new shares will create new shares in the corporation. If you buy them yourself, cash will be transferred from you to the corporation in return for the shares; if you direct the corporation to issue new public shares,"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("will come into the corporation from the market. If you direct the corporation to buy back shares from the public, cash will be transferred from the corporation to reduce the number of public shares, which will increase your ownership percentage. You are not permitted to give up majority ownership of the corporation. Selling your shares or buying publicly held shares are both transactions between you and your shares and shareholders and their shares. All transactions impact the stock price."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Divisions"); + App.UI.DOM.appendNewElement("p", f, "The corporation consists of divisions. Starting up your corporation requires you to choose a single division as starting point and you will be able to expand into linked divisions once you have grown sufficiently in size. There are 3 general categories of divisions; acquisition, modification and exploitation. The first consists of legal and extralegal enslavement and they feed fresh slaves into either your corporation or the market at large. Investing in one of these is a good starting point when slave prices are high. Do note that each slave acquired and sold reduces the demand for slaves on the market. This means little at first, but when large enough will impact the market significantly."); + App.UI.DOM.appendNewElement("p", f, "The second category consists of slave breaking, physical slave modifications and slave training. These divisions either take improvable slaves from your acquisition divisions or the slave market and improve them. Slaves can go from breaking to physical modifications to training and become highly valuable slaves by the end of it. If the slave market is balanced or you are looking for a safe initial investment these divisions are a good choice. Their market impact is neutral, buying slaves reduces supply but selling them back onto the market reduces demand by the same amount."); + App.UI.DOM.appendNewElement("p", f, "The final category consists of an arcade, menial services, dairy and escort division. These divisions require a particular quality of slave and then put them to work in their respective fields. As these divisions operate they will have to write off some of their slaves and replace them with fresh ones, you can provide these slaves through your acquisition or modification divisions or the market. Whenever prices are low these divisions operate at a higher margin, making them a great first division when slave prices are low. Do note that each slave bought from the market reduces the supply of slaves. As these divisions grow and write off more and more slaves each week, replenishing them from the market will begin to impact the market significantly."); + + App.UI.DOM.appendNewElement("h3", f, "Management"); + App.UI.DOM.appendNewElement("p", f, "Your first division will automatically buy and/or sell slaves in order to do business and make money. It is up to you to decide when to expand the division's capacity, but investing aggressively early will pay off in the long run. Once your corporation has gotten a little time to grow its value (the sum of slave value, division value, cash on hand and dividends reserved) the end of week report will prompt you that a new division can be added. This requires a significant cash investment so you may have to save up a little. Adding divisions comes with efficiency benefits, but also adds overhead costs. Adding a second division will hardly slow you down, but as you grow these costs grow ever larger; depending on the number of divisions, but also the size of them."); + App.UI.DOM.appendNewElement("p", f, "Any new division will have at least one direct link to your current divisions, meaning it can either use slaves from a division or provide them to another division. New divisions are not automatically set to buy and/or sell slaves from the market. It is expected you either manually move slaves between divisions or sets up automatic links between them using several rules."); + App.UI.DOM.appendNewElement("p", f, "You have the ability to reduce the size of your divisions or dissolve them entirely. While this only recoups 80% of the investment it may sometimes be prudent to do so, i.e. in case market conditions have become unfavorable for the division and/or overhead costs are becoming oppressively high. Also note that divisions become less efficient the larger they get (even without considering overhead), eventually growing it further will hurt your profit, not improve it. You will want to cut your losses early or otherwise suffer the consequences."); + App.UI.DOM.appendNewElement("p", f, "In order to personally benefit monetarily from your corporation you will have to decide how much of its profit will be set aside to be paid out as dividends. Setting low or no dividends allows for rapid development, while siphoning a lot of profits away from the corporation will slow it down significantly. Please note that the corporation does not pay out every week but only every quarter (13 weeks)."); + + App.UI.DOM.appendNewElement("h3", f, "Slave Sales"); + App.UI.DOM.appendNewElement("p", f, "Once a corporation is created, it will get its own establishment in the slave market. As the corporation's value increase, it can be given direction about what kind of slaves it should train and how it should train them, which will affect the slaves seen in the corporate catalog. As with divisions; the higher your corporation's value, the more specializations you are allowed to choose. Your corporation's divisions determine which specialization options are available. Each division has a unique specialization associated with it while many others are slightly more general and linked to either acquisition or modification. All kinds of restrictions may apply depending on Future Society choices and the size of your divisions. Several specializations can be enhanced beyond the first choice, but again you may need to satisfy certain conditions first."); + r = []; + r.push("If the corporation's slaves have qualities that make them especially appealing to an arcology's citizens, the corporation will enjoy increased profits, and the"); + r.push(App.Encyclopedia.Dialog.linkDOM("future society", "Future Societies")); + r.push("creating the demand will progress more rapidly due to the supply of appealing slaves. All arcologies present in the Free City will interact with the corporation this way, making shares in a corporation which supplies girls that appeal to the whole city extremely lucrative."); + App.Events.addParagraph(f, r); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("Sexual Energy", function() { + const f = new DocumentFragment(); + let r; + + App.UI.DOM.appendNewElement("p", f, `Though you're (naturally) a virile, oversexed oligarch, even your reserves of sexual energy are not infinite. They're impressive, but not infinite. Since one turn represents one week, the game does not allow you direct control over every sexual interaction between you character and your slaves. Put another way, the game assumes there's an impressive amount of off-screen sex going on between the you and your chattel.`); + + r = []; + r.push(`Your sexual energy can have gameplay effects. Though of course all slaves are at the owner's sexual beck and call, some assignments and training methods involve close sexual attention by yourself. If a large number of slaves are subject to this, your attention will be somewhat diluted, and the effects on each slave will be reduced. Slaves assigned to be <em>fucktoys</em> and serve in the <em>master suite</em> count towards a hidden estimation of your sexual foci. With two or fewer such slaves, the your sexual attention on these slaves will be intense and have intense effects. With five or more, the you may have some difficulty in using every slave every day, diluting the mental effects of being one's personal sex toy.`); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("p", f, `It is possible to raise these limits by focusing on sexual decadence for the week. By paying less attention to business and not using sexual training on specific slaves, you will have more energy to spare and can offer intense sexual attention to three slaves or give sexual attention to up to seven slaves without dilution.`); + + App.UI.DOM.appendNewElement("p", f, `There exist several other ways to raise your sexual energy as well.`); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addArticle("PC Skills", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push(App.Encyclopedia.topic("Trading")); + r.push("signifies how efficient you are at making exchanges. Provides more passive income the higher it is. Can be increased through acquiring slaves."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Warfare")); + r.push("is an indication your combat prowess. Cuts cost of housing mercs in half. Can be increased through use in relevant situations."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Hacking")); + r.push("is an indication of your effectiveness at manipulating computer systems. Higher levels make technological upgrades"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money", "cash")); + r.push("or free, provides a boost situations where fame is measured digitally. Can be increased through choosing to <span class='encyclopedia interaction'>Sell your intrusion services to the highest bidder</span> once the option becomes available after having <em>some</em> skill and purchasing technological upgrades."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Slaving")); + r.push("improves your effectiveness as a slave driver. At max level it allows you to more easily spot"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("gingering", "Gingering"), ".")); + r.push("Can be increased through acquiring performing the duties of a slave driver."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Engineering")); + r.push("is a sign of how effective you are building and maintenance. Mastering the skill reduces the cost of <span class='cash'>arcology upgrades and expansions.</span> Can be increased through purchasing arcology upgrades or expanding facility capacity. If the"); + r.push(App.Encyclopedia.Dialog.linkDOM("Security Expansion", "Security Expansion")); + r.push("mod is enabled, the skill is also increased by repairing your arcology."); + App.Events.addParagraph(f, r); + + r = []; + r.push(App.Encyclopedia.topic("Medicine")); + r.push("shows how effective you are treating wounds. Max level reduces a slave's health and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("loss during surgery."); + App.Events.addParagraph(f, r); + + r = []; + r.push("In addition to the above methods of increasing a skill (if any), all of them can be learnt by retaining a trainer"); + if (V.SF.Toggle && V.SF.Active >= 1) { + r.push("or by talking to/learning from The Colonel"); + } + r.push(r.pop() + "."); + App.Events.addParagraph(f, r); + + return f; +}, "beingInCharge"); + +App.Encyclopedia.addCategory("beingInCharge", function() { + const links = []; + links.push(App.Encyclopedia.Dialog.linkDOM("Arcologies and Reputation", "Arcologies and Reputation")); + links.push(App.Encyclopedia.Dialog.linkDOM("Random Events", "Random Events")); + links.push(App.Encyclopedia.Dialog.linkDOM("Costs Summary", "Costs Summary")); + links.push(App.Encyclopedia.Dialog.linkDOM("Rules Assistant", "Rules Assistant")); + links.push(App.Encyclopedia.Dialog.linkDOM("The Corporation", "The Corporation")); + links.push(App.Encyclopedia.Dialog.linkDOM("Sexual Energy", "Sexual Energy")); + links.push(App.Encyclopedia.Dialog.linkDOM("PC Skills", "PC Skills")); + return App.UI.DOM.generateLinksStrip(links); +}); diff --git a/src/gui/Encyclopedia/encyclopediaBody.js b/src/gui/Encyclopedia/encyclopediaBody.js index ff8f91b403040c29dec8c5f8a6f56ec5a1111d35..79a36bb0b964819483a0142c58cfdbed9dadeee7 100644 --- a/src/gui/Encyclopedia/encyclopediaBody.js +++ b/src/gui/Encyclopedia/encyclopediaBody.js @@ -279,20 +279,20 @@ App.Encyclopedia.addArticle("Ovaries", function() { }, "body"); App.Encyclopedia.addArticle("Pregnancy", function() { - return App.UI.DOM.combineNodes( - `Slaves require both `, - App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), - ` and `, - App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries"), - ` to become`, - App.Encyclopedia.topic("pregnant."), - `However, it's rumored that Gender Radicalist societies have developed a method for `, - App.Encyclopedia.Dialog.linkDOM("male impregnation", "Gender Radicalism Research"), - `. Fertile slaves can be impregnated by the player character or a slave with `, - App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles"), - ` from the fertile slave's individual menu. Otherwise, slaves with vaginas and ovaries who aren't wearing chastity belts or taking contraceptives, and have not had their tubes tied via surgery, will likely become pregnant if performing sexual jobs or if allowed to have sex with slaves with balls. Pregnancy has a number of minor physical effects and will induce `, - App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation") - ); + const fragment = new DocumentFragment(); + let r = []; + r.push(`Slaves require both`); + r.push(App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas")); + r.push(`and`); + r.push(App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries")); + r.push(`to become pregnant. However, it's rumored that Gender Radicalist societies have developed a method for `); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("male impregnation", "Gender Radicalism Research"), ".")); + r.push(`Fertile slaves can be impregnated by the player character or a slave with`); + r.push(App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles")); + r.push(`from the fertile slave's individual menu. Otherwise, slaves with vaginas and ovaries who aren't wearing chastity belts or taking contraceptives, and have not had their tubes tied via surgery, will likely become pregnant if performing sexual jobs or if allowed to have sex with slaves with balls. Pregnancy has a number of minor physical effects and will induce`); + r.push(App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation")); + App.Events.addParagraph(fragment, r); + return fragment; }, "body"); App.Encyclopedia.addArticle("Skin Distinctions", function() { diff --git a/src/gui/Encyclopedia/encyclopediaGuide.js b/src/gui/Encyclopedia/encyclopediaGuide.js index c24e5237ad0681ccbbf56e62020b36f3cf005532..709fa33450b06f95dd3edf6a60b4e54590aaec48 100644 --- a/src/gui/Encyclopedia/encyclopediaGuide.js +++ b/src/gui/Encyclopedia/encyclopediaGuide.js @@ -327,152 +327,228 @@ App.Encyclopedia.addArticle("Tips and Tricks", function() { }, "guide"); App.Encyclopedia.addArticle("Design Your Master", function() { - const f = new DocumentFragment(); - let r; - - r = []; - r.push("This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options."); - App.Events.addParagraph(f, r); - - r = []; - r.push(`<strong>Wealth</strong> is a choice for both the <strong>career background</strong> and <strong>rumored method of acquiring the arcology</strong> options. Both provide you with <span class="cash">${cashFormat(10000)}</span> each for a total of <span class="cash">${cashFormat(30000)}</span> if both are chosen. As a <strong>background option</strong> it means that your starting slaves will have two free levels of sex skills available.`); - App.Events.addParagraph(f, r); - - App.UI.DOM.appendNewElement("h3", f, "Career background options"); - const p = document.createElement("p"); - p.append("Being an ex-"); - let ul = document.createElement("ul"); - - r = []; - r.push("<strong>business owner</strong> <span class='note'>(also referred to as capitalist)</span> enhances the business-focused personal attention, increasing the"); - r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); - r.push("it produces and improving arcology prosperity when business-focused personal attention is selected. Also, your starting slaves will have a free level of prostitution skill available. Starts having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Trading", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>private security contractor</strong> <span class='note'>(also referred to as mercenary background)</span> greatly reduces the cost of keeping mercenaries in your employ. Your starting slaves will have free"); - r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); - r.push("available. Starts having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Warfare", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>slave driver</strong> enhances slave-focused personal attention, adding bonus"); - r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); - r.push("or"); - r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); - r.push("to many training applications or preventing their loss. Starting slaves will be cheaper, in addition having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Slaving", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>arcology engineer</strong> provides a significant discount on many <span class='cash'>arcology upgrades and expansions.</span> In addition to the arcology starting off with <span class='positive'>basic economic upgrades</span> already installed. Starts having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Engineering", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>doctor</strong> allows the player character to perform surgery personally, providing a <span class='cash'>discount on surgery costs</span> and a <span class='positive'>reduction to resulting health damage.</span> Additionally, slaves may react differently to surgery if the player character performs it and starting slaves will have free implants available. Starts having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Medicine", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>escort</strong> provides a one-time bonus to a slave's entertainment, whoring, and two sexual skills when a new slave is acquired. Furthermore, society will not take lightly to being run by an ex-whore, and you will receive heavy"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("losses each week. You can spend your free time selling your body for"); - r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money"), ","), "cash")); - r.push("at the cost of a large amount of"); - r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation"), "."), ["reputation", "inc"])); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>celebrity</strong> provides extra"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("at game start. Starting slaves will have a free level of entertainment skill available."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>servant</strong> provides a one-time bonus to a slave's"); - r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); - r.push("and"); - r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "."), ["devotion", "accept"])); - r.push("Furthermore, society will not approve of being run by an ex-servant, and you will face"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("losses each week. You can spend your free time, putting your previous experience to use, by greatly reducing the costs of your penthouse. You also passively reduce costs when not focusing on doing so."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>gang leader</strong> provides a one-time bonus to a slave's health and a free level of combat skill. Furthermore, society will not approve of being run by a gang-banger, and you will face"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("losses each week. New slaves will likely have heard of your previous exploits and fear you. You know how to haggle slaves. You can spend your free time putting your previous experience to use, proving another source of income however this isn't guaranteed."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>incursion specialist</strong> provides starting slaves with a free level of <span class='intelligent'>intelligence.</span> Also certain upgrades may be"); - r.push(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money", "cash")); - r.push("and you may find alternative approaches to problems. Starts having already mastered"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Hacking", "PC Skills"), ".")); - App.Events.addNode(ul, r, "li"); - - p.append(ul); - f.append(p); - - r = []; - r.push("Players using the"); - r.push(App.Encyclopedia.Dialog.linkDOM("Security Expansion", "Security Expansion")); - r.push("mod may want to view this page with"); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("additional details", "Design Your Master in SecExp"), ".")); - App.Events.addParagraph(f, r); - - App.UI.DOM.appendNewElement("h3", f, "Rumored acquisition options"); - ul = document.createElement("ul"); - r = []; - r.push("<strong>Hard Work</strong> provides a one-time bonus to both"); - r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); - r.push("and"); - r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); - r.push("when a new slave is acquired."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>Force</strong> means that if a slave does not have enough"); - r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); - r.push("to obey when acquired, this option will terrify her and reduce her"); - r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); - r.push("to the point where she should comply."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>Social Engineering</strong> means that you will start with the first societal option unlocked, since you manipulated the arcology's citizens."); - App.Events.addNode(ul, r, "li"); - - r = []; - r.push("<strong>Luck</strong> provides extra"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("at game start, but no ongoing advantages once the main game begins."); - App.Events.addNode(ul, r, "li"); - - App.UI.DOM.appendNewElement("p", f, ul); - - App.UI.DOM.appendNewElement("h3", f, "Age groups"); - r = []; - r.push("Older PCs enjoy easier"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("maintenance, but possess lower"); - r.push(App.Encyclopedia.Dialog.linkDOM("sexual energy", "Sexual Energy")); - r.push("while younger PC's are the opposite."); - App.Events.addParagraph(f, r); - - App.UI.DOM.appendNewElement("h3", f, "Body and gender options"); - r = []; - r.push("All PC body changes will alter scenes, but their main mechanical effect is on"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("maintenance. Feminine options will make it harder to maintain"); - r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); - r.push("without providing any gameplay advantage, making playing as a feminine PC a form of increased difficulty. There are other minor gameplay differences including differing slave reactions to the PC based on attraction, but these are fairly minor."); - App.Events.addParagraph(f, r); - - return f; + const outer = document.createElement("p"); + const showSecExp = V.secExpEnabled > 0; + + outer.append(content(showSecExp)); + + return outer; + + /** + * @param {boolean} showSecExp + * @returns {DocumentFragment} + */ + function content(showSecExp) { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options."); + App.Events.addParagraph(f, r); + + r = []; + r.push(`<strong>Wealth</strong> is a choice for both the <strong>career background</strong> and <strong>rumored method of acquiring the arcology</strong> options. Both provide you with <span class="cash">${cashFormat(10000)}</span> each for a total of <span class="cash">${cashFormat(30000)}</span> if both are chosen. As a <strong>background option</strong> it means that your starting slaves will have two free levels of sex skills available`); + if (showSecExp) { + r.push("and maintaining"); + r.push(App.Encyclopedia.Dialog.linkDOM("authority", "Security Expansion", "darkviolet")); + r.push("will be harder, but upgrades in the propaganda hub will be"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money"), "."), "cash")); + } else { + r.push(r.pop() + "."); + } + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Career background options"); + const p = document.createElement("p"); + p.append("Being an ex-"); + let ul = document.createElement("ul"); + + r = []; + r.push("<strong>business owner</strong> <span class='note'>(also referred to as capitalist)</span> enhances the business-focused personal attention, increasing the"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("it produces and improving arcology prosperity when business-focused personal attention is selected. Also,"); + if (showSecExp) { + r.push("upgrades in the propaganda hub will be"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money", "cash")); + r.push("and"); + } + r.push("your starting slaves will have a free level of prostitution skill available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Trading", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>private security contractor</strong> <span class='note'>(also referred to as mercenary background)</span> greatly reduces the cost of keeping mercenaries in your employ."); + if (showSecExp) { + r.push("Upgrades in the security HQ will be"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money"), "."), "cash")); + } + r.push("Your starting slaves will have free"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Warfare", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>slave driver</strong> enhances slave-focused personal attention, adding bonus"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("or"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("to many training applications or preventing their loss."); + if (showSecExp) { + r.push(App.Encyclopedia.Dialog.linkDOM("Authority", "Security Expansion", "darkviolet")); + r.push("will be easier to maintain. Plus upgrades in the security HQ will be"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money"), "."), "cash")); + } + r.push("Starting slaves will be cheaper, in addition having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Slaving", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>arcology engineer</strong> provides a significant discount on many <span class='cash'>arcology upgrades and expansions.</span> In addition to the arcology starting off with <span class='positive'>basic economic upgrades</span> already installed. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Engineering", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>doctor</strong> allows the player character to perform surgery personally, providing a <span class='cash'>discount on surgery costs</span> and a <span class='positive'>reduction to resulting health damage.</span> Additionally, slaves may react differently to surgery if the player character performs it and starting slaves will have free implants available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Medicine", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>escort</strong> provides a one-time bonus to a slave's entertainment, whoring, and two sexual skills when a new slave is acquired. Furthermore, society will not take lightly to being run by an ex-whore, and you will receive heavy"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + if (showSecExp) { + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("authority", "Security Expansion", "darkviolet")); + } + r.push("losses each week. You can spend your free time selling your body for"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money"), ","), "cash")); + r.push("at the cost of a large amount of"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation"), "."), ["reputation", "inc"])); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>celebrity</strong> provides extra"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("at game start"); + if (showSecExp) { + r.push("and upgrades in the propaganda hub will be"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money"), "."), "cash")); + } else { + r.push(r.pop() + "."); + } + r.push("Starting slaves will have a free level of entertainment skill available."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>servant</strong> provides a one-time bonus to a slave's"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("and"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "."), ["devotion", "accept"])); + r.push("Furthermore, society will not approve of being run by an ex-servant, and you will face"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + if (showSecExp) { + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("authority", "Security Expansion", "darkviolet")); + } + r.push("losses each week. You can spend your free time, putting your previous experience to use, by greatly reducing the costs of your penthouse. You also passively reduce costs when not focusing on doing so."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>gang leader</strong> provides a one-time bonus to a slave's health and a free level of combat skill. Furthermore, society will not approve of being run by a gang-banger, and you will face"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("losses each week. New slaves will likely have heard of your previous exploits and fear you."); + if (showSecExp) { + r.push("You know how to haggle slaves and assert your"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("authority", "Security Expansion"), "."), "darkviolet")); + r.push("Plus upgrades in the security HQ will be"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money"), "."), "cash")); + } + r.push("You know how to haggle slaves. You can spend your free time putting your previous experience to use, proving another source of income however this isn't guaranteed."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>incursion specialist</strong> provides starting slaves with a free level of <span class='intelligent'>intelligence.</span> Also certain upgrades may be"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money", "cash")); + r.push("and you may find alternative approaches to"); + if (showSecExp) { + r.push("problems, but you will find"); + r.push(App.Encyclopedia.Dialog.linkDOM("authority", "Security Expansion", "darkviolet")); + r.push("quite hard to maintain."); + } else { + r.push("problems."); + } + r.push("Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Hacking", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + p.append(ul); + f.append(p); + + r = []; + let text; + if (showSecExp) { + text = "Hide SecExp details"; + } else { + r.push("Players using the"); + r.push(App.Encyclopedia.Dialog.linkDOM("Security Expansion", "Security Expansion")); + r.push("mod may want to view this page with"); + text = "additional details"; + } + r.push(App.UI.DOM.combineNodes(App.UI.DOM.link(text, () => { + $(outer).empty().append(content(!showSecExp)); + }), ".")); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Rumored acquisition options"); + ul = document.createElement("ul"); + r = []; + r.push("<strong>Hard Work</strong> provides a one-time bonus to both"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); + r.push("when a new slave is acquired."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Force</strong> means that if a slave does not have enough"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("to obey when acquired, this option will terrify her and reduce her"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); + r.push("to the point where she should comply."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Social Engineering</strong> means that you will start with the first societal option unlocked, since you manipulated the arcology's citizens."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Luck</strong> provides extra"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("at game start, but no ongoing advantages once the main game begins."); + App.Events.addNode(ul, r, "li"); + + App.UI.DOM.appendNewElement("p", f, ul); + + App.UI.DOM.appendNewElement("h3", f, "Age groups"); + r = []; + r.push("Older PCs enjoy easier"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("maintenance, but possess lower"); + r.push(App.Encyclopedia.Dialog.linkDOM("sexual energy", "Sexual Energy")); + r.push("while younger PC's are the opposite."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Body and gender options"); + r = []; + r.push("All PC body changes will alter scenes, but their main mechanical effect is on"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("maintenance. Feminine options will make it harder to maintain"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("without providing any gameplay advantage, making playing as a feminine PC a form of increased difficulty. There are other minor gameplay differences including differing slave reactions to the PC based on attraction, but these are fairly minor."); + App.Events.addParagraph(f, r); + + return f; + } }, "guide"); App.Encyclopedia.addCategory("guide", function() { diff --git a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw index dbf0e17244ea73b6179c50409250c34cd2befd42..6a04d89ac537a24e6928a720f69ac8161857219c 100644 --- a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw +++ b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw @@ -13,18 +13,6 @@ <<switch $encyclopedia>> -/********** -BEING IN CHARGE -**********/ -<<case "Arcologies and Reputation" "Being in Charge" "Costs Summary" "PC Skills" "Random Events" "Rules Assistant" "Sexual Energy" "The Corporation">> - <<= App.Encyclopedia.Dialog.linkSC("Arcologies and Reputation", "Arcologies and Reputation")>> - | <<= App.Encyclopedia.Dialog.linkSC("Random Events", "Random Events")>> - | <<= App.Encyclopedia.Dialog.linkSC("Costs Summary", "Costs Summary")>> - | <<= App.Encyclopedia.Dialog.linkSC("Rules Assistant", "Rules Assistant")>> - | <<= App.Encyclopedia.Dialog.linkSC("The Corporation", "The Corporation")>> - | <<= App.Encyclopedia.Dialog.linkSC("Sexual Energy", "Sexual Energy")>> - | <<= App.Encyclopedia.Dialog.linkSC("PC Skills", "PC Skills")>> - /********** SLAVES **********/ diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 6a7cffa56466401ecea9bf75c8667f54f845626a..07f5fd05e1d98c31c62c3dd8365c5684c8e48a81 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -507,11 +507,13 @@ App.UI.optionsPassage = function() { options.addOption("DebugMode is", "debugMode") .addValue("Enabled", 1).on().addValue("Disabled", 0).off() - .addComment("This will add a Display Variables and Bug Report passage to the sidebar."); + .addComment("This will add passages to Display Variables and create Bug Reports to the sidebar."); if (V.debugMode > 0) { - options.addOption("The custom function part of debug mode is", "debugModeCustomFunction") + options.addOption("<span class='choices'>The custom function part of debug mode is</span>", "debugModeCustomFunction") .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); + options.addOption("<span class='choices'>Event selection is</span>", "debugModeEventSelection") + .addValue("Manual", 1).on().addValue("Automatic", 0).off(); } option = options.addCustomOption("Genetics array") @@ -536,7 +538,7 @@ App.UI.optionsPassage = function() { options.addOption("CheatMode is", "cheatMode") .addValue("Enabled", 1).on().addValue("Disabled", 0).off() - .addComment("This will allow manual selection of events and unlock some options that would usually be restricted by progress."); + .addComment("This will unlock some options that would usually be restricted by progress."); if (V.cheatMode === 0) { el.append(options.render()); diff --git a/src/js/salon.js b/src/js/salon.js index 97336e536912f7ab25130de16962b814b53599ec..87ac19f472898a84be7c9f473b039729e17b3c88 100644 --- a/src/js/salon.js +++ b/src/js/salon.js @@ -226,13 +226,12 @@ App.Medicine.Modification.eyeSelector = function(entity, cheat = false) { /** * Update ears in salon * @param {App.Entity.SlaveState} slave - * @param {object} params - * @param {number|string} [params.primaryEarColor=0] - * @param {string} [params.secondaryEarColor=""] - * @param {boolean} [params.cheat=false] + * @param {boolean} [cheat=false] * @returns {HTMLElement} */ -App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColor = "", cheat = false} = {}) { +App.Medicine.Salon.ears = function(slave, cheat = false) { + let primaryEarColor = 0; + let secondaryEarColor = ""; let updatePrimary = (newVal) => { primaryEarColor = newVal; apply(); @@ -242,7 +241,6 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo apply(); }; const container = document.createElement("div"); - container.id = "salon-ears"; container.append(content()); return container; @@ -294,11 +292,10 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo `Color ${his} ears`, () => { slave.earTColor = (primaryEarColor + secondaryEarColor); - App.Art.refreshSlaveArt(slave, 3, "art-frame"); if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - App.Medicine.Salon.ears(slave); // discard selections after locking them in. + App.UI.reload(); } ) ); @@ -325,27 +322,20 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo function apply() { App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.ears( - slave, - { - primaryEarColor: primaryEarColor, - secondaryEarColor: secondaryEarColor, - } - ); + jQuery(container).empty().append(content()); } }; /** * Update hair in salon * @param {App.Entity.SlaveState} slave - * @param {object} params - * @param {number|string} [params.primaryTailColor] - * @param {string} [params.secondaryTailColor] - * @param {boolean} [params.cheat] - * @returns {JQuery<HTMLElement>} + * @param {boolean} [cheat] + * @returns {HTMLElement} */ -App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailColor = "", cheat = false} = {}) { - const frag = new DocumentFragment(); +App.Medicine.Salon.tail = function(slave, cheat = false) { + const container = document.createElement("div"); + let primaryTailColor = 0; + let secondaryTailColor = ""; let updatePrimary = (newVal) => { primaryTailColor = newVal.value; apply(); @@ -357,10 +347,10 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo const {His, his} = getPronouns(slave); if (slave.tail !== "none") { - frag.append(tailDye()); + container.append(tailDye()); } - return jQuery("#salon-tail").empty().append(frag); + return container; function tailDye() { const frag = new DocumentFragment(); @@ -376,11 +366,10 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo "Match current hair", () => { slave.tailColor = slave.hColor; - App.Art.refreshSlaveArt(slave, 3, "art-frame"); if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - apply(); + App.UI.reload(); } ) ); @@ -393,13 +382,13 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo div = document.createElement("div"); div.classList.add("choices"); - div.append(`Colors:`); + div.append(`Colors: `); div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary)); frag.append(div); div = document.createElement("div"); div.classList.add("choices"); - div.append(`Highlights:`); + div.append(`Highlights: `); div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); frag.append(div); @@ -415,7 +404,7 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - App.Medicine.Salon.tail(slave); // discard selections after locking them in. + App.UI.reload(); // discard selections after locking them in. } ) ); @@ -446,12 +435,6 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo function apply() { App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.tail( - slave, - { - primaryTailColor: primaryTailColor, - secondaryTailColor: secondaryTailColor, - } - ); + jQuery(container).empty().append(tailDye()); } }; diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js index 30a4ad03b8758af395585448cb8e52001d1bbb14..1131d3efaefdeb3811fb06127b53341eaf84a77b 100644 --- a/src/js/slaveListing.js +++ b/src/js/slaveListing.js @@ -813,13 +813,12 @@ App.UI.SlaveList.penthousePage = function() { } else { slaveWrapper.append(" as a Sexual Ambassador"); if (A.influenceTarget === -1) { - slaveWrapper.append(", but ", App.UI.DOM.makeElement("span", `${he} has no target to influence.`, "warning")); + slaveWrapper.append(", but ", App.UI.DOM.makeElement("span", `${he} has no target to influence. `, "warning")); } else { const targetName = V.arcologies.find(a => a.direction === A.influenceTarget).name; - slaveWrapper.append(` to ${targetName}.`); + slaveWrapper.append(` to ${targetName}. `); } } - slaveWrapper.append(". "); const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Manage Recruiter", "Recruiter Select"), "major-link"); link.id = "manageRecruiter"; slaveWrapper.append(link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("Recruiter Select"), "hotkey")); diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index e46a14a10471165eeef4441092fe66a6f7add545..88f0c8447abf2672e2ee7fafb35aa18cb8666573 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -79,13 +79,19 @@ App.UI.DOM.link = function(linkText, handler, args = [], passage = "", tooltip = const hArgs = Array.isArray(args) ? args : [args]; const link = document.createElement("a"); link.textContent = linkText; - link.title = tooltip; link.onclick = () => { handler(...hArgs); if (passage !== '') { SugarCube.Engine.play(passage); } }; + + if (tooltip) { + tippy(link, { + content: tooltip, + }); + } + return link; }; diff --git a/src/markets/gingering.js b/src/markets/gingering.js index cb83e9d00ea42441132f81b64b7b528ff194dadf..4a7deacf27c35f079597fa081e34bf9a4a35ab42 100644 --- a/src/markets/gingering.js +++ b/src/markets/gingering.js @@ -15,7 +15,7 @@ App.Entity.GingeringParameters = class { // figure out what type of gingering applies, if any if (applyLawCheck(market) === 1 && V.policies.SMR.honestySMR === 1) { /* SMR prohibits gingering and is enforced for this seller - do nothing */ - } else if (App.Data.misc.schools.keys().includes(market)) { + } else if (App.Data.misc.schools.has(market)) { /* slave schools have a reputation to maintain, and will never ginger their slaves */ } else if (["wetware", "heap", "gangs and smugglers", "low tier criminals", "military prison", "white collar", "corporate"].includes(market)) { /* these sellers see no reason to ginger their slaves */ diff --git a/src/npc/agent/agentFramework.js b/src/npc/agent/agentFramework.js index e2511101340aee998a0bd067c51b8dfca4e6c116..4b40cc952555dcbd4041e62255515242ba475b52 100644 --- a/src/npc/agent/agentFramework.js +++ b/src/npc/agent/agentFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.arcologyAgent = { shouldTalk: true, shouldThink: true, requiredDevotion: 21 - } + }, + decorated: false }; App.Entity.Facilities.AgentJob = class extends App.Entity.Facilities.ManagingJob { diff --git a/src/npc/importSlave.js b/src/npc/importSlave.js index 7c766b6483135b0da8d1f410af4083a51ba89412..857a98725c745601d9b322bef5626ed2904c1a6d 100644 --- a/src/npc/importSlave.js +++ b/src/npc/importSlave.js @@ -12,6 +12,7 @@ App.UI.SlaveInteract.importSlave = function() { App.Entity.Utils.SlaveDataSchemeCleanup(slave); newSlave(slave); SlaveDatatypeCleanup(slave); + removeJob(slave, slave.assignment); V.AS = slave.ID; Engine.play("Slave Interact"); } diff --git a/src/npc/interaction/fPCImpreg.js b/src/npc/interaction/fPCImpreg.js index 3a611a094d64aa7d4f7a50842f831a2d538ec835..88d1caa54decb7540485368b697a0d0624048a8a 100644 --- a/src/npc/interaction/fPCImpreg.js +++ b/src/npc/interaction/fPCImpreg.js @@ -264,7 +264,7 @@ App.Interact.fPCImpreg = function(slave) { text.push(`is <span class="pregnant">carrying your child.</span>`); } - if (V.arcologies[0].FSRestart !== 'unset' && (!slave.breedingMark || !V.propOutcome) && V.eugenicsFullControl) { + if (V.arcologies[0].FSRestart !== 'unset' && (!slave.breedingMark || V.propOutcome === 0) && V.eugenicsFullControl !== 1) { text.push(`Rumors spread about you fucking your slaves pregnant; the Societal Elite are <span class="reputation dec">very displeased</span> by these rumors.`); V.failedElite += 5; @@ -273,24 +273,18 @@ App.Interact.fPCImpreg = function(slave) { if (V.arcologies[0].FSGenderRadicalist !== 'unset' && slave.mpreg) { text.push(`Society <span class="reputation inc">approves</span> of your fucking your slaves' asses pregnant; this advances the ideal all a slave needs is ${his} rear.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderRadicalist += 0.05 * V.FSSingleSlaveRep; } else if (V.arcologies[0].FSGenderFundamentalist !== 'unset') { if (slave.mpreg) { text.push(`Society <span class="reputation inc">approves</span> of your putting a new slave in ${him}; this advances the idea that all slaves should bear their masters' babies.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(forceNeg(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel)), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderFundamentalist -= 0.05 * V.FSSingleSlaveRep; } else { text.push(`Society <span class="reputation dec">is disgusted</span> by this degenerate form of reproduction.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderFundamentalist += 0.05 * V.FSSingleSlaveRep; } } diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js index d9892207f7a09106fa15b875861cada7108dc621..462ed7dcdc89dad4876057982dc2230c61d0662e 100644 --- a/src/npc/startingGirls/startingGirls.js +++ b/src/npc/startingGirls/startingGirls.js @@ -780,7 +780,7 @@ App.StartingGirls.physical = function(slave, cheat = false) { () => { slave[limb][side] = null; }, - passage() + "" ); if (cheat && slave.PLimb) { option.addValueList([ @@ -799,7 +799,7 @@ App.StartingGirls.physical = function(slave, cheat = false) { () => { slave[limb][side] = new App.Entity.LimbState(); }, - passage() + "" ); } } @@ -901,7 +901,7 @@ App.StartingGirls.upper = function(slave, cheat = false) { ]); option.addValue("Cybernetic", 3, () => eyeSurgery(slave, side, "cybernetic")); if (V.seeExtreme === 1) { - option.customButton("Remove eye", () => eyeSurgery(slave, side, "remove"), passage()); + option.customButton("Remove eye", () => eyeSurgery(slave, side, "remove"), ""); } } option = options.addOption(`${capFirstChar(side)} pupil shape`, "pupil", slave.eye[side]) @@ -2000,7 +2000,7 @@ App.StartingGirls.stats = function(slave) { ["PCKnockedUp", "Times knocked up PC"], ["bestiality", "Bestiality"] ]); - options.addOption("Set all counters to 0", "counter", slave).customButton("Reset", () => slave.counter = new App.Entity.SlaveActionsCountersState(), passage()); + options.addOption("Set all counters to 0", "counter", slave).customButton("Reset", () => slave.counter = new App.Entity.SlaveActionsCountersState(), ""); for (const key of counters) { const title = titles.get(key) || capFirstChar(key); options.addOption(title, key, slave.counter) diff --git a/src/pregmod/FCTV/FCTV.js b/src/pregmod/FCTV/FCTV.js index 00ad0d706248bfa198f619d0c56829e8b98576f6..ea21b50cee00aed29f1ff71a5642e5e6b08618cc 100644 --- a/src/pregmod/FCTV/FCTV.js +++ b/src/pregmod/FCTV/FCTV.js @@ -97,7 +97,7 @@ globalThis.FctvDisplay = function() { p.append(` to turn on the TV and `); if (!usedRemote) { p.append(`set FCTV to find a random show. Your larger-than-life screen flashes on, and is soon playing content from the popular streaming service. `); - if (V.cheatMode > 0 || V.debugMode > 0 || V.FCTV.remote) { + if (V.cheatMode > 0 || (V.debugMode > 0 && V.debugModeEventSelection > 0) || V.FCTV.remote) { // Create "Use remote" link. Hide once clicked. span = document.createElement("span"); span.id = "use-remote"; @@ -114,7 +114,7 @@ globalThis.FctvDisplay = function() { p.append(span); } p.append(randomShow()); - } else if (usedRemote && (V.cheatMode > 0 || V.debugMode > 0 || V.FCTV.remote)) { + } else if (usedRemote && (V.cheatMode > 0 || (V.debugMode > 0 && V.debugModeEventSelection > 0) || V.FCTV.remote)) { p.append(`bring you the remote so you can choose whatever show you find interesting. `); if (selectedChannel === V.FCTV.channel.last) { App.UI.DOM.appendNewElement("div", p, `You tuned into this channel last week, you may want to choose something else.`); @@ -133,7 +133,7 @@ globalThis.FctvDisplay = function() { p.classList.add("FCTV"); span = document.createElement("span"); span.id = "remote"; - if (usedRemote && (V.cheatMode > 0 || V.debugMode > 0 || V.FCTV.remote)) { + if (usedRemote && (V.cheatMode > 0 || (V.debugMode > 0 && V.debugModeEventSelection > 0) || V.FCTV.remote)) { span.append(createRemote()); } p.append(span); @@ -225,7 +225,7 @@ globalThis.FctvDisplay = function() { ), ["fctv-remote-button"] ); - if (V.cheatMode > 0 || V.debugMode > 0) { + if (V.debugMode > 0 && V.debugModeEventSelection > 0) { App.UI.DOM.appendNewElement( "div", p, diff --git a/src/pregmod/FCTV/FCTVshows.js b/src/pregmod/FCTV/FCTVshows.js index d37f03e6a41d6c42e8dea7f2238f2c4aa68680a5..e079cd39682ac44417bd0027e694ba20d3258aff 100644 --- a/src/pregmod/FCTV/FCTVshows.js +++ b/src/pregmod/FCTV/FCTVshows.js @@ -93,7 +93,7 @@ App.Data.FCTV.actors = { const slave = BaseSlave(); slave.devotion = 0; slave.trust = 0; - slave.muscles = 600; + slave.muscles = 60; slave.boobs = 700; slave.butt = 3; slave.hLength = 50; diff --git a/src/pregmod/eliteBreedingExam.js b/src/pregmod/eliteBreedingExam.js index 1db30d9ce6811a2b593912b65e7eee31f1335b8f..3cf0f12c73e8293e50a8f00d947ad669ab897aa4 100644 --- a/src/pregmod/eliteBreedingExam.js +++ b/src/pregmod/eliteBreedingExam.js @@ -1,4 +1,5 @@ globalThis.eliteBreedingExam = function(slave = null) { + const frag = new DocumentFragment(); const eliteAngered = V.failedElite > 100; const SlaveProfessionalismEstablished = V.arcologies[0].FSSlaveProfessionalism > 20; const preferYounger = V.arcologies[0].FSYouthPreferentialist > 20; @@ -12,12 +13,12 @@ globalThis.eliteBreedingExam = function(slave = null) { const result = function() { if (slave) { if (test === true) { - return `<span class="lime">PASSED</span>`; + return App.UI.DOM.makeElement("span", "PASSED", "lime"); } else if (fixable) { - return `<span class="yellow">Within fixable range.</span>`; + return App.UI.DOM.makeElement("span", "Within fixable range.", "yellow"); } else { passing--; - return `<span class="red">FAILED</span>`; + return App.UI.DOM.makeElement("span", "FAILED", "red"); } } return ``; @@ -31,31 +32,33 @@ globalThis.eliteBreedingExam = function(slave = null) { } else { r.push(`${slave.slaveName} is up for review:`); } - + App.Events.addNode(frag, r, "div"); + r = []; + const list = App.UI.DOM.appendNewElement("ul", frag); if (slave) { test = slave.intelligence + slave.intelligenceImplant >= (eliteAngered ? 95 : 50); } - r.push(`Must be ${eliteAngered ? 'highly intelligent' : 'very smart'}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${eliteAngered ? 'highly intelligent' : 'very smart'}. `).append(result()); if (slave) { test = Beauty(slave) >= (eliteAngered ? 120 : 100); } - r.push(`Must be ${eliteAngered ? 'unbelievably' : ''} beautiful. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${eliteAngered ? 'unbelievably' : ''} beautiful. `).append(result()); if (slave) { test = slave.face >= (eliteAngered ? 95 : 40); } - r.push(`Their face must be ${eliteAngered ? 'breathtaking' : 'gorgeous'}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Their face must be ${eliteAngered ? 'breathtaking' : 'gorgeous'}. `).append(result()); if (slave) { test = slave.chem <= 20; } - r.push(`Their health must not be overly impacted by drug use. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Their health must not be overly impacted by drug use. `).append(result()); if (slave) { test = slave.addict === 0; } - r.push(`They must not be addicted to drugs. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `They must not be addicted to drugs. `).append(result()); if (V.arcologies[0].FSMaturityPreferentialist > 20 || V.arcologies[0].FSYouthPreferentialist > 20) { const targetAge = 24; @@ -66,23 +69,23 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.physicalAge < targetAge; } } - r.push(`Must be ${preferYounger ? 'younger' : 'older'} than ${targetAge}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${preferYounger ? 'younger' : 'older'} than ${targetAge}. `).append(result()); } if (V.arcologies[0].FSIntellectualDependency > 20) { if (slave) { test = slave.energy >= 96; } - r.push(`Must be sexually receptive at all times. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be sexually receptive at all times. `).append(result()); } else if (V.arcologies[0].FSSlaveProfessionalism > 20) { if (slave) { test = slave.skill.vaginal + slave.skill.anal + slave.skill.oral + slave.skill.entertainment + slave.skill.whoring >= (eliteAngered ? 500 : 400); } - r.push(`Must be capable of mastering skills. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be capable of mastering skills. `).append(result()); if (slave) { test = slave.accent <= 1; } - r.push(`Must be capable of eloquent and accurate speech. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be capable of eloquent and accurate speech. `).append(result()); } if (V.arcologies[0].FSPetiteAdmiration > 20 || V.arcologies[0].FSStatuesqueGlorification > 20) { const targetHeight = V.arcologies[0].FSPetiteAdmiration > 20 ? 150 : 186; @@ -90,16 +93,16 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = (slave.height - (slave.heightImplant * 10)) < targetHeight; } - r.push(`Must naturally be very short. (${targetHeight} cm) ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very short. (${targetHeight} cm) `).append(result()); if (slave) { test = (slave.height - (slave.heightImplant * 10)) < Height.mean(slave) - 15; } - r.push(`Must naturally be very short for their age. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very short for their age. `).append(result()); } else if (V.arcologies[0].FSStatuesqueGlorification > 20) { if (slave) { test = (slave.height - (slave.heightImplant * 10)) > targetHeight; } - r.push(`Must naturally be very tall. (${targetHeight} cm) ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very tall. (${targetHeight} cm) `).append(result()); } } @@ -109,12 +112,12 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.race === targetRace; } - r.push(`Must be ${targetRace}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${targetRace}. `).append(result()); } else { if (slave) { test = slave.race !== targetRace; } - r.push(`Must not be ${targetRace}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must not be ${targetRace}. `).append(result()); } } @@ -122,22 +125,22 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.dick >= 1 && slave.balls >= 1; } - r.push(`Must have a functional penis. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a functional penis. `).append(result()); } else if (V.arcologies[0].FSGenderFundamentalist > 20) { if (slave) { test = slave.dick === 0 && slave.balls === 0; } - r.push(`Must be physically female. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be physically female. `).append(result()); } if (V.arcologies[0].FSPaternalist > 20) { if (slave) { test = slave.intelligenceImplant >= (SlaveProfessionalismEstablished ? 30 : 15); } - r.push(`Must be ${SlaveProfessionalismEstablished ? 'well' : ''} educated. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${SlaveProfessionalismEstablished ? 'well' : ''} educated. `).append(result()); if (slave) { test = slave.health.condition >= 60; } - r.push(`Must be in good health. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be in good health. `).append(result()); // } else if (V.arcologies[0].FSDegradationist > 20) { } @@ -145,18 +148,18 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.intelligenceImplant >= 15; } - r.push(`Must be well educated. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be well educated. `).append(result()); } if (V.arcologies[0].FSBodyPurist > 20) { if (slave) { test = slave.chem <= (eliteAngered ? 0 : 15); } - r.push(`Must have low carcinogen levels. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have low carcinogen levels. `).append(result()); if (slave) { test = slave.boobsImplant + slave.buttImplant + slave.lipsImplant + slave.hipsImplant + slave.shouldersImplant === 0 && slave.faceImplant <= 5 && slave.bellyImplant === -1; } - r.push(`Must be implant free. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be implant free. `).append(result()); // } else if (V.arcologies[0].FSTransformationFetishist > 20) { // idealSlave.chem = 20; } @@ -165,33 +168,33 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.weight <= (partyAnimal ? 30 : 0); } if (partyAnimal) { - r.push(`May be no larger than "plush". ${result()}`); + App.UI.DOM.appendNewElement("li", list, `May be no larger than "plush". `).append(result()); } else { - r.push(`Must be thin. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be thin. `).append(result()); } if (slave) { test = slave.butt <= 2; } - r.push(`Must have a trim rear. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a trim rear. `).append(result()); if (slave) { test = slave.boobs <= 400; } - r.push(`Must have a sleek chest. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a sleek chest. `).append(result()); } else if (V.arcologies[0].FSAssetExpansionist > 20) { if (slave) { test = (slave.butt - slave.buttImplant) >= 6; } - r.push(`Must have a naturally gigantic rear. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a naturally gigantic rear. `).append(result()); if (slave) { test = (slave.boobs - slave.boobsImplant) >= 1000; } - r.push(`Must be naturally busty. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be naturally busty. `).append(result()); } if (V.arcologies[0].FSPastoralist > 20) { if (slave) { test = slave.lactation === 1; } - r.push(`Must be lactating naturally. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be lactating naturally. `).append(result()); } if (V.arcologies[0].FSPhysicalIdealist > 20) { if (V.arcologies[0].FSPhysicalIdealistLaw === 1) { @@ -200,7 +203,7 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.weight <= 30; } - r.push(`Must not be overweight. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must not be overweight. `).append(result()); if (slave) { test = slave.muscles.isBetween(musclesMin, musclesMax); fixable = (slave.muscles <= musclesMin && slave.muscles > musclesMax - musclesMin) || (slave.muscles >= musclesMax && slave.muscles < musclesMin + 30); @@ -208,12 +211,12 @@ globalThis.eliteBreedingExam = function(slave = null) { passing = 2; } } - r.push(`Must be fit, but not too muscular. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be fit, but not too muscular. `).append(result()); } else { if (slave) { test = slave.muscles > 95; } - r.push(`Must be extremely muscular. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be extremely muscular. `).append(result()); } } else if (V.arcologies[0].FSHedonisticDecadence > 20) { const targetWeight = V.arcologies[0].FSSlimnessEnthusiast > 20 ? 10 : 95; @@ -221,9 +224,9 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.weight > targetWeight; } if (V.arcologies[0].FSSlimnessEnthusiast > 20) { - r.push(`Must be more than "trim". ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be more than "trim". `).append(result()); } else { - r.push(`Must be big, soft and fat. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be big, soft and fat. `).append(result()); } } @@ -243,6 +246,6 @@ globalThis.eliteBreedingExam = function(slave = null) { } cashX(-cost, "capEx"); } - - return r.map(t => `<div>${t}</div>`).join(""); + App.Events.addNode(frag, r, "div"); + return frag; }; diff --git a/src/pregmod/managePersonalAffairs.js b/src/pregmod/managePersonalAffairs.js index cc591564431ba01a000cb4de23b3b19fcd1716f1..9c5a9460b3813b3604e79b9d09a0f9b2e7d3eb13 100644 --- a/src/pregmod/managePersonalAffairs.js +++ b/src/pregmod/managePersonalAffairs.js @@ -1129,7 +1129,7 @@ App.UI.managePersonalAffairs = function() { function breederExam() { App.UI.DOM.appendNewElement("h2", breederExamDiv, `Elite Breeder Qualifications`); - App.Events.addNode(breederExamDiv, [eliteBreedingExam()]); + breederExamDiv.append(eliteBreedingExam()); return breederExamDiv; } diff --git a/src/uncategorized/PESS.tw b/src/uncategorized/PESS.tw index b9a614a2f4fae061c3708ecc1bc3fdaa4ceb407b..bf16a27359639fd4676eab13b952a96fb4a5b463 100644 --- a/src/uncategorized/PESS.tw +++ b/src/uncategorized/PESS.tw @@ -24,7 +24,7 @@ <<if Array.isArray($PESSevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random single slave event would have been selected from the following:'' <br> @@ -635,7 +635,7 @@ $He sees you examining at $him, and looks back at you submissively, too tired to <br>ERROR: bad PESS event $PESSevent <</switch>> -<<if $cheatMode == 1>> +<<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/uncategorized/PETS.tw b/src/uncategorized/PETS.tw index 9dea1f679fb981190e059363a442aa945a305a51..21ae86029cd23548bc3d2270e1c9e595057a8f96 100644 --- a/src/uncategorized/PETS.tw +++ b/src/uncategorized/PETS.tw @@ -24,7 +24,7 @@ <<if Array.isArray($PETSevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random two slave event would have been selected from the following:'' <br> @@ -363,7 +363,7 @@ You decide to knit up care's raveled sleave with a break in the spa. You have yo <br>ERROR: bad PETS event $PETSevent <</switch>> -<<if $cheatMode == 1>> +<<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/uncategorized/REFS.tw b/src/uncategorized/REFS.tw index 176d914f34e55baf3ab819bb96d8fe495efa8f38..48e119d2380cd6be003a6cac842fab038516de38 100644 --- a/src/uncategorized/REFS.tw +++ b/src/uncategorized/REFS.tw @@ -23,7 +23,7 @@ /* Some scenes are also stored in useGuard.tw, walkPast.tw, and toychest.tw */ <<if Array.isArray($REFSevent)>> - <<if $cheatMode === 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random future societies event would have been selected from the following:'' <br> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index db0b8d9ab0cbda1337a546d52865ef07bb251ab5..e497162eecb3ad64120416d70cf4219637194ca4 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -24,7 +24,7 @@ <<if Array.isArray($RESSevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random single slave event would have been selected from the following:'' <br> @@ -16685,7 +16685,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<else>> $He indicates the steel rings that frame $his holes and keep them defenseless. "I know I'm ju<<s>>t a collection of fuckhole<<s>>," $he adds. <</if>> - $He sounds like $he's trying to convince $himself, but $his @@.hotpink;abasement us not feigned.@@ + $He sounds like $he's trying to convince $himself, but $his @@.hotpink;abasement is not feigned.@@ <<set $activeSlave.devotion += 5, $activeSlave.trust -= 5>> <</replace>> <</link>> @@ -16875,7 +16875,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <br>ERROR: bad RESS event $RESSevent <</switch>> -<<if $cheatMode == 1>> +<<if $debugMode > 0 && $debugModeEventSelection > 0>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/uncategorized/RESSTR.tw b/src/uncategorized/RESSTR.tw index 7cc46776a8407e6d208a6eed764affc1295373b9..44fb58cf01f85fda3c04f2c107fd734f599e8e5d 100644 --- a/src/uncategorized/RESSTR.tw +++ b/src/uncategorized/RESSTR.tw @@ -24,7 +24,7 @@ <<if Array.isArray($RESSTRevent)>> <<set $activeSlave = $eventSlave>> - <<if $cheatMode == 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random event would have been selected from the following:'' <br> @@ -68,7 +68,7 @@ <br>ERROR: bad RESSTR event $RESSTRevent <</switch>> - <<if $cheatMode == 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][$activeSlave = 0, $eventSlave = 0]] <</if>> diff --git a/src/uncategorized/randomIndividualEvent.tw b/src/uncategorized/randomIndividualEvent.tw index fca571696d41b738d6797fa86c10443aa5f48bae..30c5424c9e4f1751959225506830d6759e377273 100644 --- a/src/uncategorized/randomIndividualEvent.tw +++ b/src/uncategorized/randomIndividualEvent.tw @@ -1,7 +1,7 @@ :: Random Individual Event [nobr] <<if $eventSlave == 0>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $nextButton = "Refresh", $nextLink = "Random Individual Event", $returnTo = "Random Individual Event", $encyclopedia = "Random Events">> <<link "Skip week-end events" "Next Week">><</link>> @@ -31,7 +31,7 @@ /* EVENT RANDOMIZATION */ <<set $events = populateEventArray().concat(App.Events.getIndividualEventsPassageList($eventSlave))>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0 && $debugModeEventSelection > 0)>> <<goto "random event select">> <<else>> <<goto "random event roll">> diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw index dc7ae13b84ab1b5ea909f20ce4757215dae5f6f5..0ff23eaafbc12a8a59fc9aa71809e29d0abe6d7a 100644 --- a/src/uncategorized/randomNonindividualEvent.tw +++ b/src/uncategorized/randomNonindividualEvent.tw @@ -2,7 +2,7 @@ <<if $eventSlave == 0>> <<set $eventSlave = $slaves.random()>> - <<if $cheatMode == 1>> + <<if ($debugMode > 0) && ($debugModeEventSelection > 0)>> <<set $nextButton = "Refresh", $nextLink = "Random Nonindividual Event", $returnTo = "Random Nonindividual Event", $encyclopedia = "Random Events">> <<link "Skip week-end events" "Next Week">><</link>> @@ -19,9 +19,11 @@ <<goto "Random Nonindividual Event">> <</if>> <<else>> - <<silently>> + /* <<silently>> */ /* initialize event lists as arrays [], not objects {} */ <<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, _recruitEvents = []>> + /* FIXME: almost none of the events that use this condition do so correctly. 50 || 25 is 50, not 25. */ + <<set _oneIfDebug = ($debugMode > 0 && $debugModeEventSelection > 0) ? 1 : 0>> <<if $week >= 10>> <<set $events.push("P associates public slut")>> @@ -313,25 +315,25 @@ <<if $seePreg != 0>> <<if $seeHyperPreg == 1>> - <<if $arcologies[0].FSRestart == "unset" && ((random(1,100) <= 5) || $cheatMode)>> + <<if $arcologies[0].FSRestart == "unset" && ((random(1,100) <= 5) || ($debugMode > 0 && $debugModeEventSelection > 0))>> <<set $RecETSevent.push("desperate broodmother")>> <</if>> <</if>> <</if>> - <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<if (($rep/400) > random(1,100)) || ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $RecETSevent.push("identical pair")>> <</if>> - <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<if (($rep/400) > random(1,100)) || ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $RecETSevent.push("posh mother daughter")>> <</if>> <<if $seeIncest != 0>> - <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<if (($rep/400) > random(1,100)) || ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $RecETSevent.push("incest sister sister")>> <</if>> - <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<if (($rep/400) > random(1,100)) || ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $RecETSevent.push("incest twin sister")>> <</if>> - <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<if (($rep/400) > random(1,100)) || ($debugMode > 0 && $debugModeEventSelection > 0)>> <<set $RecETSevent.push("incest mother daughter")>> <</if>> <</if>> @@ -346,37 +348,37 @@ <<if (_S.HeadGirl && _S.HeadGirl.devotion > 50)>> <<set $RecETSevent.push("mismatched pair")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("matched pair")>> <</if>> <<if $seeIncest != 0>> <<if $seePreg != 0>> - <<if ($rep/400) > (random(1,100) || $cheatMode) && $arcologies[0].FSRestart == "unset">> + <<if ($rep/400) > (random(1,100) || _oneIfDebug) && $arcologies[0].FSRestart == "unset">> <<set $RecETSevent.push("identical herm pair")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode) && $arcologies[0].FSRestart == "unset">> + <<if ($rep/400) > (random(1,100) || _oneIfDebug) && $arcologies[0].FSRestart == "unset">> <<set $RecETSevent.push("incest mother son")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode) && $arcologies[0].FSRestart == "unset">> + <<if ($rep/400) > (random(1,100) || _oneIfDebug) && $arcologies[0].FSRestart == "unset">> <<set $RecETSevent.push("incest father daughter")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("incest brother sister")>> <</if>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("incest twins mixed")>> <</if>> <</if>> <</if>> <<if $seeIncest != 0>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("incest brother brother")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("incest twin brother")>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("incest father son")>> <</if>> <</if>> @@ -408,224 +410,224 @@ <<set $malefactor.push("passfail")>> <</if>> <<set $malefactor = $malefactor.random()>> - <<if ($rep/150) > (random(1,100) || $cheatMode)>> + <<if ($rep/150) > (random(1,100) || _oneIfDebug)>> <<set _recruitEvents.push("RE malefactor")>> <</if>> <</if>> - <<if ($rep/400) > (random(1,100) || $cheatMode)>> + <<if ($rep/400) > (random(1,100) || _oneIfDebug)>> <<set $RecETSevent.push("addict mother daughter")>> <</if>> <<if $FSAnnounced == 1>> <<set $FSAcquisitionEvents = []>> - <<if $arcologies[0].FSSupremacist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSupremacist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Supremacist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSubjugationist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSubjugationist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Subjugationist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSGenderRadicalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSGenderRadicalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Gender Radicalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSRepopulationFocus > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSRepopulationFocus > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Repopulation Efforts")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSRestart > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSRestart > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Eugenics")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <<if $seePreg != 0>> - <<if $arcologies[0].FSGenderFundamentalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSGenderFundamentalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Gender Fundamentalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <</if>> - <<if $arcologies[0].FSPaternalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPaternalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Paternalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSDegradationist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSDegradationist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Degradationist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSIntellectualDependency > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSIntellectualDependency > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Intellectual Dependency")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSlaveProfessionalism > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSlaveProfessionalism > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Slave Professionalism")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSBodyPurist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSBodyPurist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Body Purist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSTransformationFetishist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSTransformationFetishist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Transformation Fetishist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSPetiteAdmiration > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPetiteAdmiration > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Petite Admiration")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSStatuesqueGlorification > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSStatuesqueGlorification > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Statuesque Glorification")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSYouthPreferentialist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSYouthPreferentialist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Youth Preferentialist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSMaturityPreferentialist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSMaturityPreferentialist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Maturity Preferentialist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSlimnessEnthusiast > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSlimnessEnthusiast > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Slimness Enthusiast")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSAssetExpansionist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSAssetExpansionist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Asset Expansionist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <<if $seePreg != 0>> - <<if $arcologies[0].FSPastoralist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPastoralist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Pastoralist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <</if>> - <<if $arcologies[0].FSPhysicalIdealist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPhysicalIdealist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Physical Idealist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSHedonisticDecadence > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSHedonisticDecadence > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Hedonistic Decadence")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSChattelReligionist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSChattelReligionist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Chattel Religionist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSupremacist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSupremacist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Supremacist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSubjugationist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSubjugationist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Subjugationist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSGenderRadicalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSGenderRadicalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Gender Radicalist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <<if $seePreg != 0>> - <<if $arcologies[0].FSGenderFundamentalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSGenderFundamentalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Gender Fundamentalist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> <</if>> - <<if $arcologies[0].FSPaternalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPaternalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Paternalist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSDegradationist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSDegradationist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Degradationist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSIntellectualDependency > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSIntellectualDependency > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Intellectual Dependency Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSlaveProfessionalism > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSlaveProfessionalism > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Slave Professionalism Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSBodyPurist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSBodyPurist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Body Purist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSTransformationFetishist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSTransformationFetishist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Transformation Fetishist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSPetiteAdmiration > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPetiteAdmiration > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Petite Admiration Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSStatuesqueGlorification > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSStatuesqueGlorification > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Statuesque Glorification Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSYouthPreferentialist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSYouthPreferentialist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Youth Preferentialist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSMaturityPreferentialist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSMaturityPreferentialist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Maturity Preferentialist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSSlimnessEnthusiast > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSSlimnessEnthusiast > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Slimness Enthusiast Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSAssetExpansionist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSAssetExpansionist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Asset Expansionist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSPastoralist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPastoralist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Pastoralist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSPhysicalIdealist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSPhysicalIdealist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Physical Idealist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSHedonisticDecadence > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSHedonisticDecadence > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Hedonistic Decadence Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSChattelReligionist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSChattelReligionist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Chattel Religionist Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSRepopulationFocus > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSRepopulationFocus > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Repopulation Efforts Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSRestart > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSRestart > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Eugenics Two")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSRomanRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSRomanRevivalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Roman Revivalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSNeoImperialist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Neo Imperialist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSAztecRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSAztecRevivalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Aztec Revivalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSEdoRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSEdoRevivalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Edo Revivalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSArabianRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSArabianRevivalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Arabian Revivalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSChineseRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSChineseRevivalist > (random(1,100) || _oneIfDebug)>> <<set $FSAcquisitionEvents.push("Chinese Revivalist")>> <<set _recruitEvents.push("RE FS acquisition")>> <</if>> - <<if $arcologies[0].FSEgyptianRevivalist > (random(1,100) || $cheatMode)>> + <<if $arcologies[0].FSEgyptianRevivalist > (random(1,100) || _oneIfDebug)>> <<set _recruitEvents.push("RE FSEgyptianRevivalist acquisition")>> <</if>> <<set $FSNonconformistEvents = []>> @@ -1016,7 +1018,7 @@ <</if>> <</if>> - <<if minimumSlaveCost() > 3000 && (random(1,2) == 1 || $cheatMode)>> + <<if minimumSlaveCost() > 3000 && (random(1,2) == 1 || ($debugMode > 0 && $debugModeEventSelection > 0))>> <<set $events.push("RE shipping container")>> <</if>> @@ -1025,14 +1027,14 @@ <</if>> <<if $mercenaries > 0>> - <<if (random(1,2) == 1 || $cheatMode)>> + <<if (random(1,2) == 1 || ($debugMode > 0 && $debugModeEventSelection > 0))>> <<set $events.push("RE AWOL")>> <<else>> <<set $events.push("RE Poker Night")>> <</if>> <</if>> - <<if ($arcologies[0].prosperity >= 100 && ($rep > random(1,30000)) || $cheatMode)>> + <<if ($arcologies[0].prosperity >= 100 && ($rep > random(1,30000)) || _oneIfDebug)>> <<set _milfSlaves = $slaves.filter(function(s) { return s.devotion > 20 && canTalk(s) && canWalk(s) && (s.assignment == "serve the public" || s.assignment == "serve in the club"); })>> <<if _milfSlaves.length > 0>> <<set $events.push("RE milf tourist")>> @@ -1051,7 +1053,7 @@ <<else>> <<set $events.push("RE citizen hookup")>> <</if>> - <<if ($rep-10000 > random(1,10000) || $cheatMode)>> + <<if ($rep-10000 > random(1,10000) || ($debugMode > 0 && $debugModeEventSelection > 0))>> <<if ($PC.vagina > 0 && $PC.boobs >= 300 && $PC.title == 0) && (random(0,99) < $seeDicks)>> <<set $events.push("RE male arcology owner")>> <<else>> @@ -1074,43 +1076,43 @@ /* FUTURE SOCIETY EVENTS */ - <<if $arcologies[0].FSBodyPurist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSBodyPurist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("body purism encounter")>> <</if>> - <<if $arcologies[0].FSTransformationFetishist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSTransformationFetishist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("transformation fetishism encounter")>> <</if>> - <<if $arcologies[0].FSYouthPreferentialist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSYouthPreferentialist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("youth preferentialist encounter")>> <</if>> - <<if $arcologies[0].FSMaturityPreferentialist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSMaturityPreferentialist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("maturity preferentialist encounter")>> <</if>> - <<if $arcologies[0].FSPastoralist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSPastoralist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("pastoralist encounter")>> <</if>> - <<if $arcologies[0].FSPhysicalIdealist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSPhysicalIdealist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("physical idealist encounter")>> <</if>> - <<if $arcologies[0].FSPaternalist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSPaternalist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("paternalist encounter")>> <</if>> - <<if $arcologies[0].FSDegradationist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSDegradationist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("degradationist encounter")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(25,100) || $cheatMode+24) && $arcologies[0].FSNeoImperialistLaw1 == 1>> + <<if $arcologies[0].FSNeoImperialist > (random(25,100) || _oneIfDebug+24) && $arcologies[0].FSNeoImperialistLaw1 == 1>> <<set $REFSevent.push("knightly duel")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(25,100) || $cheatMode+24) && $arcologies[0].FSNeoImperialistLaw2 == 1 && $newBaron == 1>> + <<if $arcologies[0].FSNeoImperialist > (random(25,100) || _oneIfDebug+24) && $arcologies[0].FSNeoImperialistLaw2 == 1 && $newBaron == 1>> <<set $REFSevent.push("dead baron")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(25,100) || $cheatMode+24) && $arcologies[0].FSNeoImperialistLaw2 == 1>> + <<if $arcologies[0].FSNeoImperialist > (random(25,100) || _oneIfDebug+24) && $arcologies[0].FSNeoImperialistLaw2 == 1>> <<set $REFSevent.push("baron demand")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(25,100) || $cheatMode+24) && $arcologies[0].FSNeoImperialistLaw2 == 1 && $arcologies[0].FSNeoImperialistLaw1 == 1 && $policies.regularParties == 1>> + <<if $arcologies[0].FSNeoImperialist > (random(25,100) || _oneIfDebug+24) && $arcologies[0].FSNeoImperialistLaw2 == 1 && $arcologies[0].FSNeoImperialistLaw1 == 1 && $policies.regularParties == 1>> <<set $REFSevent.push("feast")>> <</if>> - <<if $arcologies[0].FSNeoImperialist > (random(25,100) || $cheatMode+24)>> + <<if $arcologies[0].FSNeoImperialist > (random(25,100) || _oneIfDebug+24)>> <<set $REFSevent.push("warhound")>> <</if>> @@ -1137,11 +1139,11 @@ <<set _recruitEvents.length = _maxRecruitNumber>> <</if>> <<set $events = $events.concat(_recruitEvents).concat(App.Events.getNonindividualEventsPassageList())>> - <<if $cheatMode == 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<goto "random event select">> <<else>> <<goto "random event roll">> <</if>> - <</silently>> + /* <</silently>>*/ <</if>> /* CLOSES SLAVE SELECT */ diff --git a/src/uncategorized/reFSAcquisition.tw b/src/uncategorized/reFSAcquisition.tw index 622f2b83f4b832e0326d267a86e55b828c1f2b09..2aaac0a9f4ca4ec7da765084dc84f7d1e2c4e567 100644 --- a/src/uncategorized/reFSAcquisition.tw +++ b/src/uncategorized/reFSAcquisition.tw @@ -1,7 +1,7 @@ :: RE FS acquisition [nobr] <<if Array.isArray($FSAcquisitionEvents)>> - <<if $cheatMode == 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ ''A random FS acquisition event would have been selected from the following:'' <br> @@ -1475,7 +1475,7 @@ //You lack the necessary funds to enslave $him.// <</if>> -<<if $cheatMode == 1>> +<<if $debugMode > 0 && $debugModeEventSelection > 0>> <br><br>DEBUG: [[Go back to Nonrandom Event|Nonrandom Event][_slave = 0, $eventSlave = 0]] <</if>> diff --git a/src/uncategorized/recETS.tw b/src/uncategorized/recETS.tw index 7a2dbd4b76776ce9a593547648bec5ee59b4ab04..7420dcd4d6544d32b3b3d0b8fc77d2b474754615 100644 --- a/src/uncategorized/recETS.tw +++ b/src/uncategorized/recETS.tw @@ -2,7 +2,7 @@ <<if Array.isArray($RecETSevent)>> <<set _slave = $eventSlave>> - <<if $cheatMode === 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */ <div style="font-weight:bold"> A random two slave recruitment event would have been selected from the following: @@ -12,37 +12,35 @@ <<print "[[$RecETSevent[_i]|RecETS][$RecETSevent = $RecETSevent[" + _i + "]]]">> </div> <</for>> - <<if $debugMode === 1>> - <div> - For debug purposes, the following scenes would not have been selected but can be chosen. - </div> - <<set _allEvents = [ - "addict mother daughter", - "posh mother daughter", - "incest mother son", - "incest father daughter", - "incest brother sister", - "incest sister sister", - "incest brother brother", - "incest twin sister", - "incest twin brother", - "incest twins mixed", - "incest mother daughter", - "incest father son", - "mismatched pair", - "matched pair", - "identical pair", - "identical herm pair", - "desperate broodmother" - ]>> - <<for _i = 0; _i < _allEvents.length; _i++>> - <<if !$RecETSevent.includes(_allEvents[_i])>> - <div> - <<print "[[_allEvents[_i]|RecETS][$RecETSevent = _allEvents[" + _i + "]]]">> - </div> - <</if>> - <</for>> - <</if>> + <div> + For debug purposes, the following scenes would not have been selected but can be chosen. + </div> + <<set _allEvents = [ + "addict mother daughter", + "posh mother daughter", + "incest mother son", + "incest father daughter", + "incest brother sister", + "incest sister sister", + "incest brother brother", + "incest twin sister", + "incest twin brother", + "incest twins mixed", + "incest mother daughter", + "incest father son", + "mismatched pair", + "matched pair", + "identical pair", + "identical herm pair", + "desperate broodmother" + ]>> + <<for _i = 0; _i < _allEvents.length; _i++>> + <<if !$RecETSevent.includes(_allEvents[_i])>> + <div> + <<print "[[_allEvents[_i]|RecETS][$RecETSevent = _allEvents[" + _i + "]]]">> + </div> + <</if>> + <</for>> <p> [[Go Back to Random Nonindividual Event|Random Nonindividual Event][$eventSlave = 0]] @@ -1574,7 +1572,7 @@ </div> <</if>> - <<if $cheatMode === 1>> + <<if $debugMode > 0 && $debugModeEventSelection > 0>> <p> DEBUG: <span class="indent">