diff --git a/src/endWeek/economics/arcmgmt.js b/src/endWeek/economics/arcmgmt.js index 18d65bc6f54450832cf745091d75fcc2a01bf88b..fef8be08a884c1d9d7c7d8dba98ab4d6b22c5314 100644 --- a/src/endWeek/economics/arcmgmt.js +++ b/src/endWeek/economics/arcmgmt.js @@ -1122,21 +1122,13 @@ App.EndWeek.arcManagement = function() { lowerClassP *= 1.01; middleClass += 40; middleClassP *= 1.005; - upperClass += -13.5; - upperClassP *= 0.995; - topClass += -5; - topClassP *= 0.99; - r.push(`The rent promotion for new immigrants brings new citizens to the arcology.`); + r.push(`The rent promotion for new immigrants brings new citizens to the arcology, especially lower-income ones.`); } if (V.policies.immigrationRep === 1) { - lowerClass += 200; - lowerClassP *= 1.01; - middleClass += 40; - middleClassP *= 1.005; - upperClass += -13.5; - upperClassP *= 0.995; - topClass += -5; - topClassP *= 0.99; + upperClass += 15; + upperClassP *= 1.01; + topClass += 5; + topClassP *= 1.01; r.push(`Your welcome program for new citizens helps encourage wealthy people from the old world to immigrate, but <span class="red">annoys some longstanding citizens.</span>`); repX(forceNeg(100), "policies"); } @@ -1145,10 +1137,10 @@ App.EndWeek.arcManagement = function() { lowerClassP *= 0.99; middleClass += -40; middleClassP *= 0.995; - upperClass += 13.5; - upperClassP *= 1.005; - topClass += 5; - topClassP *= 1.01; + upperClass += -13.5; + upperClassP *= 0.995; + topClass += -5; + topClassP *= 0.99; const informationCash = random(500, 1500); cashX(informationCash, "policies"); r.push(`You covertly <span class="yellowgreen">sell</span> the private information of potential arcology immigrants on the old world black market, making you ${cashFormat(informationCash)}.`); @@ -1158,10 +1150,10 @@ App.EndWeek.arcManagement = function() { lowerClassP *= 0.99; middleClass += -40; middleClassP *= 0.995; - upperClass += 13.5; - upperClassP *= 1.005; - topClass += 5; - topClassP *= 1.01; + upperClass += -13.5; + upperClassP *= 0.995; + topClass += -5; + topClassP *= 0.99; r.push(`You allow citizens input on potential immigrants, a <span class="green">popular</span> program.`); repX(100, "policies"); } diff --git a/src/endWeek/reports/personalAttention.js b/src/endWeek/reports/personalAttention.js index 8059cc8bfb0b369406c145bd2c23bae44157b106..0f4856c67014b49bf1525db68e50cf7aa812dee8 100644 --- a/src/endWeek/reports/personalAttention.js +++ b/src/endWeek/reports/personalAttention.js @@ -3944,7 +3944,7 @@ App.PersonalAttention.slaveReport = function(slave) { } else { r.push(`${He} becomes`); r.push(App.UI.DOM.makeElement("span", `sexually self hating,`, ["yellow"])); - r.push(`and tearfully begs to you do worse to ${him}, no matter how bad it gets.`); + r.push(`and tearfully begs you to do worse to ${him}, no matter how bad it gets.`); slave.sexualFlaw = SexualFlaw.SELFHATING; r.push(basicTrainingDefaulter(slave)); } diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js index 5f033680e06962a9c8c6e1f091504240a857402d..388169d29ccfd338363c78d9436e816ae3b175d1 100644 --- a/src/endWeek/saSocialEffects.js +++ b/src/endWeek/saSocialEffects.js @@ -286,14 +286,6 @@ App.SlaveAssignment.saSocialEffects = function(slave) { t.push(new SocialEffect("Repopulationist", 1, "Birth tattoos", `Society <span class="green">is pleased</span> by the tally of successful births adorning ${his} skin.`)); } - } else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) { - if (slave.preg > 30) { - t.push(new SocialEffect("", 1, "Advanced pregnancy (Repopulation Policy)", - `Society <span class="green">loves</span> ${slave.slaveName}'s advanced pregnancy. It's very trendy.`)); - } else if (slave.bellyPreg >= 1500) { - t.push(new SocialEffect("", 0.5, "Big pregnant belly (Repopulation Policy)", - `Society <span class="green">enjoys</span> ${slave.slaveName}'s pregnancy. Being heavy with child is in right now.`)); - } } else if (FutureSocieties.isActive('FSRestart')) { if (slave.chastityVagina) { t.push(new SocialEffect("Eugenics", 1, "Vaginal chastity", @@ -369,6 +361,14 @@ App.SlaveAssignment.saSocialEffects = function(slave) { t.push(new SocialEffect("Eugenics", 2, "Castrated", `Society <span class="green">approves</span> of ${his} lack of testicles.`)); } + } else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) { + if (slave.preg > 30) { + t.push(new SocialEffect("", 1, "Advanced pregnancy (Repopulation Policy)", + `Society <span class="green">loves</span> ${slave.slaveName}'s advanced pregnancy. It's very trendy.`)); + } else if (slave.bellyPreg >= 1500) { + t.push(new SocialEffect("", 0.5, "Big pregnant belly (Repopulation Policy)", + `Society <span class="green">enjoys</span> ${slave.slaveName}'s pregnancy. Being heavy with child is in right now.`)); + } } if (V.arcologies[0].FSRepopulationFocusMilfPolicy === 1 && slave.counter.birthsTotal > 0) { t.push(new SocialEffect("", 1, "MILF Policy", diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js index 785b4dfd1343da09b8116125164225e7422feac0..cc293ece6739b74fe7a08ed51df11738c2bba505 100644 --- a/src/futureSocieties/fsPassage.js +++ b/src/futureSocieties/fsPassage.js @@ -388,6 +388,31 @@ App.UI.fsPassage = function() { } avg /= V.slaves.length; + const grid2 = document.createElement("div"); + grid2.classList.add("grid-2columns-auto"); + let someoneHasOpinion = false; + for (const neighbor of V.arcologies) { + const opinion = FutureSocieties.adoptionOpinion(proposedFS, neighbor); + if (opinion) { + App.UI.DOM.appendNewElement("div", grid2, neighbor.name); + switch (opinion) { + case -2: + App.UI.DOM.appendNewElement("div", grid2, "Anathema", ["red"]); + break; + case -1: + App.UI.DOM.appendNewElement("div", grid2, "Opposes", ["orange"]); + break; + case 1: + App.UI.DOM.appendNewElement("div", grid2, "Favors", ["yellowgreen"]); + break; + case 2: + App.UI.DOM.appendNewElement("div", grid2, "Supports", ["green"]); + break; + } + someoneHasOpinion = true; + } + } + const tip = document.createElement('div'); tip.classList.add("tip-details"); if (avg > 1.5) { @@ -400,6 +425,10 @@ App.UI.fsPassage = function() { tip.appendChild(document.createTextNode(`Attempting to adopt ${FutureSocieties.displayName(proposedFS)} with your arcology in its current state will likely result in failure. You should strongly consider aligning your slaves with ${FutureSocieties.displayAdj(proposedFS)} goals before endorsing it.`)); } tip.append(grid); + if (someoneHasOpinion) { + tip.appendChild(document.createTextNode(`Some of your neighbors may try to help or hinder adoption of ${FutureSocieties.displayName(proposedFS)}. Here's what they think right now:`)); + tip.append(grid2); + } const span = document.createElement("span"); span.classList.add("fs-recommend"); diff --git a/src/futureSocieties/futureSociety.js b/src/futureSocieties/futureSociety.js index a37fd894f2d5696f54da99a498573d47585fabe0..875f112eb2266b7a358eeb51dca2b32c6d53b2be 100644 --- a/src/futureSocieties/futureSociety.js +++ b/src/futureSocieties/futureSociety.js @@ -32,6 +32,7 @@ globalThis.FutureSocieties = (function() { policyActive, advance, humanVector, + adoptionOpinion, }; /** get the list of FSes active for a particular arcology @@ -140,6 +141,35 @@ globalThis.FutureSocieties = (function() { return societies; } + /** + * Determine a given neighbor's opinion of whether the player should adopt an FS. + * @param {FC.FutureSociety} fs + * @param {FC.ArcologyState} arc + * @returns {number} -2: actively opposes, -1: opposes, 0: no opinion, 1: supports, 2: actively supports + */ + function adoptionOpinion(fs, arc) { + if (fs === "FSSupremacist" || fs === "FSSubjugationist") { + return 0; // we can't tell whether an arcology would support or oppose racial FSes without knowing the race the player will choose + } + const neighborFSes = activeFSes(arc); + if (neighborFSes.includes(fs)) { + if (fs !== "FSNull" && arc[fs] > 60) { + return 2; // will actively support the FS + } else { + return 1; // working toward the same FS but won't actively support it for now + } + } + const conflictingFS = neighborFSes.find(nfs => conflictingFSes(fs, nfs)); + if (conflictingFS) { + if (arc[conflictingFS] > 60) { + return -2; // will actively oppose the FS + } else { + return -1; // working towards an opposing FS but won't actively resist it for now + } + } + return 0; + } + /** * Returns the set of shared FSes between two arcologies, and the set of conflicts between pairs of FSes between the arcologies. * Relatively expensive, try not to call frequently.