diff --git a/devNotes/twine CSS b/devNotes/twine CSS index ce696d3590d694d484ba475d3fd3065682aea4b1..e3da430ae7e5616908919995f033dfb7add7508c 100644 --- a/devNotes/twine CSS +++ b/devNotes/twine CSS @@ -643,6 +643,7 @@ div.tab button.active { .optionDescription { display: block; width: unset; + text-align: left; } .optionMacro { @@ -698,13 +699,23 @@ div.tab button.active { box-sizing: border-box; } +.optionValue { + display: inline-flex; + flex-wrap: wrap; +} + .optionValue input { padding: 3px; background: linear-gradient(transparent,#222); border: #555 solid 0.5px; border-top-width: 0; - min-width: reset; + min-width: unset; width: 140px; + height: 22px; +} + +.optionMacroNumber input { + width: 50px; } .optionValue input:last-child { diff --git a/src/SpecialForce/Firebase.tw b/src/SpecialForce/Firebase.tw index 586932152b42c86830f35a9d384c600ae8994a71..8392508f226c90875091490d0abf9e5df191c629 100644 --- a/src/SpecialForce/Firebase.tw +++ b/src/SpecialForce/Firebase.tw @@ -130,7 +130,7 @@ is in no condition initially to greet you. She's naked except for one sock that gives you a very good view of her muscled, taut body while lunging with her feet on the table and the rest on her couch. She is face-down in a drugged-out stupor in the middle of a wide variety of powders and pills. Perhaps sensing your approach, her head suddenly shoots up and looks at you with unfocused, bloodshot eyes. "Sorry, <<= SFCR()>>," she slurs, wiping her face and weakly holding up a hand. "Hold on a second, I need something to help me out here. Long fucking night." She struggles to sit on the couch and bending over the table, loudly snorts up some of the white powder on it. "Ahhh, fuck," she says, breathing heavily.<br><br> She shakes her head powerfully now looking at you, her eyes once again alert and piercing. "That's better," she says, leaning back on the couch and giving you another good view of her assets. "So, <<= SFCR()>>," she begins, "what brings you down here to our little clubhouse? I trust you're happy with how we've been handling things out there?" You nod. "Excellent", she laughs. "I have to say; it's nice to have a place like this while having some top-end gear and to be able to have fun out there without worrying about anyone coming back on us. Good fucking times." She laughs again. "So — I'm assuming you want something?" <<elseif random(0,100) > 70 && $SF.Depravity >= 1.5 && $SF.Colonel.Core == "cruel">> is relaxing on her couch stark naked, greeting you with a raised hand. Between her tightly clenched legs is a slave girl being forced to eat her out. "Hey, <<= SFCR()>>, what's —" she breaks off as a flash of pain crosses her features. "Fucking bitch!" she exclaims, pulling her legs away and punching the slave girl in the face. She pushes the girl to the ground, straddling her then begins hitting. You hear one crunch after another as The Colonel's powerful blows shatter the girl's face. She hisses from between clenched teeth, each word accompanied by a brutal punch. "How. Many. Fucking. Times. Have. I. Told. You. To. Watch. Your. Fucking. Teeth. On. My. Fucking. Clit!" She leans back, exhaling heavily. Before leaning back down to grip apply pressure onto the girl's neck with her powerful hands. Wordlessly, she increases the pressure and soon the girl begins to turn blue as she struggles to draw breath. Eventually her struggles weaken and then finally, end.<br><br> The Colonel relaxes her grip then wipes her brow, clearing away the sweat from her exertion. Finally rising from the girl's body, relaxing back on the couch and putting her feet back up on the table. "Sorry about that <<= SFCR()>>," she says, shrugging. "So many of these bitches we pick up from the outside don't understand that they have to behave." Shaking her head in frustration, "Now I need to find another one. But that's not your problem — you're here to talk business. So, what's up?" - >>else>> + <<else>> is topless while reviewing the particulars of her unit on a tablet as you approach. She raises a hand in greeting. "Hey <<= SFCR()>>," she says, noticing you looking at her chest. She laughs. "Nice, aren't they? But they're not for you or them." She throws a thumb at the plaza around her. "You're down here for a reason, though. What can I do for you?" <</if>> </div> <<if _S.Firebase === 10>> diff --git a/src/SpecialForce/SpecialForce.js b/src/SpecialForce/SpecialForce.js index cbee9283d519e999f0ae98791c96f1878edff3d1..6e93570675bb6b78ac18c2376f050b3cef05aa81 100644 --- a/src/SpecialForce/SpecialForce.js +++ b/src/SpecialForce/SpecialForce.js @@ -133,7 +133,7 @@ window.SFBC = function() { SFInit(); } } else { - if (V.SF.MercCon.View) delete V.SF.MercCon.View; + if (V.SF.MercCon && V.SF.MercCon.View) delete V.SF.MercCon.View; if (V.SFUC > 0) V.SF.UC.num = V.SFUC; delete V.SFUC; if (V.SF.Active === -1) SFInit(); if (V.SF.MWU) delete V.SF.MWU; @@ -533,8 +533,8 @@ window.BadOutcome = function() { window.UnitText = function(input) { "use strict"; const V = State.variables; - T = State.temporary; - S = V.SF.Squad; + const T = State.temporary; + const S = V.SF.Squad; let r = ``; switch(input) { case 'firebase': diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index de1b06004458e671148e4897aadc79abdcd29fcf..043b157a22ef6a9a6cb2592bb5cb5afa0a17f5a6 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with thi <<set $returnTo = "init", $nextButton = "Continue", $nextLink = "Alpha disclaimer">> <<unset $releaseID>> -<<set $ver = "0.10.7", $pmodVer = "2.2.X", $releaseID = 1042>> +<<set $ver = "0.10.7", $pmodVer = "2.2.X", $releaseID = 1043>> <<if ndef $pmodVer>><<set $pmodVer = "2.2.X">><</if>> /* This needs to be broken down into individual files that can be added to StoryInit instead. */ diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index 8fd3ac027b6755fe3fa2ffb78c8ccc3fe96c9c9a..7a86300876ee1bb426a4f9061de2ab6c7a793c39 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -185,8 +185,12 @@ window.ruleAppliesP = function ruleAppliesP(cond, slave) { // assignment / facility / special slaves / specific slaves check let assignment = slave.assignment; if (assignment === "be your Concubine") assignment = "serve in the master suite"; + + if (cond.specialSlaves !== -1) { // not "Include", which means "doesn't matter" + flag = flag && (cond.specialSlaves == isLeaderP(slave)); // eslint-disable-line eqeqeq + } + flag = flag && - !(cond.excludeSpecialSlaves && isLeaderP(slave)) && (cond.assignment.length === 0 || cond.assignment.includes(assignment)) && (cond.selectedSlaves.length === 0 || cond.selectedSlaves.includes(slave.ID)) && !(cond.excludedSlaves.includes(slave.ID)); @@ -201,7 +205,7 @@ window.emptyDefaultRule = function emptyDefaultRule() { condition: { function: false, data: {}, - excludeSpecialSlaves: false, + specialSlaves: -1, assignment: [], selectedSlaves: [], excludedSlaves: [], diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index acce062418cf14843d6ef0114cffe3cc24115b5f..dc0963c0bf1fa9f0e6f9bf9ae9cedbbc90af4cc2 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -508,7 +508,7 @@ window.rulesAssistantOptions = (function() { super("Activation Condition"); this.appendChild(new ConditionFunction()); this.appendChild(new AssignmentInclusion()); - this.appendChild(new SpecialExclusion()); + this.appendChild(new SpecialInclusion()); this.appendChild(new SpecificInclusionExclusion()); } } @@ -828,15 +828,16 @@ window.rulesAssistantOptions = (function() { } } - class SpecialExclusion extends List { + class SpecialInclusion extends List { constructor() { const items = [ - ["Yes", true], - ["No", false] + ["Include", -1], + ["Exclude", 0], + ["Only", 1] ]; - super("Exclude special slaves", items); - this.setValue(current_rule.condition.excludeSpecialSlaves); - this.onchange = (value) => current_rule.condition.excludeSpecialSlaves = value; + super("Special slaves", items); + this.setValue(current_rule.condition.specialSlaves); + this.onchange = (value) => current_rule.condition.specialSlaves = value; } } diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index edcf03c510c9c9257b073b4e77a44f6946b6d202..7f2a7467ec86365583c8d7acf569965d0000b233 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -4907,9 +4907,9 @@ App.UI.slaveSummaryList = function (passageName) { */ if (((_Count > 1) && (_indexed === 0) && (((passageName === 'Main') && (V.Flag === undefined) && ((V.useSlaveSummaryTabs === 0) || (V.slaveAssignmentTab === "all"))) || (V.Flag === 1)))) { - let _indexed = 1; - _counter = 0; - _buttons = []; + let _indexed = 1, + _counter = 0, + _buttons = [], _offset = -50; if (/Select/i.test(passageName)) { _offset = -25; diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw index 54be8507388a9f6e3708f46a25a99aa2237eea8d..856d55e44b47dc7979ab7312559f0d027771d040 100644 --- a/src/npc/startingGirls/startingGirls.tw +++ b/src/npc/startingGirls/startingGirls.tw @@ -421,7 +421,6 @@ __You are customizing this slave:__ | <<link "Start over with a random slave" "Starting Girls">> <<set $fixedNationality = hashChoice($nationalities)>> <<StartingGirlsWorkaround>> -<<StartingGirlsRefresh>> <<SaleDescription>> <<StartingGirlsCost>> <</link>> diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index 7389d62645c0084ca176bd48d60f05cb95f7cc34..35e6d589d50ae2bb2ac66b42e9c8f10ae5107529 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -3557,8 +3557,19 @@ Done! <<set $abbreviateHormoneBalance = 2>> <</if>> -<<if $releaseID < 1036>> - <<set $releaseID = 1036>> +<<if $releaseID < 1043>> + <<for _rule range $defaultRules>> + <<if _rule.condition.excludeSpecialSlaves>> + <<set _rule.condition.specialSlaves = 0>> + <<else>> + <<set _rule.condition.specialSlaves = -1>> + <</if>> + <<run delete _rule.condition.excludeSpecialSlaves>> + <</for>> +<</if>> + +<<if $releaseID < 1043>> + <<set $releaseID = 1043>> <</if>> <<set $HackingSkillMultiplier = HackingSkillMultiplier()>> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 43fc0b77538527a3443c4e1e6bb98aebfc71239a..801cf1b0b48dd65cef611db7748db792fc92eef3 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -8622,16 +8622,29 @@ You tell $him kindly that you understand, and that $he'll be trained to address <<case "devoted amp">> -<<if $activeSlave.belly < 1500 && canDoAnal($activeSlave)>> -<<link "Carry $him over to your work">> - <<EventNameDelink $activeSlave>> - <<replace "#result">> - Since you're so busy, you find a way of working and seeing to your sex toy both. You scoop $him up, eliciting whimpers of joy at the impending relief, <<if $PC.dick == 0>>and move over to the couch so you can work lying down. You sit $him on top of you, reversed so $his head is between your legs for a little oral service, and slide a dildo up $his butt so you can sodomize $him at leisure when you have a spare moment.<<else>>and sit back down at your desk. You slide $him onto your erect member and carefully secure $him with a few straps so $he can serve as your living cocksleeve as you see to your business.<</if>> There isn't much thrusting as you continue with your affairs, but $he's so horny $he doesn't need it. @@.hotpink;$He has become more submissive to you.@@ There's no telling what the day's faceless business interlocutors would think if they knew the person on the other side of their communications had <<if $PC.dick == 0>>a limbless slave gently sucking _hisP clit while they spoke with _himP<<else>>_hisP cock inside a limbless slave as _heP dealt with them<</if>>. - <<set $activeSlave.devotion += 4, $activeSlave.analCount++, $analTotal++>> - <</replace>> -<</link>> +<<if $activeSlave.belly < 1500 && (canDoAnal($activeSlave) || canDoVaginal($activeSlave))>> + <<link "Carry $him over to your work">> + <<EventNameDelink $activeSlave>> + <<replace "#result">> + Since you're so busy, you find a way of working and seeing to your sex toy both. You scoop $him up, eliciting whimpers of joy at the impending relief, + <<if $PC.dick == 0>> + and move over to the couch so you can work lying down. You sit $him on top of you, reversed so $his head is between your legs for a little oral service, and slide a dildo + <<if canDoVaginal($activeSlave)>> + into $his pussy so you can tease $him at leisure when you have a spare moment. + <<= VaginalVCheck()>> + <<else>> + up $his butt so you can sodomize $him at leisure when you have a spare moment. + <<= AnalVCheck()>> + <</if>> + <<else>> + and sit back down at your desk. You slide $him onto your erect member and carefully secure $him with a few straps so $he can serve as your living cocksleeve as you see to your business. + <</if>> + There isn't much thrusting as you continue with your affairs, but $he's so horny $he doesn't need it. @@.hotpink;$He has become more submissive to you.@@ There's no telling what the day's faceless business interlocutors would think if they knew the person on the other side of their communications had <<if $PC.dick == 0>>a limbless slave gently sucking _hisP clit while they spoke with _himP<<else>>_hisP cock inside a limbless slave as _heP dealt with them<</if>>. + <<set $activeSlave.devotion += 4>> + <</replace>> + <</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take anal virginity//<</if>> <</if>> -<<if ($PC.dick == 1) && (canDoAnal($activeSlave) || (canDoVaginal($activeSlave) && $activeSlave.vagina > 0)) && $PC.belly < 100>> +<<if ($PC.dick == 1) && (canDoAnal($activeSlave) || canDoVaginal($activeSlave)) && $PC.belly < 100>> <br><<link "Carry $him outside">> <<EventNameDelink $activeSlave>> <<replace "#result">> @@ -8650,9 +8663,8 @@ You tell $him kindly that you understand, and that $he'll be trained to address <<= AnalVCheck()>> <</if>> <</replace>> -<</link>> +<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //This option will take virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take anal virginity//<</if>> <</if>> -<<if (canDoAnal($activeSlave) || (canDoVaginal($activeSlave) && $activeSlave.vagina > 0))>> <br><<link "See how high $his arousal will go">> <<EventNameDelink $activeSlave>> <<replace "#result">> @@ -8660,15 +8672,30 @@ You tell $him kindly that you understand, and that $he'll be trained to address <<if canDoVaginal($activeSlave) && $activeSlave.vagina > 0>> After so much of this that $he's clearly ready to orgasm at the slightest further touch, you gently massage $his nether lips with a single finger and $he comes spastically, abdominal muscles quivering. $His pussy relaxes and opens naturally; taking the cue, you pick $him up and lower $him, <<if $showInches == 2>>inch<<else>>centimeter<</if>> by moaning <<if $showInches == 2>>inch<<else>>centimeter<</if>>, onto <<if $PC.dick == 0>>a strap-on you put on while playing with $his<<else>>your cock<</if>>. <<= VaginalVCheck()>> - <<else>> + After pumping $his helpless torso up and down with your arms, a parody of masturbation with $his helpless body, + <<elseif canDoAnal($activeSlave) && $activeSlave.anus > 0>> After so much of this that $he's clearly ready to orgasm at the slightest further touch, you gently massage $his anus with a single finger and $he comes spastically, abdominal muscles quivering. $His sphincter relaxes and opens naturally; taking the cue, you pick $him up and lower $his rectum, <<if $showInches == 2>>inch<<else>>centimeter<</if>> by sobbing <<if $showInches == 2>>inch<<else>>centimeter<</if>>, onto <<if $PC.dick == 0>>a strap-on you put on while playing with $his<<else>>your cock<</if>>. <<= AnalVCheck()>> + After pumping $his helpless torso up and down with your arms, a parody of masturbation with $his helpless body, + <<else>> + After so much of this that $he's clearly ready to orgasm at the slightest further touch, you grab $his + <<if $activeSlave.boobs > 8000>> + massive tits + <<elseif Math.floor($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> + fake tits + <<elseif $activeSlave.boobs > 2000>> + huge boobs + <<elseif $activeSlave.boobs > 400>> + boobs + <<else>> + petite chest + <</if>> + and $he comes spastically, soaking $himself and your desk with fluids. Once you tire of vigorously groping $him, <</if>> - After pumping $his helpless torso up and down with your arms, a parody of masturbation with $his helpless body, you carry your toy to the shower to wash $him. @@.mediumaquamarine;$He has become more trusting of you.@@ + you carry your toy to the shower to wash $him. @@.mediumaquamarine;$He has become more trusting of you.@@ <<set $activeSlave.trust += 4>> <</replace>> <</link>> -<</if>> <<case "plug disobedience">> diff --git a/src/utility/slaveCreationWidgets.tw b/src/utility/slaveCreationWidgets.tw index a12a59a6fb45665a7e54dbe520d33365864d5896..842216fbb6350a87a0504d5cf07261d9fd1b9b90 100644 --- a/src/utility/slaveCreationWidgets.tw +++ b/src/utility/slaveCreationWidgets.tw @@ -59,7 +59,6 @@ <<replace "#cost">> <<SlaveCostDescription>> <</replace>> -<<replace "#finalize">> <<if $cash >= $slaveCost>> <<set $activeSlave.actualAge = Number($activeSlave.actualAge) || 18>> <<set $activeSlave.devotion = Number($activeSlave.devotion) || 0>> @@ -124,7 +123,6 @@ <</if>> <br> [[Discard this slave and continue|Acquisition]] -<</replace>> <</widget>> /%