Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • PantyNabber/fc-pregmod
  • pregmodfan/fc-pregmod
  • Alice.Grant/fc-pregmod
  • powerfful/fc-pregmod
  • elstumpo/fc-pregmod
  • Y/fc-pregmod
  • floer/fc-pregmod
  • oidocrop/fc-pregmod
  • hawk5005/fc-pregmod
  • nn/fc-pregmod
  • latios298/fc-pregmod
  • brpregmodfan/fc-pregmod
  • SomeoneTookMyUserName/fc-pregmod
  • 000-250-006/fc-pregmod
  • rewrica/fc-pregmod
  • Stuffedgame/fc-pregmod
  • wisepants314/fc-pregmod
  • fcanon/fc-pregmod
  • randomanon1/pregmod-mod-cyberfurry
  • teddy.buckland/fc-pregmod
  • farsinian_591b7a2d8b49d/fc-pregmod
  • FCShotadev/fc-pregmod
  • uselessartifact/fc-pregmod
  • irina_90/fc-pregmod
  • thaumx/fc-pregmod
  • MouseOfLight/fc-pregmod
  • empresssela/fc-pregmod
  • MasterAaran/fc-pregmod
  • ishy/fc-pregmod
  • psychofox/fc-pregmod
  • shadomancer/fc-pregmod
  • tycrakgg/fc-pregmod
  • azktaawc/fc-pregmod
  • andonno07/fc-pregmod
  • Onithyr/fc-pregmod
  • redneck987.jl/fc-pregmod
  • Farseeker/fc-pregmod
  • milliarc/fc-pregmod
  • BeefimusMaximus/fc-pregmod
  • magicknight79/fc-pregmod
  • hexall90/fc-pregmod
  • cantworkforever/fc-pregmod
  • jc052005/fc-pregmod
  • klorpa/fc-pregmod
  • doku/fc-pregmod
  • samhradh/fc-pregmod
  • scientist/fc-pregmod
  • albania420/fc-pregmod
  • Editoranon/fc-pregmod
  • Anony/fc-pregmod
  • deimios666/fc-pregmod
  • IvoHoe/fc-pregmod
  • bitty/fc-pregmod
  • RealAnon1800/fc-pregmod
  • brankirk/fc-pregmod
  • Amygdalan/fc-pregmod
  • DankWolf/fc-pregmod
  • Supot1951/fc-pregmod
  • bcy603/fc-pregmod
  • pwfxjpuv/fc-pregmod
  • ThreadAnon/fc-pregmod
  • Anon1800/fc-pregmod
  • Echoart/fc-pregmod
  • Dingotush/fc-pregmod
  • anonman/fc-pregmod
  • Arkerthan/fc-pregmod
  • svornost/fc-pregmod
  • wierdwierdos/fc-pregmod
  • wetwareAnon/fc-pregmod
  • QuartzHat/fc-pregmod
  • IchthysdeKilt/fc-pregmod
  • AnonAnonFC/fc-pregmod
  • Alexsis/fc-pregmod
  • LoyalTreeWP/fc-pregmod
  • aerialace/fc-pregmod
  • NurseryAnon/fc-pregmod
  • drakeashordcataclysm/fc-pregmod
  • AshVaris/fc-pregmod
  • purely0nothing/fc-pregmod
  • alex2011/fc-pregmod
  • Lindontree/fc-pregmod
  • FCaa/fc-pregmod
  • TR-8R/fc-pregmod
  • Jones/fc-pregmod
  • brr99/fc-pregmod
  • WriteAnon101/fc-pregmod
  • Drosil/fc-pregmod
  • Bob1221/fc-pregmod
  • vas/fc-pregmod
  • gitgud.user.937/fc-pregmod
  • D-K/fc-pregmod
  • AnonDev/fc-pregmod
  • madman23456/fc-pregmod
  • InarusLynx/fc-pregmod
  • Sonofrevvan/fc-pregmod
  • Randoisrando/fc-pregmod
  • cheez94/fc-pregmod
  • dldldl/fc-pregmod
  • alice321/fc-pregmod
  • Alexei91/fc-pregmod
  • darkcy/fc-pregmod
  • MapleMAD/fc-pregmod
  • pillarofsalt/fc-pregmod
  • vultureangels/fc-pregmod
  • kernel/fc-pregmod
  • nooneman/fc-pregmod
  • deepmurk/fc-pregmod
  • uglybead/fc-pregmod
  • lemongrab/fc-pregmod
  • temperence-chan/fc-pregmod
  • hcommenter/fc-pregmod
  • SpedeMemerson/fc-pregmod
  • qwijqwsf/fc-pregmod
  • BuDClow/fc-pregmod
  • HiveBro/fc-pregmod
  • shoku/fc-pregmod
  • ezsh/fc-pregmod
  • Blank/fc-pregmod
  • randoralcissian/fc-pregmod
  • benito92/fc-pregmod
  • balakart/fc-pregmod
  • wedonotsaw/fc-pregmod
  • Cayleth/fc-pregmod
  • Khip/fc-pregmod
  • Zfair/fc-pregmod
  • promethium/fc-pregmod
  • scyne/fc-pregmod
  • ZZC/fc-pregmod
  • SilverJanine/fc-pregmod
  • joxosix654email-9.co/fc-pregmod
  • Littlefootlittleguy/fc-pregmod
  • FelipeBA/fc-pregmod
  • bigtiddygothbf/fc-pregmod
  • Qotsafan/fc-pregmod
  • Zachpocalypse/fc-pregmod
  • milkanon66/fc-pregmod
  • GreGGoZZ/fc-pregmod
  • drsnarf86/fc-pregmod
  • valen102938/fc-pregmod
  • pregspammer/fc-pregmod
  • ponderin94/fc-pregmod
  • nook/fc-pregmod
  • carnifex34/fc-pregmod-mod-carni
  • SyntheticHigh/fc-pregmod
  • bob112211/fc-pregmod
  • amomynous0/fc-pregmod
  • oxone/fc-pregmod
  • MaxEuwe/fc-pregmod
  • nekoanon/fc-pregmod
  • preglocke/fc-pregmod
  • valen10293847/fc-pregmod
  • 2hu4u/fc-pregmod
  • mayibrad/fc-pregmod
  • Screm/fc-pregmod
  • Ansopedi/fc-pregmod
  • mrchaosbones/fc-pregmod
  • putrid/fc-pregmod
  • Kinnerman/fc-pregmod
  • gungrave1155/fc-pregmod
  • prndev/fc-pregmod
  • weresmilodon/fc-pregmod
  • auxxigobin/fc-pregmod
  • alice-chan/fc-pregmod
  • wigglie/fc-pregmod
  • jrliltfgb/fc-pregmod
  • Lord.alek.shade/fc-pregmod
  • truetailthesquire/fc-pregmod
  • lowercasedonkey/fc-pregmod
  • alice-chan9/fc-pregmod
  • eroglyphics/fc-pregmod
  • taliyent/fc-pregmod
  • zenzombie90/fc-pregmod
  • kjarik/fc-pregmod
  • wriggler/fc-pregmod
  • midnightblue/fc-pregmod
  • faraen/fc-pregmod
  • sigurd.cole/fc-pregmod
  • FCbuganon/fc-pregmod
  • kidkinster/fc-pregmod
  • Kar_Dragon/fc-pregmod
  • Zhafier/fc-pregmod
  • crcaretti/fc-pregmod
  • anond/fc-pregmod
  • tempmania/fc-pregmod
  • Dhanze/fc-pregmod
  • EstaUnCachucha/fc-pregmod
  • oniAnon/fc-pregmod
  • plebian/fc-pregmod
  • maxd569/fc-pregmod
  • Levarn/fc-pregmod
  • pumpkinspice/fc-pregmod
  • GammaXai/fc-pregmod
  • DanBackslide/fc-pregmod
  • i107760/fc-pregmod
  • Absimiliard/fc-pregmod
  • AmbrosiaCheesecake/fc-pregmod
  • fuguer/fc-pregmod
  • Azurel/fc-pregmod
  • Fake_Dev/fc-pregmod
  • ddongsanda/fc-pregmod
  • Combine456/fc-pregmod
  • UnwrappedGodiva/fc-pregmod
  • toyRuberDucky/fc-pregmod
  • zmobie/fc-pregmod
  • chuongk/fc-pregmod
  • BigWalnuts/fc-pregmod
  • Birdstrike/fc-pregmod
  • r3d/fc-pregmod
  • mawspa/fc-pregmod
  • sushila/fc-pregmod
  • DeathShip/fc-pregmod
  • eggrollsandwich/fc-pregmod
  • krayken/fc-pregmod
  • Reman/fc-pregmod
  • dwiafgts/fc-pregmod
  • jort93/fc-pregmod
  • teruterubouzu/fc-pregmod
  • flut/fc-pregmod
  • john-normal/fc-pregmod
  • Jonathan2405/fc-pregmod
  • Tyrgalon/fc-pregmod
  • NovX/fc-pregmod
  • Star1/fc-pregmod
  • Transhumanist01/fc-pregmod
  • m1017242/fc-pregmod
  • Rizal98798/fc-pregmod
  • jamezu369/fc-pregmod
  • thisisawittyname/fc-pregmod
  • KnightBoulegard/fc-pregmod
  • jblack/fc-pregmod
  • Souldrainr/fc-pregmod
  • torbjornhub/fc-pregmod
  • turnop/fc-pregmod
  • breadedpigeon/fc-pregmod
  • fire.maker/fc-pregmod
  • Inahaze/fc-pregmod
  • Waerjak/fc-pregmod
  • Trashman1138/fc-pregmod
  • supanintendo/fc-pregmod
  • _no0neman/fc-pregmod
  • Weslo/fc-pregmod
  • qw89/fc-pregmod
  • EvilDruid/fc-pregmod
  • dt25/fc-pregmod
  • Raou/fc-pregmod
  • DDouFu/fc-pregmod
  • Mauno/fc-pregmod
  • PandemoniumPenguin/fc-pregmod
  • AngelPuppet/fc-pregmod
  • DasUser79/fc-pregmod
  • Keaeag3s/fc-pregmod
  • HazeHazeHaze/fc-pregmod
  • hpotato/fc-pregmod
  • owouchthatbloodyhurt/fc-pregmod
  • v7Silent/fc-pregmod
  • nickylass/fc-pregmod
  • ThePrimer/fc-pregmod
  • PineCone/fc-pregmod
  • bruhmomentum17/fc-pregmod
  • CheatDude/fc-pregmod
  • synnove/fc-pregmod
  • en_bees/fc-pregmod
  • seronis/fc-pregmod
  • Nepidinepnep/fc-pregmod
  • Titanninja/fc-pregmod
  • Elohiem/fc-pregmod
  • cocoajazz/fc-pregmod
  • tfwncagf/fc-pregmod
  • ChunkyMonke/fc-pregmod
  • Dracoman671/fc-pregmod
  • jgl/fc-pregmod
  • Inev/fc-pregmod
  • jbige/fc-pregmod
  • MonsterMate/fc-pregmod
  • Konstantin6961/fc-pregmod
  • darth_ashi/fc-pregmod
  • shinx/fc-pregmod
  • Anu/fc-pregmod
  • Greytide/fc-pregmod
  • Bonafidemetal/fc-pregmod
  • Peje/fc-pregmod
  • Hexfy98/fc-pregmod
  • TooSlow/fc-pregmod
  • SoGu/fc-pregmod
  • CloudyCoffee/fc-pregmod
  • Welptard/fc-pregmod
  • Ploc/fc-pregmod-ploc
  • rain-/fc-pregmod
  • Pecanus/fc-pregmod
  • Jhortrax/fc-pregmod
  • valleytwo/fc-pregmod
  • QCmd/fc-pregmod
  • kung-wada/fc-pregmod
  • LolGaye/fc-pregmod
  • Exspiravit1/fc-pregmod
  • jadeddog/fc-pregmod
  • buster-scruggs/fs-antebellum-revivalism
  • policia123/fc-pregmod
  • evrgentesee/fc-pregmod
  • rko127/fc-pregmod
  • ExcalGrip12/fc-pregmod
  • BlackAion/fc-pregmod
  • Boss2020/fc-pregmod
  • Lawled/fc-pregmod
  • shiro/fc-pregmod
  • Skavenkeri/fc-pregmod
  • PooPooDooDooHead/fc-pregmod
  • Dugee/fc-pregmod
  • Portal124/fc-pregmod-vore
  • Fekenol/fc-pregmod
  • elGuapo/fc-pregmod
  • KelioSteel/fc-pregmod
  • sldlddk/fc-pregmod
  • lumepanter/fc-pregmod
  • ryuhana/fc-pregmod
  • Nene1009yb/fc-pregmod
  • DontAskDontTell/fc-pregmod-extra-events
  • Dulgi/fc-pregmod
  • Jate/fc-pregmod
  • percy365/fc-pregmod
  • franklygeorge/fc-pregmod
  • Dragneel117/fc-pregmod
  • vl96/fc-pregmod
  • Gorlom/fc-economicmod
  • NotAlive/fc-pregmod
  • Heretek/fc-pregmod
  • joeshmo828282/fc-pregmod
  • deswes/fc-pregmod
  • Nanana21/fc-pregmod
  • Gbr6/fc-pregmod
  • RandomNecro/fc-pregmod
  • Trinidad/fc-pregmod
  • anonymousey/fc-pregmod
  • macaronideath/fc-pregmod
  • fcbleh/fc-pregmod
  • jk3000/fc-pregmod
  • Akane/fc-pregmod
  • TheBoi/fc-pregmod
  • Sheenariel/fc-pregmod
  • Metapod/multi-custom
  • Banyanael/fc-pregmod
  • frogge/fc-pregmod
  • idkkk12385/fc-pregmod
  • Mirarara/fc-pregmod
  • DeaDa/fc-pregmod-thedeal
  • CobraCommander/fc-pregmod
  • bicobus/fc-pregmod
  • CardcaptorRLH85/fc-pregmod
  • temp-ui-start/fc-pregmod
  • PresidentConvert/fc-pregmod
  • delizious/fc-pregmod
  • Ducati/fc-pregmod
  • DerangedLoner/fc-pregmod-development-fork
  • ProjectVictory/fc-pregmod
  • forecastle/fc-pregmod
  • Apathy/fc-pregmod
  • indf/fc-pregmod-dev
  • GavAndAlt/fc-pregmod
  • hagamablabla/fc-pregmod
  • Alaco/fc-pregmod
  • DCoded/fc-pregmod
  • LittlePlague/fc-pregmod
  • MissOnahole/fc-pregmod
  • ishy2317/fc-pregmod
  • nielkazama/fc-pregmod
  • Phobos/fc-pregmod
  • kraster/fc-pregmod
  • JasWS/fc-pregmod
  • FelixJS/fc-pregmod
  • NCherfaoui/fc-pregmod
  • MidnightMoose/fc-pregmod
  • jjjjjj/fc-pregmod
  • Cl0ver/fc-pregmod
  • Pythoniqus/fc-pregmod
  • JohnMolotov/fc-pregmod
  • anonymouspregmodder/fc-pregmod-anonymouspregmodder
  • Fanatey/fc-pregmod
  • Mizako/fc-pregmod
  • Nithhogg/fc-pregmod
  • Bluecoffee/fc-pregmod
380 results
Show changes
Showing
with 224 additions and 45 deletions
...@@ -43,6 +43,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { ...@@ -43,6 +43,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
rapist.preg = 0; rapist.preg = 0;
rapist.weight = random(-20, 30); rapist.weight = random(-20, 30);
rapist.waist = -20; rapist.waist = -20;
slave.fertPeak = 0;
} }
rapist.muscles = Math.max(rapist.muscles, 10); rapist.muscles = Math.max(rapist.muscles, 10);
rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP} – you, to be exact.`; rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP} – you, to be exact.`;
......
...@@ -98,6 +98,8 @@ App.Events.recDesperateBirth = class recDesperateBirth extends App.Events.BaseEv ...@@ -98,6 +98,8 @@ App.Events.recDesperateBirth = class recDesperateBirth extends App.Events.BaseEv
slave.geneticQuirks.uterineHypersensitivity = 0; slave.geneticQuirks.uterineHypersensitivity = 0;
slave.preg = 0; slave.preg = 0;
slave.pregWeek = -4; slave.pregWeek = -4;
slave.fertPeak = 2;
slave.fertKnown = 1;
slave.counter.births = 1; slave.counter.births = 1;
slave.counter.birthsTotal = 1; slave.counter.birthsTotal = 1;
slave.bellySag = 5; slave.bellySag = 5;
......
...@@ -70,6 +70,7 @@ App.Events.recFarmVirginCow = class recFarmVirginCow extends App.Events.BaseEven ...@@ -70,6 +70,7 @@ App.Events.recFarmVirginCow = class recFarmVirginCow extends App.Events.BaseEven
slave.vaginaLube = 1; slave.vaginaLube = 1;
slave.labia = 2; slave.labia = 2;
slave.ovaries = 1; slave.ovaries = 1;
slave.fertKnown = 1;
slave.pubicHStyle = "waxed"; slave.pubicHStyle = "waxed";
slave.underArmHStyle = "waxed"; slave.underArmHStyle = "waxed";
slave.hips = random(0, 2); slave.hips = random(0, 2);
......
...@@ -28,6 +28,7 @@ App.Events.recFSRepopulationEfforts = class recFSRepopulationEfforts extends App ...@@ -28,6 +28,7 @@ App.Events.recFSRepopulationEfforts = class recFSRepopulationEfforts extends App
slave.trueVirgin = 1; slave.trueVirgin = 1;
slave.preg = 0; slave.preg = 0;
slave.pregType = 0; slave.pregType = 0;
slave.fertKnown = 1;
slave.fetish = "pregnancy"; slave.fetish = "pregnancy";
const { const {
......
...@@ -26,7 +26,7 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent { ...@@ -26,7 +26,7 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
node.append(pop(slave)); node.append(pop(slave));
} }
removeSlave(slave, {dead: true}); removeSlave(slave, {dead: true});
node.append(sectionBreak()); node.append(App.UI.sectionBreak());
} }
/** /**
...@@ -137,12 +137,6 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent { ...@@ -137,12 +137,6 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
el.append(horrifiedSlaves(slave)); el.append(horrifiedSlaves(slave));
return el; return el;
} }
function sectionBreak() {
const hr = document.createElement("hr");
hr.style.margin = "0";
return hr;
}
} }
}; };
......
...@@ -15,6 +15,8 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba ...@@ -15,6 +15,8 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba
if (V.huskSlave.race !== "not important") { if (V.huskSlave.race !== "not important") {
pram.race = V.huskSlave.race; pram.race = V.huskSlave.race;
} }
/** @type {FC.SlaveState} */
let husk; let husk;
if (V.huskSlave.sex === 2) { if (V.huskSlave.sex === 2) {
husk = GenerateNewSlave("XY", pram); husk = GenerateNewSlave("XY", pram);
...@@ -73,7 +75,7 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba ...@@ -73,7 +75,7 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba
App.Events.addResponses(node, choices); App.Events.addResponses(node, choices);
function accept() { function accept() {
V.temp.activeSlave = husk; V.temp.husk = husk;
V.returnTo = V.nextLink; V.returnTo = V.nextLink;
Engine.play("Husk Slave Swap Workaround"); Engine.play("Husk Slave Swap Workaround");
return ``; return ``;
......
...@@ -162,21 +162,27 @@ App.UI.geneLab = function() { ...@@ -162,21 +162,27 @@ App.UI.geneLab = function() {
App.UI.DOM.appendNewElement("h2", node, `Genetic Harvesting`); App.UI.DOM.appendNewElement("h2", node, `Genetic Harvesting`);
const humanCloning = 100000 * PCSkillCheck; const humanCloning = 100000 * PCSkillCheck;
if (V.cloningSystem !== 1 && V.rep <= 18000 * PCSkillCheck) { if (V.cloningSystem === 0) {
App.UI.DOM.appendNewElement("div", node, `You lack the reputation needed to access methods for human cloning`, ["note"]); if (V.rep <= 18000 * PCSkillCheck) {
} else if ((V.cloningSystem !== 1) && (V.rep > 18000 * PCSkillCheck)) { if (V.rep >= 20_000) {
if (V.organFarmUpgrade === 0) { App.UI.DOM.appendNewElement("div", node, `You have heard rumors of human cloning, but such technology is too advanced for your understanding. Perhaps you should invest into your own education.`, ["note"]);
App.UI.DOM.appendNewElement("div", node, `An organ farm is needed to grow the blank embryo to serve as a clone base`, ["note"]); } else {
App.UI.DOM.appendNewElement("div", node, `You lack the reputation needed to access methods for human cloning`, ["note"]);
}
} else { } else {
App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link( if (V.organFarmUpgrade === 0) {
"Purchase methods for human cloning", App.UI.DOM.appendNewElement("div", node, `An organ farm is needed to grow the blank embryo to serve as a clone base`, ["note"]);
() => { } else {
cashX(forceNeg(humanCloning), "capEx"); App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
V.cloningSystem = 1; "Purchase methods for human cloning",
App.UI.reload(); () => {
}, [], "", cashX(forceNeg(humanCloning), "capEx");
`Costs ${cashFormat(humanCloning)}. Will allow children to be created with identical base genetics as the source DNA` V.cloningSystem = 1;
)); App.UI.reload();
}, [], "",
`Costs ${cashFormat(humanCloning)}. Will allow children to be created with identical base genetics as the source DNA`
));
}
} }
} else if (V.cloningSystem > 0) { } else if (V.cloningSystem > 0) {
App.UI.DOM.appendNewElement("div", node, `The gene lab is capable of implanting a slave's genetic sequence into a blank embryo to produce a basic clone.`); App.UI.DOM.appendNewElement("div", node, `The gene lab is capable of implanting a slave's genetic sequence into a blank embryo to produce a basic clone.`);
......
...@@ -15,10 +15,8 @@ App.Facilities.Nursery.childList = function childList() { ...@@ -15,10 +15,8 @@ App.Facilities.Nursery.childList = function childList() {
const weeksOwned = V.week - child.weekAcquired; const weeksOwned = V.week - child.weekAcquired;
const weeksLeft = (V.targetAgeNursery * 52) - weeksOwned; const weeksLeft = (V.targetAgeNursery * 52) - weeksOwned;
const {he, him, He} = getPronouns(child); const {he, him, He} = getPronouns(child);
const hr = document.createElement("hr");
hr.style.margin = "0"; list.appendChild(App.UI.sectionBreak());
list.appendChild(hr);
if (child.actualAge < 3) { if (child.actualAge < 3) {
$(list).append(App.UI.DOM.link(SlaveFullName(child), (id) => V.activeChild = getInfant(id), [child.ID], "Infant Interact")); $(list).append(App.UI.DOM.link(SlaveFullName(child), (id) => V.activeChild = getInfant(id), [child.ID], "Infant Interact"));
......
...@@ -60,6 +60,8 @@ App.Facilities.Pit.pit = function() { ...@@ -60,6 +60,8 @@ App.Facilities.Pit.pit = function() {
App.UI.reload(); App.UI.reload();
}), ['indent']); }), ['indent']);
} else if (bodyguard !== null) {
V.pit.slaveFightingBodyguard = null;
} }
return el; return el;
} }
......
...@@ -152,9 +152,7 @@ App.UI.mediaStudio = function() { ...@@ -152,9 +152,7 @@ App.UI.mediaStudio = function() {
if (V.slavePanelStyle === 0) { if (V.slavePanelStyle === 0) {
res.appendChild(document.createElement("br")); res.appendChild(document.createElement("br"));
} else if (V.slavePanelStyle === 1) { } else if (V.slavePanelStyle === 1) {
const hr = document.createElement("hr"); res.appendChild(App.UI.sectionBreak());
hr.style.margin = "0";
res.appendChild(hr);
} }
if (batchRenderer && (!V.seeCustomImagesOnly || (V.seeCustomImagesOnly && slave.custom.image))) { if (batchRenderer && (!V.seeCustomImagesOnly || (V.seeCustomImagesOnly && slave.custom.image))) {
......
...@@ -35,6 +35,7 @@ App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) { ...@@ -35,6 +35,7 @@ App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) {
return frag; return frag;
function geneTesting() { function geneTesting() {
const geneRecord = getGenePoolRecord(slave);
const el = new DocumentFragment(); const el = new DocumentFragment();
const slaveGeneTest = App.UI.DOM.appendNewElement("ul", el); const slaveGeneTest = App.UI.DOM.appendNewElement("ul", el);
...@@ -45,8 +46,8 @@ App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) { ...@@ -45,8 +46,8 @@ App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) {
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Nationality: ${slave.nationality}`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Nationality: ${slave.nationality}`);
// App.UI.DOM.appendNewElement("li", slaveGeneTest, `Race: ${capFirstChar(slave.origRace)}`); this is already present lower down in race() // App.UI.DOM.appendNewElement("li", slaveGeneTest, `Race: ${capFirstChar(slave.origRace)}`); this is already present lower down in race()
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Skin tone: ${capFirstChar(slave.origSkin)}`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Skin tone: ${capFirstChar(slave.origSkin)}`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Intelligence index: ${slave.intelligence} out of 100`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Genetic intelligence index: ${geneRecord.intelligence} out of 100`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Face index: ${slave.face} out of 100`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Genetic face index: ${geneRecord.face} out of 100`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Expected height: ${heightToEitherUnit(slave.natural.height)}`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Expected height: ${heightToEitherUnit(slave.natural.height)}`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Expected breast size: ${slave.natural.boobs}cc`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Expected breast size: ${slave.natural.boobs}cc`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Eye color: ${capFirstChar(slave.eye.origColor)}`); App.UI.DOM.appendNewElement("li", slaveGeneTest, `Eye color: ${capFirstChar(slave.eye.origColor)}`);
......
...@@ -22,6 +22,9 @@ App.UI.WardrobeShopping = function() { ...@@ -22,6 +22,9 @@ App.UI.WardrobeShopping = function() {
} else if (V.boughtItem.clothing.dildos === 1 || V.boughtItem.toys.gags === 1 || V.boughtItem.clothing.buttPlugs === 1 || V.boughtItem.clothing.buttPlugTails === 1 || V.boughtItem.clothing.vaginalAttachments === 1) { } else if (V.boughtItem.clothing.dildos === 1 || V.boughtItem.toys.gags === 1 || V.boughtItem.clothing.buttPlugs === 1 || V.boughtItem.clothing.buttPlugTails === 1 || V.boughtItem.clothing.vaginalAttachments === 1) {
r.push(`Some sex toys line the shelves.`); r.push(`Some sex toys line the shelves.`);
} }
if (V.scenarios.contraceptivesBan === 1 && V.boughtItem.toys.chastity === 1) {
r.push(`A box of massively overvalued chastity devices sits in the corner.`);
}
if (V.boughtItem.toys.buckets === 1) { if (V.boughtItem.toys.buckets === 1) {
r.push(`Several buckets of various sizes and a sturdy cup have been set aside for you in feeding slaves to their limit.`); r.push(`Several buckets of various sizes and a sturdy cup have been set aside for you in feeding slaves to their limit.`);
} }
......
...@@ -287,6 +287,14 @@ App.Data.WardrobeShopping.Accessories = { ...@@ -287,6 +287,14 @@ App.Data.WardrobeShopping.Accessories = {
contains: [], contains: [],
owned: "You are well stocked with massive dildo gags.", owned: "You are well stocked with massive dildo gags.",
}, },
"toys.chastity": {
title: "a shipment of various chastity devices",
note: `Due to unusual market conditions, the price has reached a completely unacceptable price.`,
cost: 500000,
contains: [],
get requirements() { return (V.scenarios.contraceptivesBan !== 0); },
owned: "You are well stocked with chastity devices.",
},
"toys.buckets": { "toys.buckets": {
title: "everything you need to force-feed slaves", title: "everything you need to force-feed slaves",
note: `Some supplies from the cafeteria and a slight adjustment to the feeder settings is all it would take.`, note: `Some supplies from the cafeteria and a slight adjustment to the feeder settings is all it would take.`,
......
...@@ -384,7 +384,7 @@ App.Encyclopedia.addArticle("Design Your Master", function() { ...@@ -384,7 +384,7 @@ App.Encyclopedia.addArticle("Design Your Master", function() {
} }
r.push("Your starting slaves will have free"); r.push("Your starting slaves will have free");
r.push(App.Encyclopedia.link("trust", "Trust", "trust careful")); r.push(App.Encyclopedia.link("trust", "Trust", "trust careful"));
r.push("available. Strength requirements impart a hightened starting musculature. Starts having already mastered"); r.push("available. Strength requirements impart a heightened starting musculature. Starts having already mastered");
r.push(App.UI.DOM.combineNodes(App.Encyclopedia.link("Warfare", "PC Skills"), ".")); r.push(App.UI.DOM.combineNodes(App.Encyclopedia.link("Warfare", "PC Skills"), "."));
App.Events.addNode(ul, r, "li"); App.Events.addNode(ul, r, "li");
......
// cSpell:ignore SSAA // cSpell:ignore SSAA, Oobabooga
App.UI.optionsPassage = function() { App.UI.optionsPassage = function() {
const el = new DocumentFragment(); const el = new DocumentFragment();
...@@ -135,7 +135,8 @@ App.UI.optionsPassage = function() { ...@@ -135,7 +135,8 @@ App.UI.optionsPassage = function() {
options.addOption("The Security Expansion mod is", "secExpEnabled") options.addOption("The Security Expansion mod is", "secExpEnabled")
.addValue("Enabled", 1).on() .addValue("Enabled", 1).on()
.addValue("Disabled", 0).off() .addValue("Disabled", 0).off()
.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div><span class='yellow'>After enabling mid-game please run re-run BC Update.</span>"); .addGlobalCallback(() => { App.Mods.SecExp.Obj.Init(); })
.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.");
option = options.addOption("Catmod is currently", "seeCats") option = options.addOption("Catmod is currently", "seeCats")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off(); .addValue("Enabled", 1).on().addValue("Disabled", 0).off();
...@@ -773,7 +774,7 @@ App.UI.optionsPassage = function() { ...@@ -773,7 +774,7 @@ App.UI.optionsPassage = function() {
options.addOption("Experimental AI chat tab in slave interact is ", "aiChat") options.addOption("Experimental AI chat tab in slave interact is ", "aiChat")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addValue("Enabled", 1).on().addValue("Disabled", 0).off()
.addComment("This will enable a chat tab in slave interact. It uses an LLM OpenAPI endpoint of your choice. (DONT USE OPENAI, use Oobabooga, KoboldCPP, etc)"); .addComment("This will enable a chat tab in slave interact. It uses an LLM OpenAPI endpoint of your choice. (DON'T USE OPENAI, use Oobabooga, KoboldCPP, etc)");
if (V.aiChat === 1){ if (V.aiChat === 1){
options.addOption("API URL", "aiChatUrl").showTextBox().addComment("The URL of the OpenAI-compatible, self-hosted endpoint."); options.addOption("API URL", "aiChatUrl").showTextBox().addComment("The URL of the OpenAI-compatible, self-hosted endpoint.");
...@@ -824,9 +825,21 @@ App.UI.optionsPassage = function() { ...@@ -824,9 +825,21 @@ App.UI.optionsPassage = function() {
.addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addValue("Enabled", 1).on().addValue("Disabled", 0).off()
.addComment("This will sort rule assistant output. You may benefit if you have a lot of rules, but only want to look out for a specific portion of it."); .addComment("This will sort rule assistant output. You may benefit if you have a lot of rules, but only want to look out for a specific portion of it.");
options.addOption("Slave Fertility Cycles", "menstruation") options.addOption("Fertility Cycles", "menstruation")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addValue("Enabled", 1).on()
.addComment("Adds slave fertility cycles. Slaves can only get pregnant on their fertile week. Fertility drugs can force slaves into a fertile week."); .addValue("Disabled", 0, () => { V.menstruationKnown = 0; V.policies.contraceptivesBan = 0; }).off()
.addComment("Adds fertility cycles and menstruation. Pregnancy can only occur on a fertile week.");
if (V.menstruation) {
options.addOption("Fertility Cycle Awareness", "menstruationKnown")
.addValue("Always", 0).on().addValue("Discoverable", 1).on().addValue("Never", 2).off()
.addComment("Are fertility cycles known? Discoverable will make the fertility cycle known after a slave's period.");
/*
options.addOption("Pregnancy Awareness", "pregnancyKnown")
.addValue("Always", 0).on().addValue("Discoverable", 1).off()
.addComment("Is pregnancy immediately known?");
*/
}
options.addOption("Random slave events repeat control", "level", V.eventControl) options.addOption("Random slave events repeat control", "level", V.eventControl)
.addValue("No control", 0, () => V.eventControl.RIEPerWeek = Math.min(V.eventControl.RIEPerWeek, 3)) .addValue("No control", 0, () => V.eventControl.RIEPerWeek = Math.min(V.eventControl.RIEPerWeek, 3))
...@@ -967,6 +980,9 @@ App.Intro.display = function(isIntro) { ...@@ -967,6 +980,9 @@ App.Intro.display = function(isIntro) {
options.addOption("Condense special slaves into their own tab", "useSlaveSummaryOverviewTab") options.addOption("Condense special slaves into their own tab", "useSlaveSummaryOverviewTab")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off(); .addValue("Enabled", 1).on().addValue("Disabled", 0).off();
options.addOption("Main Menu category with all slaves", "useSlaveArcologyTab")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
options.addOption("Interactions with your fucktoys are", "fucktoyInteractionsPosition") options.addOption("Interactions with your fucktoys are", "fucktoyInteractionsPosition")
.addValueList([["next to them", 1], ["at page bottom", 0]]); .addValueList([["next to them", 1], ["at page bottom", 0]]);
...@@ -1188,6 +1204,26 @@ App.Intro.contentAndFlavor = function(isIntro) { ...@@ -1188,6 +1204,26 @@ App.Intro.contentAndFlavor = function(isIntro) {
option.addComment("Will not affect existing precocious puberty cases already in-game."); option.addComment("Will not affect existing precocious puberty cases already in-game.");
} }
// move me exclusively here once cleared from experimental
if (isIntro) {
options.addOption("Menstrual cycles are currently", "menstruation")
.addValue("Enabled", 1).on()
.addValue("Disabled", 0, () => V.menstruationKnown = 0).off()
.addComment("Pregnancy can only occur on a fertile week. EXPERIMENTAL!");
if (V.menstruation) {
options.addOption("Slave menstrual cycles are", "menstruationKnown")
.addValue("Always known", 0).on().addValue("Trackable after discovery", 1).on().addValue("A mystery", 2).off()
.addComment("You are always aware of your own cycle. EXPERIMENTAL!");
/*
options.addOption("Pregnancy Awareness", "pregnancyKnown")
.addValue("Always", 0).on().addValue("Discoverable", 1).off()
.addComment("Is pregnancy immediately known?");
*/
}
}
options.addOption("Proportion of slave girls with exotic hair colors", "seeRandomHair") options.addOption("Proportion of slave girls with exotic hair colors", "seeRandomHair")
.addValueList([ .addValueList([
["None (0%)", 0], ["None (0%)", 0],
......
...@@ -451,7 +451,6 @@ App.UI.OptionsGroup = (function() { ...@@ -451,7 +451,6 @@ App.UI.OptionsGroup = (function() {
constructor(comment) { constructor(comment) {
super(); super();
this.comment = comment; this.comment = comment;
this.long = false;
} }
/** /**
...@@ -489,6 +488,116 @@ App.UI.OptionsGroup = (function() { ...@@ -489,6 +488,116 @@ App.UI.OptionsGroup = (function() {
} }
} }
class SliderRow extends Row {
/**
* Warning: Due to limitations to sliders this updates values in real time WITHOUT calling refresh.
* The Caller has to implement their own submit functionality if required
*
* @param {string} description
* @param {number} min Minimum allowed value
* @param {number} max Maximum allowed value
* @param {string} property
* @param {object} object
*/
constructor(description, min, max, property, object) {
super();
this.description = description;
this.min = min;
this.max = max;
this.step = -1;
this.property = property;
this.object = object;
this.textbox = false;
/**
* @type {null|Array<string>}
*/
this.endLabels = null;
}
/**
* Set the step size (default = unlimited)
* @param {number} step
*/
setStep(step) {
this.step = step;
return this;
}
/**
* Show a textbox to allow manual inputs.
*/
addTextBox() {
this.textbox = true;
return this;
}
/**
* Add Labels to the ends of the slider
* @param {string} left
* @param {string} right
*/
addEndLabels(left, right) {
this.endLabels = [left, right];
return this;
}
render(container, _) {
/* left side */
App.UI.DOM.appendNewElement("div", container, this.description, ["description"]);
/* right side */
const div = document.createElement("div");
div.classList.add("button-group", "slider-div");
if (this.endLabels !== null) {
App.UI.DOM.appendNewElement("span", div, this.endLabels[0]);
}
// Create slider first, so textbox can reference it
const slider = document.createElement("input");
let textbox = null;
if (this.textbox) {
// Create textbox, using reference to slider
textbox = App.UI.DOM.makeTextBox(this.object[this.property], input => {
// Run input through slider to ensure it's a valid value.
slider.value = String(input);
this.object[this.property] = parseFloat(slider.value);
textbox.value = this.object[this.property];
}, true);
textbox.classList.add("number");
}
// Finish of slider, using reference to textbox
slider.type = "range";
slider.step = (this.step <= 0) ? "any" : `${this.step}`;
slider.min = String(this.min);
slider.max = String(this.max);
slider.value = String(this.object[this.property]);
slider.oninput = () => {
this.object[this.property] = parseFloat(slider.value);
if (textbox !== null) {
textbox.value = this.object[this.property];
}
};
// Now append everything
div.append(slider);
if (this.endLabels !== null) {
App.UI.DOM.appendNewElement("span", div, this.endLabels[1]);
}
if (textbox !== null) {
div.append(textbox);
}
container.append(div);
}
}
return class OptionsGroup { return class OptionsGroup {
constructor() { constructor() {
/** /**
...@@ -567,6 +676,17 @@ App.UI.OptionsGroup = (function() { ...@@ -567,6 +676,17 @@ App.UI.OptionsGroup = (function() {
return this._addRow(new CustomRow(element)); return this._addRow(new CustomRow(element));
} }
/**
* @param {string} description
* @param {number} min Minimum allowed value
* @param {number} max Maximum allowed value
* @param {string} property
* @param {object} [object=V]
*/
addSlider(description, min, max, property, object = V) {
return this._addRow(new SliderRow(description, min, max, property, object));
}
/** /**
* @returns {HTMLDivElement} * @returns {HTMLDivElement}
*/ */
......
...@@ -111,7 +111,7 @@ Restart ComfyUI ...@@ -111,7 +111,7 @@ Restart ComfyUI
<h3>Setup FC for ComfyUI integration</h3> <h3>Setup FC for ComfyUI integration</h3>
<p>Switch AI User Interface from A1111 to ComfyUI.</p> <p>Switch AI User Interface from A1111 to ComfyUI.</p>
<p>Select your checkpoint model, sampling mathod, and scheduling method.</p> <p>Select your checkpoint model, sampling method, and scheduling method.</p>
<h3>Confirm successful generation</h3> <h3>Confirm successful generation</h3>
<p>If the preview image is not being generated and the preview is:</p> <p>If the preview image is not being generated and the preview is:</p>
......
...@@ -119,7 +119,6 @@ App.UI.quickMenu = (function() { ...@@ -119,7 +119,6 @@ App.UI.quickMenu = (function() {
"Servants' Quarters": () => !App.Entity.facilities.servantsQuarters.established, "Servants' Quarters": () => !App.Entity.facilities.servantsQuarters.established,
"Spa": () => !V.spa, "Spa": () => !V.spa,
"The Black Market": () => V.rep < 10000, "The Black Market": () => V.rep < 10000,
"Weapons Manufacturing": () => true,
}); });
// show different names than the actual passage name, can be a function // show different names than the actual passage name, can be a function
......
...@@ -114,9 +114,6 @@ App.UI.View.mainLinks = function() { ...@@ -114,9 +114,6 @@ App.UI.View.mainLinks = function() {
} }
break; break;
} }
}
if (V.PC.health.shortDamage < 30) {
const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Change plans", "Personal Attention Select"), "major-link"); const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Change plans", "Personal Attention Select"), "major-link");
link.id = "managePA"; link.id = "managePA";
fragment.append(" ", link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("Personal Attention Select"), "hotkey")); fragment.append(" ", link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("Personal Attention Select"), "hotkey"));
......
...@@ -381,6 +381,9 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { ...@@ -381,6 +381,9 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
note += `${He} has been sterilized`; note += `${He} has been sterilized`;
} else if (slave.preg < -1) { } else if (slave.preg < -1) {
note += `${He} is sterile`; note += `${He} is sterile`;
} else if (V.menstruation && !fertKnown(slave) && slave.pubertyXX === 1 && slave.physicalAge <= V.fertilityAge) {
// First ovulation
note += `${He} is not yet fertile`;
} else if (slave.pubertyXX === 0 && slave.preg < 1) { } else if (slave.pubertyXX === 0 && slave.preg < 1) {
note += `${He} is not yet fertile`; note += `${He} is not yet fertile`;
} else if (slave.ovaryAge >= 47 && slave.preg < 1) { } else if (slave.ovaryAge >= 47 && slave.preg < 1) {
...@@ -415,7 +418,11 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { ...@@ -415,7 +418,11 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
fertility = "using contraceptives"; fertility = "using contraceptives";
} else if (slave.pregWeek < 0) { } else if (slave.pregWeek < 0) {
fertility = "postpartum"; fertility = "postpartum";
} else if (V.menstruation === 1 && slave.fertPeak > 0 && slave.preg === 0) { } else if (V.menstruation === 1 && V.menstruationKnown === 1 && slave.fertLate < 0 && !slave.pregKnown) {
// use me once false contraceptives are added for .pregKnown
// fertility = "may be pregnant";
fertility = "late";
} else if (V.menstruation === 1 && V.menstruationKnown !== 2 && slave.fertPeak > 0 && slave.preg === 0) {
fertility = "safe"; fertility = "safe";
} else if (slave.preg === 0) { } else if (slave.preg === 0) {
fertility = "fertile"; fertility = "fertile";
...@@ -432,7 +439,7 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { ...@@ -432,7 +439,7 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
fertility += ". "; fertility += ". ";
App.UI.DOM.appendNewElement("span", fertilityBlock, fertility, "bold"); App.UI.DOM.appendNewElement("span", fertilityBlock, fertility, "bold");
if (slave.preg === 0) { if (slave.preg === 0 && V.policies.contraceptivesBan === 0) {
linkArray.push(App.UI.DOM.link( linkArray.push(App.UI.DOM.link(
`Use contraceptives`, `Use contraceptives`,
() => { () => {
...@@ -500,6 +507,9 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { ...@@ -500,6 +507,9 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
[], [],
"Abort" "Abort"
)); ));
if (V.scenarios.contraceptivesBan) {
note += `Will cost ${(cashFormat(50000))}`;
}
} }
} }
App.UI.DOM.appendNewElement("span", fertilityBlock, note, "note"); App.UI.DOM.appendNewElement("span", fertilityBlock, note, "note");
......