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
  • Exarch/pregmod-ai-clothing
381 results
Show changes
Showing
with 228 additions and 41 deletions
......@@ -444,6 +444,12 @@ App.Intro.initNationalities = function() {
initArcologies();
// remove me in the future when scenarios leave introSummary
if (V.scenarios.contraceptivesBan === 1) {
V.boughtItem.toys.chastity = 0;
V.policies.contraceptivesBan = 1;
}
V.HackingSkillMultiplier = upgradeMultiplier('hacking');
V.upgradeMultiplierArcology = upgradeMultiplier('engineering');
V.upgradeMultiplierMedicine = upgradeMultiplier('medicine');
......
......@@ -339,7 +339,8 @@ App.Intro.summary = function() {
It is non-canon where it conflicts with canonical updates to the base game.`);
options.addOption("The Security Expansion Mod is", "secExpEnabled")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
.addGlobalCallback(() => { App.Mods.SecExp.Obj.Init(); });
options.addComment(`This mod introduces security and crime in the arcology, as well as attacks and battles.
The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.`);
......@@ -352,6 +353,13 @@ App.Intro.summary = function() {
// .addValue("Enabled", true).on().addValue("Disabled", false).off();
// options.addComment("This mod will enable food supply and demand. This mod can be activated/deactivated at any time.");
// Move me to scenarios/scenario starts in the future. Right now I just have no place better to be.
if (V.menstruation === 1) {
options.addOption("Contraceptives are", "contraceptivesBan", V.scenarios)
.addValue("Banned", 1).on().addValue("Not Banned", 0).off();
options.addComment(`A scenario where contraceptives are completely unavailable. Keep aware of menstrual cycles or face the consequences of dealing with your little accidents; abortion and chastity will cost you. Play with cycle awareness completely hidden to prove yourself a master period investigator!`);
}
el.append(options.render());
return el;
}
......
......@@ -58,7 +58,7 @@ App.Events.PCoupCollaborationChoice = class PCoupCollaborationChoice extends App
Spoken(traitorActor, `"Don't let them get you ${Master}! Show them who's boss!"`)
);
} else {
r.push(`${He} hastily gestures that they are coming for you and that nothing you can do will deter them. ${He} barely signs off a plea for you to prepare your defenses before being dragged offsceen.`);
r.push(`${He} hastily gestures that they are coming for you and that nothing you can do will deter them. ${He} barely signs off a plea for you to prepare your defenses before being dragged offscreen.`);
}
traitor.type = "hostage";
} else if (traitorActor.intelligence + traitorActor.intelligenceImplant < -50) {
......
......@@ -43,6 +43,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
rapist.preg = 0;
rapist.weight = random(-20, 30);
rapist.waist = -20;
slave.fertPeak = 0;
}
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.`;
......
......@@ -98,6 +98,8 @@ App.Events.recDesperateBirth = class recDesperateBirth extends App.Events.BaseEv
slave.geneticQuirks.uterineHypersensitivity = 0;
slave.preg = 0;
slave.pregWeek = -4;
slave.fertPeak = 2;
slave.fertKnown = 1;
slave.counter.births = 1;
slave.counter.birthsTotal = 1;
slave.bellySag = 5;
......
......@@ -70,6 +70,7 @@ App.Events.recFarmVirginCow = class recFarmVirginCow extends App.Events.BaseEven
slave.vaginaLube = 1;
slave.labia = 2;
slave.ovaries = 1;
slave.fertKnown = 1;
slave.pubicHStyle = "waxed";
slave.underArmHStyle = "waxed";
slave.hips = random(0, 2);
......
......@@ -28,6 +28,7 @@ App.Events.recFSRepopulationEfforts = class recFSRepopulationEfforts extends App
slave.trueVirgin = 1;
slave.preg = 0;
slave.pregType = 0;
slave.fertKnown = 1;
slave.fetish = "pregnancy";
const {
......
......@@ -26,7 +26,7 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
node.append(pop(slave));
}
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 {
el.append(horrifiedSlaves(slave));
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
if (V.huskSlave.race !== "not important") {
pram.race = V.huskSlave.race;
}
/** @type {FC.SlaveState} */
let husk;
if (V.huskSlave.sex === 2) {
husk = GenerateNewSlave("XY", pram);
......@@ -73,7 +75,7 @@ App.Events.SEHuskSlaveDelivery = class SEHuskSlaveDelivery extends App.Events.Ba
App.Events.addResponses(node, choices);
function accept() {
V.temp.activeSlave = husk;
V.temp.husk = husk;
V.returnTo = V.nextLink;
Engine.play("Husk Slave Swap Workaround");
return ``;
......
......@@ -162,21 +162,27 @@ App.UI.geneLab = function() {
App.UI.DOM.appendNewElement("h2", node, `Genetic Harvesting`);
const humanCloning = 100000 * PCSkillCheck;
if (V.cloningSystem !== 1 && V.rep <= 18000 * PCSkillCheck) {
App.UI.DOM.appendNewElement("div", node, `You lack the reputation needed to access methods for human cloning`, ["note"]);
} else if ((V.cloningSystem !== 1) && (V.rep > 18000 * PCSkillCheck)) {
if (V.organFarmUpgrade === 0) {
App.UI.DOM.appendNewElement("div", node, `An organ farm is needed to grow the blank embryo to serve as a clone base`, ["note"]);
if (V.cloningSystem === 0) {
if (V.rep <= 18000 * PCSkillCheck) {
if (V.rep >= 20_000) {
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"]);
} else {
App.UI.DOM.appendNewElement("div", node, `You lack the reputation needed to access methods for human cloning`, ["note"]);
}
} else {
App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link(
"Purchase methods for human cloning",
() => {
cashX(forceNeg(humanCloning), "capEx");
V.cloningSystem = 1;
App.UI.reload();
}, [], "",
`Costs ${cashFormat(humanCloning)}. Will allow children to be created with identical base genetics as the source DNA`
));
if (V.organFarmUpgrade === 0) {
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, App.UI.DOM.link(
"Purchase methods for human cloning",
() => {
cashX(forceNeg(humanCloning), "capEx");
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) {
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.`);
......
......@@ -404,7 +404,7 @@ App.UI.dispensary = function() {
}
if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
App.Events.addNode(p, ["The fabricator has been upgraded to manufacture growth reversing drugs."], "div");
App.Events.addNode(p, ["The fabricator has been upgraded to manufacture drugs to shrink slaves' assets."], "div");
} else if (V.arcologies[0].FSSlimnessEnthusiastDecoration === 100) {
if (V.rep >= 5000 * pcSkillCheck) {
p.append(upgrade("Fund research into drug formulations for slimming slaves", ["Will allow creation of drugs to shrink assets."], () => { V.arcologies[0].FSSlimnessEnthusiastResearch = 1; }, 30000 * pcSkillCheck));
......
......@@ -15,10 +15,8 @@ App.Facilities.Nursery.childList = function childList() {
const weeksOwned = V.week - child.weekAcquired;
const weeksLeft = (V.targetAgeNursery * 52) - weeksOwned;
const {he, him, He} = getPronouns(child);
const hr = document.createElement("hr");
hr.style.margin = "0";
list.appendChild(hr);
list.appendChild(App.UI.sectionBreak());
if (child.actualAge < 3) {
$(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() {
App.UI.reload();
}), ['indent']);
} else if (bodyguard !== null) {
V.pit.slaveFightingBodyguard = null;
}
return el;
}
......
......@@ -152,9 +152,7 @@ App.UI.mediaStudio = function() {
if (V.slavePanelStyle === 0) {
res.appendChild(document.createElement("br"));
} else if (V.slavePanelStyle === 1) {
const hr = document.createElement("hr");
hr.style.margin = "0";
res.appendChild(hr);
res.appendChild(App.UI.sectionBreak());
}
if (batchRenderer && (!V.seeCustomImagesOnly || (V.seeCustomImagesOnly && slave.custom.image))) {
......
......@@ -35,6 +35,7 @@ App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) {
return frag;
function geneTesting() {
const geneRecord = getGenePoolRecord(slave);
const el = new DocumentFragment();
const slaveGeneTest = App.UI.DOM.appendNewElement("ul", el);
......@@ -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, `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, `Intelligence index: ${slave.intelligence} out of 100`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Face index: ${slave.face} out of 100`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Genetic intelligence index: ${geneRecord.intelligence} 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 breast size: ${slave.natural.boobs}cc`);
App.UI.DOM.appendNewElement("li", slaveGeneTest, `Eye color: ${capFirstChar(slave.eye.origColor)}`);
......
......@@ -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) {
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) {
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 = {
contains: [],
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": {
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.`,
......
......@@ -384,7 +384,7 @@ App.Encyclopedia.addArticle("Design Your Master", function() {
}
r.push("Your starting slaves will have free");
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"), "."));
App.Events.addNode(ul, r, "li");
......
// cSpell:ignore SSAA
// cSpell:ignore SSAA, Oobabooga
App.UI.optionsPassage = function() {
const el = new DocumentFragment();
......@@ -135,7 +135,8 @@ App.UI.optionsPassage = function() {
options.addOption("The Security Expansion mod is", "secExpEnabled")
.addValue("Enabled", 1).on()
.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")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
......@@ -773,7 +774,7 @@ App.UI.optionsPassage = function() {
options.addOption("Experimental AI chat tab in slave interact is ", "aiChat")
.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){
options.addOption("API URL", "aiChatUrl").showTextBox().addComment("The URL of the OpenAI-compatible, self-hosted endpoint.");
......@@ -824,9 +825,21 @@ App.UI.optionsPassage = function() {
.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.");
options.addOption("Slave Fertility Cycles", "menstruation")
.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
.addComment("Adds slave fertility cycles. Slaves can only get pregnant on their fertile week. Fertility drugs can force slaves into a fertile week.");
options.addOption("Fertility Cycles", "menstruation")
.addValue("Enabled", 1).on()
.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)
.addValue("No control", 0, () => V.eventControl.RIEPerWeek = Math.min(V.eventControl.RIEPerWeek, 3))
......@@ -967,6 +980,9 @@ App.Intro.display = function(isIntro) {
options.addOption("Condense special slaves into their own tab", "useSlaveSummaryOverviewTab")
.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")
.addValueList([["next to them", 1], ["at page bottom", 0]]);
......@@ -1188,6 +1204,26 @@ App.Intro.contentAndFlavor = function(isIntro) {
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")
.addValueList([
["None (0%)", 0],
......
......@@ -451,7 +451,6 @@ App.UI.OptionsGroup = (function() {
constructor(comment) {
super();
this.comment = comment;
this.long = false;
}
/**
......@@ -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 {
constructor() {
/**
......@@ -567,6 +676,17 @@ App.UI.OptionsGroup = (function() {
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}
*/
......