diff --git a/devTools/types/FC/RA.d.ts b/devTools/types/FC/RA.d.ts index 4552816cf06dc92914abb6a88d289ca20914f201..973663067ed47fe75d524273851e4d140286bc45 100644 --- a/devTools/types/FC/RA.d.ts +++ b/devTools/types/FC/RA.d.ts @@ -138,7 +138,7 @@ declare namespace FC { standardReward: Rules.Reward; weight: NumericRange; diet: string; - dietCum: number; + dietCum: 0 | 1 | 2; dietMilk: FC.dietMilkType; onDiet: number; muscles: NumericTarget; diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index 73c08b7a4727cfe8974467c90f3ad4387bf408a7..ea6789ee623f4e3b2650696473c34e7abfd50534 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1,113 +1,87 @@ -// this code applies RA rules onto slaves -globalThis.DefaultRules = (function() { - "use strict"; - - const assignedTypes = { - "auto": {success: "has been automatically assigned", unable: "could not be assigned"}, - "allowed": {success: "is allowed", unable: "could not be allowed"}, - }; - const getAssignmentDescription = function({rule, slave, assignmentResult, append = null}) { - const assignment = rule.setAssignment === Job.CHOICE - ? { - descriptionType: "allowed", - work: `select ${pronouns.his} own assignments` - } : { - descriptionType: "auto", - work: App.Utils.jobForAssignment(rule.setAssignment).assignment - }; - - const assignedTypeInfo = assignedTypes[assignment.descriptionType]; - const hasBeenAssigned = assignedTypeInfo[assignmentResult]; - return `<br>${slave.slaveName} ${hasBeenAssigned} to ${assignment.work}${append || ''}.`; - }; +/** + * this code applies RA rules onto slaves + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +globalThis.DefaultRules = function(slave) { + if (slave.useRulesAssistant === 0) { + return ""; // exempted + } - /** @type {string} */ - let r; - let pronouns; - let he; - let him; - let his; + const slaveReadOnly = createReadonlyProxy(slave); + const {rule, ruleIds} = runWithReadonlyProxy(() => ProcessSlaveRules(slaveReadOnly)); + slave.currentRules = ruleIds; + if (ruleIds.length === 0) { + return ""; // no rules apply + } - /** - * @param {App.Entity.SlaveState} slave - * @returns {string} - */ - function DefaultRules(slave) { - if (slave.useRulesAssistant === 0) { - return r; - } // exempted - r = ""; - ({he, him, his} = pronouns = getPronouns(slave)); - const slaveReadOnly = createReadonlyProxy(slave); - const {rule, ruleIds} = runWithReadonlyProxy(() => ProcessSlaveRules(slaveReadOnly)); - slave.currentRules = ruleIds; - if (ruleIds.length === 0) { - return r; - } // no rules apply - - AssignJobToSlave(slave, rule); - if (slave.fuckdoll === 0) { - ProcessClothing(slave, rule); - ProcessCollar(slave, rule); - ProcessMask(slave, rule); - ProcessGag(slave, rule); - ProcessEyewear(slave, rule); - ProcessEarwear(slave, rule); - ProcessDildos(slave, rule); - ProcessDickAccessories(slave, rule); - ProcessAnalAccessories(slave, rule); - ProcessChastity(slave, rule); - ProcessShoes(slave, rule); - ProcessBellyAccessories(slave, rule); - ProcessArmAccessory(slave, rule); - ProcessLegAccessory(slave, rule); - } - ProcessPit(slave, rule); - ProcessBellyImplant(slave, rule); - if (isFertile(slave) || slave.pregWeek < 0) { - ProcessContraceptives(slave, rule); - } - if (slave.preg > 0 && slave.pregKnown === 1 && slave.broodmother === 0) { - ProcessAbortions(slave, rule); - } - ProcessDrugs(slave, rule); - ProcessEnema(slave, rule); - ProcessDiet(slave, rule); - ProcessCuratives(slave, rule); - ProcessAphrodisiacs(slave, rule); - ProcessPenisHormones(slave, rule); - ProcessFemaleHormones(slave, rule); - ProcessPregnancyDrugs(slave, rule); - if (slave.fuckdoll === 0) { - ProcessLivingStandard(slave, rule); - ProcessRest(slave, rule); - ProcessSpeech(slave, rule); - ProcessRelationship(slave, rule); - ProcessRelease(slave, rule); - ProcessLactation(slave, rule); - if (!canWalk(slave) && canMove(slave)) { - ProcessMobility(slave, rule); - } - ProcessPunishment(slave, rule); - ProcessReward(slave, rule); - } - ProcessToyHole(slave, rule); - ProcessDietCum(slave, rule); - ProcessDietMilk(slave, rule); - if (V.arcologies[0].FSHedonisticDecadenceResearch === 1) { - ProcessSolidFood(slave, rule); - } - ProcessTeeth(slave, rule); - ProcessStyle(slave, rule); - ProcessPiercings(slave, rule); - ProcessSmartPiercings(slave, rule); - ProcessTattoos(slave, rule); - ProcessPornFeedEnabled(slave, rule); - ProcessPorn(slave, rule); - ProcessLabel(slave, rule); - ProcessOther(slave, rule); - return r; + let r = ""; + const pronouns = getPronouns(slave); + const {he, him, his} = pronouns; + + AssignJobToSlave(slave, rule); + if (slave.fuckdoll === 0) { + ProcessClothing(slave, rule); + ProcessCollar(slave, rule); + ProcessMask(slave, rule); + ProcessGag(slave, rule); + ProcessEyewear(slave, rule); + ProcessEarwear(slave, rule); + ProcessDildos(slave, rule); + ProcessDickAccessories(slave, rule); + ProcessAnalAccessories(slave, rule); + ProcessChastity(slave, rule); + ProcessShoes(slave, rule); + ProcessBellyAccessories(slave, rule); + ProcessArmAccessory(slave, rule); + ProcessLegAccessory(slave, rule); + } + ProcessPit(slave, rule); + ProcessBellyImplant(slave, rule); + if (isFertile(slave) || slave.pregWeek < 0) { + ProcessContraceptives(slave, rule); + } + if (slave.preg > 0 && slave.pregKnown === 1 && slave.broodmother === 0) { + ProcessAbortions(slave, rule); + } + ProcessDrugs(slave, rule); + ProcessEnema(slave, rule); + ProcessDiet(slave, rule); + ProcessCuratives(slave, rule); + ProcessAphrodisiacs(slave, rule); + ProcessPenisHormones(slave, rule); + ProcessFemaleHormones(slave, rule); + ProcessPregnancyDrugs(slave, rule); + if (slave.fuckdoll === 0) { + ProcessLivingStandard(slave, rule); + ProcessRest(slave, rule); + ProcessSpeech(slave, rule); + ProcessRelationship(slave, rule); + ProcessRelease(slave, rule); + ProcessLactation(slave, rule); + if (!canWalk(slave) && canMove(slave)) { + ProcessMobility(slave, rule); + } + ProcessPunishment(slave, rule); + ProcessReward(slave, rule); } + ProcessToyHole(slave, rule); + ProcessDietCum(slave, rule); + ProcessDietMilk(slave, rule); + if (V.arcologies[0].FSHedonisticDecadenceResearch === 1) { + ProcessSolidFood(slave, rule); + } + ProcessTeeth(slave, rule); + ProcessStyle(slave, rule); + ProcessPiercings(slave, rule); + ProcessSmartPiercings(slave, rule); + ProcessTattoos(slave, rule); + ProcessPornFeedEnabled(slave, rule); + ProcessPorn(slave, rule); + ProcessLabel(slave, rule); + ProcessOther(slave, rule); + return r; + /** * @param {App.Entity.SlaveState} slave @@ -132,8 +106,9 @@ globalThis.DefaultRules = (function() { * @returns {FC.RA.RuleSetters} */ function ProcessAssignments(slave, rule) { - // Before merging rules, we process assignments for each rule separately so we can remove slaves from facilities when they no longer qualify, even if the final "winning" rule assigns them elsewhere - // We also ignore inapplicable assignments for the current slave, so we only merge assignments that are valid + // Before merging rules, we process assignments for each rule separately, so we can remove slaves from + // facilities when they no longer qualify, even if the final "winning" rule assigns them elsewhere. + // We also ignore inapplicable assignments for the current slave, so we only merge assignments that are valid. if (rule.setAssignment === null) { delete rule.setAssignment; return rule; @@ -160,8 +135,7 @@ globalThis.DefaultRules = (function() { removeAssignment(); } else if (!job.facility.hasFreeSpace && slave.assignment !== rule.setAssignment) { r += getAssignmentDescription({ - rule, slave, assignmentResult: "unable", - append: " because it was full" + rule, slave, assignmentResult: "unable", append: " because it was full" }); removeAssignment(); } @@ -184,6 +158,29 @@ globalThis.DefaultRules = (function() { } } + /** + * @param {object} params + * @param {FC.RA.RuleSetters} params.rule + * @param {App.Entity.SlaveState} params.slave + * @param {"success"|"unable"} params.assignmentResult + * @param {string} [params.append] + * @returns {string} + */ + function getAssignmentDescription({rule, slave, assignmentResult, append = null}) { + const assignment = rule.setAssignment === Job.CHOICE ? { + work: `select ${pronouns.his} own assignments`, + success: "is allowed", + unable: "could not be allowed" + } : { + work: App.Utils.jobForAssignment(rule.setAssignment).assignment, + success: "has been automatically assigned", + unable: "could not be assigned" + }; + + const hasBeenAssigned = assignment[assignmentResult]; + return `<br>${slave.slaveName} ${hasBeenAssigned} to ${assignment.work}${append || ''}.`; + } + /** * @param {App.Entity.SlaveState} slave * @param {FC.RA.RuleSetters} rule @@ -984,7 +981,7 @@ globalThis.DefaultRules = (function() { * @param {FC.RA.RuleSetters} rule */ function ProcessBellyImplant(slave, rule) { - // Here is belly implant size control, it's used in Surgery Degradation passage to setup devotion and trust changes. + // Here is belly implant size control, it's used in Surgery Degradation passage to set up devotion and trust changes. // silent calls to surgery degradation have been replaced with a js function, which is less hacky if ((rule.bellyImplantVol !== undefined) && slave.bellyImplant >= 0 && rule.bellyImplantVol >= 0) { r += "<br>"; @@ -1287,7 +1284,7 @@ globalThis.DefaultRules = (function() { * @param {{drug: FC.Drug, weight: number}[]} priorities * @param {number} step */ - function drugsImpl(slave, asset, target, priorities, step) { + function drugsImpl(slave, asset, target, priorities, step) { const flesh = App.Medicine.fleshSize(slave, asset); if (growDrugs[asset] !== null && App.RA.shallGrow(flesh, target, step) && App.Medicine.maxAssetSize(asset) > slave[asset]) { priorities.push({ @@ -1810,7 +1807,7 @@ globalThis.DefaultRules = (function() { * @param {number} hormones * @param {string} slaveClass */ - const applyHormones = (slave, hormones, slaveClass) => { + function applyHormones(slave, hormones, slaveClass) { if (!_.isNil(hormones)) { const newHormones = slave.indentureRestrictions >= 2 ? Math.clamp(hormones, -1, 1) : hormones; if (slave.hormones !== newHormones) { @@ -1818,7 +1815,7 @@ globalThis.DefaultRules = (function() { r += `<br>${slave.slaveName} is ${slaveClass}, so ${he} has been put on the appropriate hormonal regime.`; } } - }; + } /** * @param {App.Entity.SlaveState} slave @@ -3156,9 +3153,7 @@ globalThis.DefaultRules = (function() { slave.pronoun = rule.pronoun; } } - - return DefaultRules; -})(); +}; /** * @param {App.Entity.SlaveState} slave