diff --git a/devTools/DL-Loop.sh b/devTools/DL-Loop.sh new file mode 100755 index 0000000000000000000000000000000000000000..9f8e8e36eee36d0005cdcf43097296d5476b39cf --- /dev/null +++ b/devTools/DL-Loop.sh @@ -0,0 +1,30 @@ +#!/bin/bash +echo "Use temp?" && read varname1 +echo "Use upstream or origin? 1:0" && read varname2 +echo "Use master or current branch? 1:0" && read varname3 +echo "Dry run? 1:0" && read varname4 + +if [[ $varname2 == 1 ]];then + varname2='pregmodfan' +else + varname2=$(git remote show origin|grep -e /|head -n 1|sed s#git@ssh.gitgud.io:#https://gitgud.io/#|cut -c 32-|sed s#/fc-pregmod.git##) +fi +if [[ $varname3 == 1 ]];then + varname3='pregmod-master' +else + varname3=$(git rev-parse --abbrev-ref HEAD) +fi + +if [[ $varname4 == 1 ]];then + echo "https://gitgud.io/$varname2/fc-pregmod/raw/$varname3/" +else + for ((i=0; i<=$#; i++)) + do + if [[ $varname1 == y ]]; then + wget -q -P /tmp/ https://gitgud.io/$varname2/fc-pregmod/raw/$varname3/${!i} + else + #curl $varname3/raw/pregmod-master/${!i} + wget -q https://gitgud.io/$varname2/fc-pregmod/raw/$varname3/${!i} + fi + done +fi \ No newline at end of file diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts index fe3cc903d631966127416c4d0829d5df7d3d888f..a652e7bc901b4ae34b6480ad89440a21d3c28522 100644 --- a/devTools/FC.d.ts +++ b/devTools/FC.d.ts @@ -197,6 +197,8 @@ declare namespace App { inflationType: string; brandTarget: string; brandDesign: string; + scarTarget: string; + scarDesign: string; hornColor: string; } diff --git a/devTools/PreCompile.sh b/devTools/PreCompile.sh index 00c65c70264e08b5ec35d89303e86f26a2d50ee6..521e454a78ca89587c2af65d9a6e72f8ac6bb740 100755 --- a/devTools/PreCompile.sh +++ b/devTools/PreCompile.sh @@ -7,6 +7,6 @@ while true;do gen=0;cd $4; git fetch -q && if [ `git rev-list ...origin|wc -l` -gt 0 ];then git pull -q&&gen=1;fi #stackoverflow.com/a/17192101 if [[ $gen > 0 ]];then rm bin/*;./compile.sh -q&&cd bin/ mv *.h* FC-`git log -1 --format=%cd --date=format:%m-%d-%Y-%H-%M`-`git log|head -1|cut -c8-11`.html - mega-put -c *.h* $3&&mega-rm $3`mega-ls GitFC/|head -n 1` + mega-put -c *.h* $3&&mega-rm $3`mega-ls $3head -n 1` fi clear;sleep 15m;done \ No newline at end of file diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index cc3dab36f8d91864eddbabbb0c57a57093bfd8f1..b737cf777b33ad6f600efaf9cd40969f5632c350 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -2108,12 +2108,6 @@ variable used to set off the birth events 1 - birth this week 0 - not time yet -cSec: - -does she have a c-section scar -1 - yes -0 - no - bellyAccessory: may accept strings, use at own risk @@ -3531,16 +3525,10 @@ Has the slave gone through male puberty. 0 - no 1 - yes -scars: +scar: -not fully implemented. -0 - no scars -1 - light scarring -2 - heavy scarring -3 - fresh scarring -4 - burns -5 - menacing scar -6 - exotic scar +is an object +keys include any place on a slave body that can receive a scar, values are an object. This sub-object's keys are the kind of scar, and the property is an int showing how bad it is. breedingMark: diff --git a/src/SecExp/secExpSmilingMan.tw b/src/SecExp/secExpSmilingMan.tw index 4d2fc8a2a132267b8541c6d98ddd85c08678d185..b58a8526c213df0be3c55363fe3bfcb877b53d82 100644 --- a/src/SecExp/secExpSmilingMan.tw +++ b/src/SecExp/secExpSmilingMan.tw @@ -413,6 +413,7 @@ For such a criminal a simple execution is not enough. You order the $girl captured and crucified outside the city, with a mask resembling $his famous symbol. Your men quickly obey. $He never once shows sign of pain or fear, remaining stoic and proud to the end. Once $his life ends, you order a statue erected in commemoration of the death of the Smiling Man. From this day forward the statue of the crucified criminal will adorn your arcology and his legend will be forever entangled with yours. <br>Having dealt with the Smiling Man will provide @@.green;a large boost to your reputation, as well as a moderate amount of reputation each week.@@ + <<run repX(10000, "architecture")>> <<elseif $smilingManFate == 2>> <<set $activeSlave.clothes = "no clothing">> <<if $relationshipLM >= 4>> @@ -426,4 +427,4 @@ <br> <<include "New Slave Intro">> <</if>> -<</if>> +<</if>> \ No newline at end of file diff --git a/src/SpecialForce/Proposal.tw b/src/SpecialForce/Proposal.tw index fd04ace1eb007934f4453ade086258277c914d85..d4c8f7e746fc3c196c4ba884136ac405d9b4a517 100644 --- a/src/SpecialForce/Proposal.tw +++ b/src/SpecialForce/Proposal.tw @@ -16,6 +16,6 @@ Such a force would solve many problems. More soldiers would mean more control, w <<elseif $PC.warfare >= 50||$PC.career === "arcology owner">> <<set _price *= 0.75>> <</if>> -<br>[[Prepare for an announcement.|Security Force Naming-Colonel][$SF.Active = 1, $SF.IntroProgress = -1, App.SF.Init(), cashX(-_price, "specialForces")]] +<br>[[Prepare for an announcement.|Security Force Naming-Colonel][$SF.Active = 1, $SF.IntroProgress = -1, App.SF.Init(), cashX(forceNeg(_price), "specialForces")]] <br> //Initial costs are @@.yellowgreen;<<print cashFormat(_price)>>@@ and upon establishment the force will have significant support costs until it is self-sufficient.// <br>[[The current measures are enough|RIE Eligibility Check][$SF.Active = 0]] \ No newline at end of file diff --git a/src/SpecialForce/SpecialForce.js b/src/SpecialForce/SpecialForce.js index 5a0dd4fb98cc7d3963e8df4b5d2b0f06fcf5422d..418b23e7f91b00afe64e42b1780955a58927ffdc 100644 --- a/src/SpecialForce/SpecialForce.js +++ b/src/SpecialForce/SpecialForce.js @@ -624,7 +624,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `You bring up the topic of cultural development with the Colonel, and in doing so, you share your hopes that she might be willing to help you better acquaint the troops with your cultural mores. Her response was less than positive: `; switch (V.SF.Colonel.Core) { case "kind": - text += `"To be honest, I'm not too happy about this idea. Your plans for cultural development are too... Extreme. All we need to focus on is security, raiding, and recruiting. That is what my contract, OUR contract, states in the print. I'm sorry, but innovating upon our culture was not part of our agreement."`; + text += `"To be honest, I'm not too happy about this idea. Your plans for cultural development are too... extreme. All we need to focus on is security, raiding, and recruiting. That is what my contract, OUR contract, states in the print. I'm sorry, but innovating upon our culture was not part of our agreement."`; break; case "cruel": text += `"What the fuck? Didn't we talk about this, like, way back? No 'future society' bullshit! That was our agreement, boss. Do not bother me with this."`; diff --git a/src/SpecialForce/TrickShotNight.tw b/src/SpecialForce/TrickShotNight.tw index c857faa4afc2689c8fa82bcee6563291100b5eb1..02babdbd33cade39e2b15620365c5c8c26661bd2 100644 --- a/src/SpecialForce/TrickShotNight.tw +++ b/src/SpecialForce/TrickShotNight.tw @@ -43,130 +43,130 @@ Despite your direct elevator, interaction with the majority of your security for <br>//You lack the necessary funds to attend.// <<else>> /* cash >= 50000 */ -<br><<link "Attend the trick shot night">> - <<replace "#result">> - You instruct $assistantName to inform $SF.Lower that you will be attending their trick shot night, and after settling your affairs in the penthouse you head down to the firebase. The atmosphere in the firebase is casual, especially in comparison to the usual situations you meet them, though your security force still maintain some measure of decorum towards you as their employer. Eventually, you settle in at the table with a handful of $SF.Lower officers and turn your @@.yellowgreen;<<print cashFormat(50000)>>@@ into bullets. All that remains is to decide your strategy for the night. - <br><br> <span id="bountyresult"> + <br><<link "Attend the trick shot night">> + <<replace "#result">> + You instruct $assistantName to inform $SF.Lower that you will be attending their trick shot night, and after settling your affairs in the penthouse you head down to the firebase. The atmosphere in the firebase is casual, especially in comparison to the usual situations you meet them, though your security force still maintain some measure of decorum towards you as their employer. Eventually, you settle in at the table with a handful of $SF.Lower officers and turn your @@.yellowgreen;<<print cashFormat(50000)>>@@ into bullets. All that remains is to decide your strategy for the night. + <br><br> <span id="bountyresult"> - <<link "Play it safe">> - <<replace "#bountyresult">> - <<if random(1,100) > _shootChance>> - Despite your attempts to mitigate risk and play the safest shots possible, it seems lady luck has conspired against you this evening. However, even when your last bullet is shot, your security force pitch you a few bullets to keep you in the game for the rest of the night. You may have lost most of your ¤, but it seems you've @@.green;made some friends.@@ - <<run repX(5000, "event")>> - <<run cashX(-25000, "event")>> - <<else>> - While a careful eye for accuracy has buoyed you through the evening, ultimately lady luck is the decider in handing you the win in a number of close shots. Unfortunately your meticulous play limited your chance at a larger payout, and you only come away from the evening with @@.yellowgreen;<<print cashFormat(100000)>>@@ more than you arrived with and @@.green;the respect of your security force.@@ - <<run repX(5000, "event")>> - <<run cashX(10000, "event")>> - <</if>> - <</replace>> - <</link>> + <<link "Play it safe">> + <<replace "#bountyresult">> + <<if random(1,100) > _shootChance>> + Despite your attempts to mitigate risk and play the safest shots possible, it seems lady luck has conspired against you this evening. However, even when your last bullet is shot, your security force pitch you a few bullets to keep you in the game for the rest of the night. You may have lost most of your ¤, but it seems you've @@.green;made some friends.@@ + <<run repX(5000, "event")>> + <<run cashX(-25000, "event")>> + <<else>> + While a careful eye for accuracy has buoyed you through the evening, ultimately lady luck is the decider in handing you the win in a number of close shots. Unfortunately your meticulous play limited your chance at a larger payout, and you only come away from the evening with @@.yellowgreen;<<print cashFormat(100000)>>@@ more than you arrived with and @@.green;the respect of your security force.@@ + <<run repX(5000, "event")>> + <<run cashX(10000, "event")>> + <</if>> + <</replace>> + <</link>> - <<if random(1,100) < _shootChance>> - <br> <<link "Up the ante">> - <<replace "#bountyresult">> - <<set $activeSlaveOneTimeMinAge = 25>> - <<set $activeSlaveOneTimeMaxAge = 35>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> - <<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> - <</if>> - <<if $seeDicks != 100>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<else>> - <<set $activeSlave = GenerateNewSlave("XY")>> - <</if>> - <<set $activeSlave.origin = "$He put $himself up as collateral at a trick shot game, and lost.">> - <<set $activeSlave.career = "a soldier">> - <<set $activeSlave.indentureRestrictions = 2>> - <<set $activeSlave.indenture = 52>> - <<set $activeSlave.devotion = random(45,60)>> - <<set $activeSlave.trust = random(55,65)>> - <<set $activeSlave.health = random(60,80)>> - <<set $activeSlave.muscles = 60>> - <<if $activeSlave.weight > 130>> - <<set $activeSlave.weight -= 100>> - <<set $activeSlave.waist = random(-10,50)>> - <</if>> - <<set $activeSlave.anus = 0>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.combat = 1>> - <<set $activeSlave.accent = random(0,1)>> - <<set $activeSlave.behavioralFlaw = "arrogant">> - <<set $activeSlave.hLength = 1>> - <<set $activeSlave.hStyle = "buzzcut">> - <<set $activeSlave.clothes = "a military uniform">> - <<setLocalPronouns $activeSlave>> - <span id="artFrame"> - /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> - <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> - <</if>> - <</if>> - /* 000-250-006 */ - </span> - Some aggressive play and an eye for riling up your fellow players has resulted in an immense payout, and all but one of your adversaries have folded as the situation has escalated. The only player still in contention is a wily old mercenary, the veteran of $his fair share of battles on the battlefield and at the firing range. $He's short on bullets, however, and $he'll have to buy in with something else as collateral. - <br><br> <span id="aliveresult"> - - <<link "A year of servitude">> - <<set $activeSlave.clothes = "no clothing">> - <<replace "#aliveresult">> - <<if random(1,100) > _shootChance>> - For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck was not on your side. As the victor sweeps up $his spoils, the other security force clap you on the back and offer their condolences for your defeat. Though you may have lost your ¤, it seems you've @@.green;made some friends.@@ - <<run repX(5000, "event")>> - <<run cashX(-50000, "event")>> + <<if random(1,100) < _shootChance>> + <br> <<link "Up the ante">> + <<replace "#bountyresult">> + <<set $activeSlaveOneTimeMinAge = 25>> + <<set $activeSlaveOneTimeMaxAge = 35>> + <<set $one_time_age_overrides_pedo_mode = 1>> + <<set $oneTimeDisableDisability = 1>> + <<if $arcologies[0].FSSupremacistLawME == 1>> + <<set $fixedRace = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME == 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set $fixedRace = _races.random()>> + <</if>> + <<if $seeDicks != 100>> + <<set $activeSlave = GenerateNewSlave("XX")>> <<else>> - <<replace "#artFrame">> - <span id="artFrame"> - /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<set $activeSlave = GenerateNewSlave("XY")>> + <</if>> + <<set $activeSlave.origin = "$He put $himself up as collateral at a trick shot game, and lost.">> + <<set $activeSlave.career = "a soldier">> + <<set $activeSlave.indentureRestrictions = 2>> + <<set $activeSlave.indenture = 52>> + <<set $activeSlave.devotion = random(45,60)>> + <<set $activeSlave.trust = random(55,65)>> + <<set $activeSlave.health = random(60,80)>> + <<set $activeSlave.muscles = 60>> + <<if $activeSlave.weight > 130>> + <<set $activeSlave.weight -= 100>> + <<set $activeSlave.waist = random(-10,50)>> + <</if>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.skill.anal = 0>> + <<set $activeSlave.skill.whoring = 0>> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.accent = random(0,1)>> + <<set $activeSlave.behavioralFlaw = "arrogant">> + <<set $activeSlave.hLength = 1>> + <<set $activeSlave.hStyle = "buzzcut">> + <<set $activeSlave.clothes = "a military uniform">> + <<setLocalPronouns $activeSlave>> + <span id="artFrame"> + /* 000-250-006 */ + <<if $seeImages == 1>> + <<if $imageChoice == 1>> + <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<else>> + <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> + Some aggressive play and an eye for riling up your fellow players has resulted in an immense payout, and all but one of your adversaries have folded as the situation has escalated. The only player still in contention is a wily old mercenary, the veteran of $his fair share of battles on the battlefield and at the firing range. $He's short on bullets, however, and $he'll have to buy in with something else as collateral. + <br><br> <span id="aliveresult"> + + <<link "A year of servitude">> + <<set $activeSlave.clothes = "no clothing">> + <<replace "#aliveresult">> + <<if random(1,100) > _shootChance>> + For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck was not on your side. As the victor sweeps up $his spoils, the other security force clap you on the back and offer their condolences for your defeat. Though you may have lost your ¤, it seems you've @@.green;made some friends.@@ + <<run repX(5000, "event")>> + <<run cashX(-50000, "event")>> <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<replace "#artFrame">> + <span id="artFrame"> + /* 000-250-006 */ + <<if $seeImages == 1>> + <<if $imageChoice == 1>> + <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<else>> + <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> + <</replace>> + For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck has rendered you the victor. A silence falls over the room as the result is declared, but after some time your opponent breaks the hush by joking that life as your slave is probably easier than fighting for $arcologies[0].name. After some awkward laughter the night continues, and at the end your former mercenary joins you on your trip back to the penthouse to submit to processing and to begin $his new life as your sexual servant. $He's not young, but $he's tough and not distrusting of you due to $his service in $SF.Lower. + <br> + <<include "New Slave Intro">> <</if>> - <</if>> - /* 000-250-006 */ - </span> - <</replace>> - For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck has rendered you the victor. A silence falls over the room as the result is declared, but after some time your opponent breaks the hush by joking that life as your slave is probably easier than fighting for $arcologies[0].name. After some awkward laughter the night continues, and at the end your former mercenary joins you on your trip back to the penthouse to submit to processing and to begin $his new life as your sexual servant. $He's not young, but $he's tough and not distrusting of you due to $his service in $SF.Lower. - <br> - <<include "New Slave Intro">> - <</if>> - <<= IncreasePCSkills('warfare', 1)>> - <</replace>> - <</link>> + <<= IncreasePCSkills('warfare', 1)>> + <</replace>> + <</link>> - <br> <<link "Dock $his wages">> - <<replace "#aliveresult">> - <<if random(1,100) > _shootChance>> - For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck was not on your side. As the victor sweeps up $his spoils, the other security force members clap you on the back and offer their condolences for your defeat. Though you may have lost your ¤, it seems you've @@.green;made some friends.@@ - <<run repX(5000, "event")>> - <<run cashX(-50000, "event")>> - <<else>> - For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck has rendered you the victor. Your opponent accepts $his defeat with grace and jokes to $his comrades that $he'll be fighting in $his underwear for the next few months, and their uproar of laughter fills the room. Though you take the lion's share of the ¤, your security force also @@.green;had a good time fraternizing with you.@@ - <<run repX(10000, "event")>> - <<run cashX(50000, "event")>> - <</if>> - <<= IncreasePCSkills('warfare', 1)>> + <br> <<link "Dock $his wages">> + <<replace "#aliveresult">> + <<if random(1,100) > _shootChance>> + For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck was not on your side. As the victor sweeps up $his spoils, the other security force members clap you on the back and offer their condolences for your defeat. Though you may have lost your ¤, it seems you've @@.green;made some friends.@@ + <<run repX(5000, "event")>> + <<run cashX(-50000, "event")>> + <<else>> + For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck has rendered you the victor. Your opponent accepts $his defeat with grace and jokes to $his comrades that $he'll be fighting in $his underwear for the next few months, and their uproar of laughter fills the room. Though you take the lion's share of the ¤, your security force also @@.green;had a good time fraternizing with you.@@ + <<run repX(10000, "event")>> + <<run cashX(50000, "event")>> + <</if>> + <<= IncreasePCSkills('warfare', 1)>> + <</replace>> + <</link>> + + </span> <</replace>> <</link>> + <</if>> </span> <</replace>> - <</link>> - <</if>> - - </span> - <</replace>> -<</link>> // It will cost @@.red;<<print cashFormat(50000)>>@@ to participate in the trick shot night.// + <</link>> // It will cost @@.red;<<print cashFormat(50000)>>@@ to participate in the trick shot night.// <</if>> </span> diff --git a/src/art/artJS.js b/src/art/artJS.js index d21cb483ecd31631a5e827b96c79f77f37f75431..bf9f5ca160ec72fc64f16891b6d868467161685f 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -146,8 +146,12 @@ App.Art.renderedArtElement = function(slave, artSize) { App.Art.customArtElement = function(slave, imageSize) { const fileType = slave.custom.image.format || "png"; const fileName = `resources/${slave.custom.image.filename}.${fileType}`; - const elementType = fileType === "webm" ? "video" : "img"; - const attributes = fileType === "webm" ? ["loop", "autoplay"] : []; + let elementType = "img"; + let attributes = []; + if (fileType === "webm" || fileType === "mp4") { + elementType = "video"; + attributes = ["loop", "autoplay"]; + } const res = document.createElement(elementType); attributes.forEach((an) => { diff --git a/src/facilities/nursery/longChildDescription.tw b/src/facilities/nursery/longChildDescription.tw index 504812100fe762fff2a43911cb9e7f0673be78ff..9c6b3dd183d0877d4f17b8ecb81583a4d138401a 100644 --- a/src/facilities/nursery/longChildDescription.tw +++ b/src/facilities/nursery/longChildDescription.tw @@ -686,9 +686,9 @@ is <</if>> <<if $activeChild.fuckdoll == 0>> - <<= App.Desc.brand($activeChild, "cheek")>> - <<= App.Desc.brand($activeChild, "ear")>> - <<= App.Desc.brand($activeChild, "neck")>> + <<= App.Desc.mods($activeChild, "cheek")>> + <<= App.Desc.mods($activeChild, "ear")>> + <<= App.Desc.mods($activeChild, "neck")>> <</if>> <<if $familyTesting == 1>> @@ -1156,21 +1156,21 @@ $He is /* Check it's not a facial brand. (posting much later, I have basically just printed the list that was here. It might need to be longer, but it's the only way I can think of to hide cheeks and ears in multiBrand.)*/ /* Sorted top to bottom */ /* Torso */ - <<= App.Desc.brand($activeChild, "chest")>> - <<= App.Desc.brand($activeChild, "back")>> - <<= App.Desc.brand($activeChild, "lower back")>> + <<= App.Desc.mods($activeChild, "chest")>> + <<= App.Desc.mods($activeChild, "back")>> + <<= App.Desc.mods($activeChild, "lower back")>> /* Arms */ - <<= App.Desc.brand($activeChild, "upper arm")>> - <<= App.Desc.brand($activeChild, "lower arm")>> - <<= App.Desc.brand($activeChild, "wrist")>> - <<= App.Desc.brand($activeChild, "hand")>> + <<= App.Desc.mods($activeChild, "upper arm")>> + <<= App.Desc.mods($activeChild, "lower arm")>> + <<= App.Desc.mods($activeChild, "wrist")>> + <<= App.Desc.mods($activeChild, "hand")>> /* Legs */ /*buttock and thigh are displayed in descriptionWidgetsTattoos, if you can believe it */ - <<= App.Desc.brand($activeChild), "calf")>> - <<= App.Desc.brand($activeChild), "ankle")>> - <<= App.Desc.brand($activeChild), "foot")>> + <<= App.Desc.mods($activeChild), "calf")>> + <<= App.Desc.mods($activeChild), "ankle")>> + <<= App.Desc.mods($activeChild), "foot")>> <</if>> /* Opposite way of handling above, if that ever proves more convenient. This will print everything that's not on the face. The risk is that it may print things that are already printed elsewhere. */ diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index eeadfc021f3e83e67885f523015e4a465e184978..638ba4395bba6ee49562d824847068e41ffa849e 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -1024,6 +1024,9 @@ You should have received a copy of the GNU General Public License along with thi <<set $brandTarget = {primary: "buttock", secondary: "buttock", local: "buttock"}>> <<set $brandDesign = {primary: "your initials", local: "your initials"}>> +<<set $scarTarget = {primary: "left cheek", secondary: "left cheek", local: "left cheek"}>> +<<set $scarDesign = {primary: "generic", local: "generic"}>> + <<set $oralTotal = 0>> <<set $vaginalTotal = 0>> <<set $analTotal = 0>> diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index ba092ff85fd69ffebed367ed7a753b6b8cdeceb7..2b81a97ed975e32fe687ba42ac16bb7f69431eef 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -291,6 +291,62 @@ App.Entity.SlaveCustomAddonsState = class SlaveCustomAddonsState { } }; +App.Entity.scarState = class { + constructor() { + /** + * generic scar + * * 0: no scar + * * 1+: increasing intensity of scar + */ + this.generic = 0; + /** + * whip scar + * * 0: no scar + * * 1+: increasing intensity of scar + */ + this.whip = 0; + /** + * burn scar + * * 0: no scar + * * 1+: increasing intensity of scar + */ + this.burn = 0; + /** + * surgical scar + * * 0: no scar + * * 1+: increasing intensity of scar + */ + this.surgical = 0; + /** + * cutting scar + * * 0: no scar + * * 1+: increasing intensity of scar + */ + this.cutting = 0; + /** + * chain/manacles scar, focused on wrists ankles or neck + * * 0: no scar + * * 1+: increasing intensity of scar + * 1+: increasing intensity of scar + */ + this.chain = 0; + /** + * exotic scar for the face + * * 0: no scar + * * 1: scar + */ + this.exotic = 0; + /** + * menacing scar for the face + * * 0: no scar + * * 1: scar + */ + this.menacing = 0; + /** + * custom scars can vary in number and will have to be defined when created. + */ + } +}; App.Entity.SlaveState = class SlaveState { constructor() { @@ -1111,10 +1167,6 @@ App.Entity.SlaveState = class SlaveState { * * 1: birth this week; 0: not time yet */ this.labor = 0; - /** does she have a c-section scar - * - * 1: yes; 0: no */ - this.cSec = 0; /** * may accept strings, use at own risk * @@ -2186,16 +2238,12 @@ App.Entity.SlaveState = class SlaveState { * 0: no; 1: yes */ this.pubertyXY = 0; /** - * not fully implemented. - * * 0: no scars - * * 1: light scarring - * * 2: heavy scarring - * * 3: fresh scarring - * * 4: burns - * * 5: menacing scar - * * 6: exotic scar - */ - this.scars = 0; + * scar + * Sub-object: + * the body part in question, such as back or left hand + * the key of that part is the type of scar they can have and the value is how serious it is, from 0 up + * @type {Object.Object} */ + this.scar = {}; /** * In a eugenics society, this slave is a designated breeder. * @@ -2387,6 +2435,7 @@ App.Entity.SlaveState = class SlaveState { return { counter: {}, brand: {}, + scar: {}, porn: { fame: {} }, diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js index 8dc2c4a2b64d64ceb9c34a69d2db814eeb7d7cf1..1150685937bf1c80a6aa700a174e05f24bc231c3 100644 --- a/src/js/datatypeCleanupJS.js +++ b/src/js/datatypeCleanupJS.js @@ -18,6 +18,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() { migrateCounters(slave); migrateCustomProperties(slave); migrateBrand(slave); + migrateScars(slave); App.Entity.Utils.migratePronouns(slave); } @@ -259,6 +260,31 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() { delete slave.brand.feet; } } + + /** + * @param {App.Entity.SlaveState} slave + */ + function migrateScars(slave) { + if (!slave.hasOwnProperty("scar")) { + slave.scar = {}; // switching to singular to match .brand and someday others. + } + if (slave.hasOwnProperty("scars")) { // even if it's 0 + if (slave.scars === 5) { + App.Medicine.Modification.addScar(slave, "left cheek", "menacing"); // old location was not defined, but surgery described it as facial. Putting it on left cheek for a default. + } else if (slave.scars === 6) { + App.Medicine.Modification.addScar(slave, "left cheek", "exotic"); + } else if (slave.scars) { // not 0 + App.Medicine.Modification.addScar(slave, "left cheek", "generic"); + } + delete slave.scars; + } + if (slave.hasOwnProperty("cSec")) { // if it's not 0 + if (slave.cSec) { // not 0 + App.Medicine.Modification.addScar(slave, "belly", "c-section"); + } + delete slave.cSec; // delete even if 0 + } + } })(); /* @@ -515,7 +541,6 @@ window.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { function slavePregnancyDatatypeCleanup(slave) { slave.induce = Math.clamp(+slave.induce, 0, 1) || 0; slave.labor = Math.clamp(+slave.labor, 0, 1) || 0; - slave.cSec = Math.clamp(+slave.cSec, 0, 1) || 0; slave.prematureBirth = Math.clamp(+slave.prematureBirth, 0, 1) || 0; slave.ovaries = Math.clamp(+slave.ovaries, 0, 1) || 0; slave.vasectomy = Math.clamp(+slave.vasectomy, 0, 1) || 0; @@ -669,7 +694,6 @@ window.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { function slaveCosmeticsDatatypeCleanup(slave) { slave.makeup = Math.clamp(+slave.makeup, 0, 8) || 0; slave.nails = Math.clamp(+slave.nails, 0, 9) || 0; - slave.scars = Math.clamp(+slave.scars, 0, 6) || 0; slave.chastityAnus = Math.clamp(+slave.chastityAnus, 0, 1) || 0; slave.chastityPenis = Math.clamp(+slave.chastityPenis, 0, 1) || 0; slave.chastityVagina = Math.clamp(+slave.chastityVagina, 0, 1) || 0; @@ -1155,7 +1179,6 @@ window.childButtDatatypeCleanup = function childButtDatatypeCleanup(child) { window.childPregnancyDatatypeCleanup = function childPregnancyDatatypeCleanup(child) { child.induce = Math.clamp(+child.induce, 0, 1) || 0; child.labor = Math.clamp(+child.labor, 0, 1) || 0; - child.cSec = Math.clamp(+child.cSec, 0, 1) || 0; child.prematureBirth = Math.clamp(+child.prematureBirth, 0, 1) || 0; child.ovaries = Math.clamp(+child.ovaries, 0, 1) || 0; child.vasectomy = Math.clamp(+child.vasectomy, 0, 1) || 0; @@ -1269,7 +1292,6 @@ window.childTattooDatatypeCleanup = function childTattooDatatypeCleanup(child) { window.childCosmeticsDatatypeCleanup = function childCosmeticsDatatypeCleanup(child) { child.makeup = Math.clamp(+child.makeup, 0, 8) || 0; child.nails = Math.clamp(+child.nails, 0, 9) || 0; - child.scars = Math.clamp(+child.scars, 0, 6) || 0; child.chastityAnus = Math.clamp(+child.chastityAnus, 0, 1) || 0; child.chastityPenis = Math.clamp(+child.chastityPenis, 0, 1) || 0; child.chastityVagina = Math.clamp(+child.chastityVagina, 0, 1) || 0; @@ -2044,7 +2066,7 @@ App.Entity.Utils.GenePoolRecordCleanup = (function() { "belly", "bellyPreg", "bellyFluid", "bellyImplant", "bellySag", "bellySagPreg", "bellyPain", "cervixImplant", "birthsTotal", - "scars", + "scar", "choosesOwnChastity", "pregControl", "readyLimbs", diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js index 867b672af09568dcc29de76aa9e1761adfe962fc..3322ea84ec84046e6e274827524f643bcd8b38e4 100644 --- a/src/js/descriptionWidgets.js +++ b/src/js/descriptionWidgets.js @@ -576,6 +576,14 @@ App.Desc.ageAndHealth = function(slave) { return r; }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} Slave's mods. + */ +App.Desc.mods = function(slave, surface) { + return App.Desc.brand(slave, surface) + App.Desc.scar(slave, surface); +}; + /** * @param {App.Entity.SlaveState} slave * @returns {string} Slave's brand. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any brands on the breasts, if present, in natural language. @@ -692,6 +700,297 @@ App.Desc.brand = function(slave, surface) { return r; }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} Slave's scar. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any scars on the breasts, if present, in natural language. + */ +App.Desc.scar = function(slave, surface) { + "use strict"; + let r = ``; + const bellyAccessory = slave.bellyAccessory; + /* eslint-disable no-unused-vars*/ + const { + he, him, his, hers, himself, boy, He, His + } = getPronouns(slave); + /* eslint-enable */ + if (State.variables.showBodyMods === 1) { + if (surface === "extra") { // Make a sentence that describes all body parts that aren't explicitly described elsewhere in longSlave. If you scar a slave on her thumb, for instance. But why. + let extraMarks = App.Desc.extraMarks(slave, "scar"); + extraMarks = Object.keys(extraMarks); + let length = extraMarks.length; + if (length === 0) { + return r; + } else if (length === 1) { + r += `${He} also has a single unusual scar: `; + } else { + r += `${He} also has several unusual scars: `; + } + + // If L/R parts of this object match, they will be described in the same phrase. Length is used only to calculate punctuation, so we prepare to skip. + for (const bodyPart of extraMarks) { + if (bodyPart.startsWith("left ")) { + let right = "right " + bodyPart.replace("left ", ""); + if (slave.scar[bodyPart] && slave.scar[right]) { + length--; + } + } + } + let counter = 0; + for (const bodyPart of extraMarks) { + counter++; + surface = App.Desc.oppositeSides(bodyPart); + if (slave.scar[surface.center]) { // center defined, body part has no mirror. + r += `${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}`; + } else { // Center not defined, body part has a mirror. + let left = App.Desc.expandScarString(slave, surface.left); + let right = App.Desc.expandScarString(slave, surface.right); + if (!slave.scar[surface.left] && !slave.scar[surface.right]) { + // no marks + } else if (bodyPart.startsWith("right ") && slave.scar[surface.left]) { + // we already described it on the left + } else if (left === right) { + // matching places and marks + // note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match. + r += `${left} on both ${his} ${surface.both}`; + } else if (slave.scar[surface.left] && slave.scar[surface.right]) { + // matching places but different marks + r += `both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}`; + } else if (slave.scar[surface.left]) { + // left + r += `${left} on ${his} ${surface.left}`; + } else if (slave.scar[surface.right]) { + // right + r += `${right} on ${his} ${surface.right}`; + } + } + if (counter === length) { + r += `. `; + } else if (counter === length - 1) { + r += `, and `; + } else if (counter < length) { + r += `, `; + } + } + } else if (surface) { /* describes a single scarred body part */ + surface = App.Desc.oppositeSides(surface); + if (surface.center === "belly" && setup.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) { + r += `${His} fake belly has the same scar, ${App.Desc.expandScarString(slave, surface.center)}, as ${his} real one. `; + } else { + if (slave.scar[surface.center]) { // center defined, body part has no mirror. + r += `${He} has ${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}. `; + } else { // Center not defined, body part has a mirror. + let left = App.Desc.expandScarString(slave, surface.left); + let right = App.Desc.expandScarString(slave, surface.right); + if (!slave.scar[surface.left] && !slave.scar[surface.right]) { + // no marks + } else if (left === right) { + // matching places and marks + // note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match. + r += `${He} has ${left} on both ${his} ${surface.both}. `; + } else if (slave.scar[surface.left] && slave.scar[surface.right]) { + // matching places but different marks + r += `${He} has both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}. `; + } else if (slave.scar[surface.left]) { + // left + r += `${He} has ${left} on ${his} ${surface.left}. `; + } else if (right) { + // right + r += `${He} has ${right} on ${his} ${surface.right}. `; + } + } + } + } else { /* describes all scared body parts */ + for (let [key, value] of Object.entries(slave.scar)) { + if (r === ``) { + r += `${He} has `; + } + if (key === "belly" && setup.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) { + r += `${value} scared on both ${his} real belly and ${his} fake one, `; + } else { + r += `${value} on ${his} ${key}, `; + } + } + if (r !== ``) { + r += `marking ${him} as yours. `; + } else { + r += `${His} body is unmarked by scars. `; + } + } + } + return r; +}; + +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} Slave's scar. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any scars on the breasts, if present, in natural language. + */ +App.Desc.expandScarString = function(slave, surface) { // scars can sometimes be an int. This function generates a reasonable description. It can later be expanded to apply to different body parts, or include features of the slave such as skin tone or weight + let r = ""; + if (!slave.scar[surface]) { + return r; + } + const bodypart = Object.keys(slave.scar[surface]); + for (const kind of bodypart) { + let scar = slave.scar[surface][kind]; + if (scar === 0) { + continue; + } + if (r !== "") { + r += ", "; + } + switch (kind) { + case "generic": + r += "a generic scar"; + break; + case "whip": + if (["back"].includes(surface)) { + r += "a "; + if (scar > 2) { + r += "deeply scored "; + } + if (scar > 1) { + r += "network of welts like a map of hell"; + } else { + r += "record of being beaten"; + } + } else if (["left breast", "right breast", "left buttock", "right buttock"].includes(surface)) { + if (scar > 2) { + r += "thick "; + } else { + r += "thin "; + } + r += "raised lines from a whip tracing the curves"; + } else if (["left upper arm", "right upper arm"].includes(surface)) { + r += "rough edges where a whip abused $his skin"; + } else { + if (scar > 2) { + r += "frightening "; + } else if (scar > 1) { + r += "serious "; + } + r += "whip scars"; + } + break; + case "chain": + if (["left wrist", "right wrist", "left ankle", "right ankle"].includes(surface)) { + if (scar > 1) { + r += "scars from heavy manacles"; + } else { + r += "scars from manacles"; + } + } else { + if (scar > 1) { + r += "scars from heavy chains"; + } else { + r += "scars from chains"; + } + } + break; + case "burn": + if (scar > 2) { + r += "frightening "; + } else if (scar > 1) { + r += "serious "; + } + r += "burn scars"; + break; + case "menacing": + r += "a menacing scar"; + break; + case "exotic": + r += "an exotic scar"; + break; + case "surgical": + if (surface === "left breast" || surface === "right breast") { + if (slave.boobsImplant > 0) { + r += "scars from "; + if (scar > 3) { + r += "horribly botched "; + } else if (scar > 2) { + r += "sloppily inserted "; + } else if (scar > 1) { + r += "carelessly inserted "; + } + r += "implants"; + } else { + r += "scars from "; + if (scar > 3) { + r += "horribly botched "; + } else if (scar > 2) { + r += "sloppily done "; + } else if (scar > 1) { + r += "carelessly done "; + } + r += "surgery to remove implants"; + } + } else if (surface === "left buttock" || surface === "right buttock") { + if (slave.buttImplant > 0) { + r += "scars from "; + if (scar > 3) { + r += "horribly botched "; + } else if (scar > 2) { + r += "sloppily inserted "; + } else if (scar > 1) { + r += "carelessly inserted "; + } + r += "implants"; + } else { + r += "scars from "; + if (scar > 3) { + r += "horribly botched "; + } else if (scar > 2) { + r += "sloppily done "; + } else if (scar > 1) { + r += "carelessly done "; + } + r += "surgery to remove implants"; + } + } else if (surface === "belly" ) { + r += "scars from "; + if (scar > 1) { + r += "a crazy netork of scars, as though a hack had tried internal surgery"; + } else { + r += "some faint scarring as though from internal surgery"; + } + } else { + r += "a "; + if (scar > 1) { + r += "pronounced "; + } else { + r += "faint "; + } + r += "surgical scar"; + } + break; + case "c-section": + r += "an "; + if (scar > 1) { + r += "especially "; + } + r += "unsightly c-section scar"; + break; + case "cutting": + if (["left wrist", "right wrist", "neck"].includes(surface)) { + r += "some scars as though $he attempted self harm"; + } else { + r += "some cuts as though from a razor"; + } + break; + default: + if (scar > 2) { + r += "serious "; + } else if (scar) { + r += kind; + } + break; + } + } + r = r.replace(/,(?=[^,]*$)/, ' and'); /* replace the last comma with the word "and" so we can use this in a sentance.*/ + return r; +}; + + + /** * @param {App.Entity.SlaveState} slave * @returns {string} Description of slave's amputation, if present @@ -804,7 +1103,7 @@ App.Desc.oppositeSides = function(surface) { App.Desc.extraMarks = function(slave, markType) { let extras = {}; let slaveMarks = Object.keys(slave[markType]); - if (markType === "brand") { + if (["brand", "scar"].includes(markType)) { for (const bodyPart of slaveMarks) { if ([ "left ear", "right ear", diff --git a/src/js/modification.js b/src/js/modification.js new file mode 100644 index 0000000000000000000000000000000000000000..ab6a0f33a0de13ce462089e880fb7d99df9765fd --- /dev/null +++ b/src/js/modification.js @@ -0,0 +1,23 @@ +App.Medicine.Modification = {}; +/** + * Basic application of scar + * @param {App.Entity.SlaveState} slave + * @param {string} scar + * @param {string} design + */ +App.Medicine.Modification.addScar = function(slave, scar, design) { + /* const V = State.variables; + V.scarApplied = 1; + V.degradation += 10; + slave.health -= 10; //dangerous to uncomment this as sometimes many scars are applied at once. + cashX(forceNeg(surgery.costs), "slaveSurgery", slave); + slave.health -= (V.PC.medicine >= 100) ? Math.round(surgery.healthCosts / 2) : surgery.healthCosts;*/ + if (!slave.scar.hasOwnProperty(scar)) { + slave.scar[scar] = new App.Entity.scarState(); + } + if (!slave.scar[scar].hasOwnProperty(design)) { + slave.scar[scar][design] = 1; + } else { + slave.scar[scar][design] += 1; + } +}; diff --git a/src/js/rulesAutosurgery.js b/src/js/rulesAutosurgery.js index 33ea38b7fe807f8a4f5659e725d75eabc3fe12ce..ea109a6efb2c610d57e27dde4432471957350aa4 100644 --- a/src/js/rulesAutosurgery.js +++ b/src/js/rulesAutosurgery.js @@ -359,8 +359,8 @@ window.rulesAutosurgery = (function() { slave.skill.oral -= 10; } }); - } else if (slave.cSec === 1 && thisSurgery.cosmetic > 0) { - commitProcedure("surgery to remove a c-section scar", s => { s.cSec = 0; }); + } else if (slave.scar.hasOwnProperty("belly") && slave.scar.belly["c-section"] > 0 && thisSurgery.cosmetic > 0) { + commitProcedure("surgery to remove a c-section scar", s => { s.scar["belly"]["c-section"] = 0; }); } else if (slave.faceImplant <= 45 && slave.face <= 95 && thisSurgery.cosmetic === 2) { commitProcedure("a nicer face", slave => { if (slave.faceShape === "masculine") { slave.faceShape = "androgynous"; } diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index f931c98e452ebfd822f9cf6fc349eef7ecf7ea61..f28e30950ff7ffed695b3c5242db49e7a7ddae40 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -200,8 +200,13 @@ window.Beauty = (function() { if (slave.minorInjury !== 0) { beauty -= 2; } - if (slave.cSec === 1) { - beauty -= 2; + if (slave.scar !== {}) { + const scars = Object.keys(slave.scar); + for (const bodypart of scars) { + if (slave.scar[bodypart].surgical > 0) { + beauty -= slave.scar[bodypart].surgical; + } + } } if (slave.nails > 0) { beauty += 1; diff --git a/src/js/slaveStatsChecker.js b/src/js/slaveStatsChecker.js index f7cbea30b57ce64ec066a0b44f73ef619c8cf1b7..f22b41c2031223b8a27eb1eaf4e73513f15b4eb7 100644 --- a/src/js/slaveStatsChecker.js +++ b/src/js/slaveStatsChecker.js @@ -24,7 +24,8 @@ window.SlaveStatsChecker = (function() { V.piercingScore = piercingScore(slave); V.tatScore = tatScore(slave); V.brandScore = brandScore(slave); - return V.tatScore + V.piercingScore + V.brandScore; + V.scarScore = scarScore(slave); + return V.tatScore + V.piercingScore + V.brandScore + V.scarScore; } /** @@ -159,6 +160,23 @@ window.SlaveStatsChecker = (function() { return score; } + /** + * helper function, not callable + * @param {App.Entity.SlaveState} slave + * @returns {number} + */ + function scarScore(slave) { + let score = 0; + const scars = Object.keys(slave.scar); + for (const bodypart of scars) { + const bodyparts = Object.keys(slave.scar[bodypart]); + for (const kind of bodyparts) { + score += slave.scar[bodypart][kind]; + } + } + return score; + } + /** * call as SlaveStatsChecker.isModded() * @param {App.Entity.SlaveState} slave @@ -168,7 +186,8 @@ window.SlaveStatsChecker = (function() { const tattoos = tatScore(slave); const piercings = piercingScore(slave); const brands = brandScore(slave); - const mods = piercings+tattoos; + const scars = scarScore(slave); + const mods = piercings+tattoos+scars; return (mods > 15 || (piercings > 8 && tattoos > 5) || brands > 1); } @@ -182,8 +201,9 @@ window.SlaveStatsChecker = (function() { const tattoos = tatScore(slave); const piercings = piercingScore(slave); const brands = brandScore(slave); + const scars = scarScore(slave); - return (!isModded(slave) && slave.corsetPiercing === 0 && piercings < 3 && tattoos < 2 && brands === 0); + return (!isModded(slave) && slave.corsetPiercing === 0 && piercings < 3 && tattoos < 2 && brands === 0 && scars <= 1); } }()); diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index 2213db91695698fa3dc00654943dbda6d6b0d12d..81110a4541c767d6b599aea6672307138526c898 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -722,8 +722,12 @@ window.SlaveSummaryUncached = (function() { } else if (slave.health > 20) { makeSpan(c, "H", ["green", "strong"], true, slave.health); } - if (passage() === "Clinic" && V.clinicUpgradeScanner && slave.chem > 15) { - makeSpan(c, `C${Math.ceil(slave.chem/10)}`, ["cyan", "strong"]); + if (passage() === "Clinic" && V.clinicUpgradeScanner) { + if(slave.chem > 15) { + makeSpan(c, `C${Math.ceil(slave.chem/10)}`, ["cyan", "strong"]); + } else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") { + makeSpan(c, `Discharged: ${slave.name}.`, ["green", "strong"]); + } } } @@ -748,8 +752,12 @@ window.SlaveSummaryUncached = (function() { } else { makeSpan(c, "Unnaturally healthy", "green", true, slave.health); } - if (passage() === "Clinic" && V.clinicUpgradeScanner && slave.chem > 15) { - makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem/10)}.`, "cyan"); + if (passage() === "Clinic" && V.clinicUpgradeScanner) { + if(slave.chem > 15) { + makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem/10)}.`, "cyan"); + } else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") { + makeSpan(c, `Discharged: ${slave.name}.`, "green"); + } } } @@ -4628,4 +4636,4 @@ window.SlaveSummaryUncached = (function() { } return SlaveSummaryUncached; -})(); +})(); \ No newline at end of file diff --git a/src/js/utilJS.js b/src/js/utilJS.js index d6dcd6302825392fb95d84ad7a193d76ae288d26..b707cba2ff557b5033c7b0067da94e863076eff6 100644 --- a/src/js/utilJS.js +++ b/src/js/utilJS.js @@ -939,7 +939,7 @@ window.Categorizer.prototype.cat = function(val, def) { } // Record the value for the result's getter, if it is an object // and doesn't have the property yet - if (result === _.isObject(result)) { + if (typeof result === "object" && !isNaN(result)) { result.value = val; } return result; diff --git a/src/npc/databases/dSlavesDatabase.tw b/src/npc/databases/dSlavesDatabase.tw index 1abfd03282d0d416b4ec10d6d659438926b28d69..0ba2cc5e6a9ecfdcafa5d0ed16da2cfea52785fc 100644 --- a/src/npc/databases/dSlavesDatabase.tw +++ b/src/npc/databases/dSlavesDatabase.tw @@ -561,7 +561,7 @@ /*Tweaked smart piercing setting, corrected piercings -BoneyM*/ <<set _HS = App.Entity.SlaveState.makeSkeleton()>> -<<set _HS.slaveName = "Fleshlight", _HS.birthName = "Fleshlight", _HS.origin = "Nothing remains of the person $he originally was, either mentally or physically.", _HS.ID = _i++, _HS.birthWeek = random(0,51), _HS.actualAge = 21, _HS.physicalAge = 21, _HS.visualAge = 21, _HS.ovaryAge = 21, _HS.health = 20, _HS.devotion = 60, _HS.race = "white", _HS.eyeColor = "blue", _HS.hColor = "blonde", _HS.pubicHColor = "blonde", _HS.override_Skin = 1, _HS.skin = "spray tanned", _HS.hStyle = "long", _HS.waist = -55, _HS.boobs = 800, _HS.boobsImplant = 600, _HS.butt = 5, _HS.buttImplant = 2, _HS.lips = 55, _HS.lipsImplant = 2, _HS.lipsTat = "permanent makeup", _HS.vagina = 2, _HS.vaginaLube = 1, _HS.anus = 2, _HS.ovaries = 1, _HS.makeup = 3, _HS.nails = 3, _HS.skill.vaginal = 35, _HS.skill.oral = 35, _HS.skill.anal = 35, _HS.shoes = "heels", _HS.attrXY = 40, _HS.fetish = "mindbroken", _HS.fetishKnown = 1, _HS.custom.desc = "$He has many surgical scars and something seems off about $him.", _HS.scars = 2>> +<<set _HS.slaveName = "Fleshlight", _HS.birthName = "Fleshlight", _HS.origin = "Nothing remains of the person $he originally was, either mentally or physically.", _HS.ID = _i++, _HS.birthWeek = random(0,51), _HS.actualAge = 21, _HS.physicalAge = 21, _HS.visualAge = 21, _HS.ovaryAge = 21, _HS.health = 20, _HS.devotion = 60, _HS.race = "white", _HS.eyeColor = "blue", _HS.hColor = "blonde", _HS.pubicHColor = "blonde", _HS.override_Skin = 1, _HS.skin = "spray tanned", _HS.hStyle = "long", _HS.waist = -55, _HS.boobs = 800, _HS.boobsImplant = 600, _HS.butt = 5, _HS.buttImplant = 2, _HS.lips = 55, _HS.lipsImplant = 2, _HS.lipsTat = "permanent makeup", _HS.vagina = 2, _HS.vaginaLube = 1, _HS.anus = 2, _HS.ovaries = 1, _HS.makeup = 3, _HS.nails = 3, _HS.skill.vaginal = 35, _HS.skill.oral = 35, _HS.skill.anal = 35, _HS.shoes = "heels", _HS.attrXY = 40, _HS.fetish = "mindbroken", _HS.fetishKnown = 1, _HS.custom.desc = "$He has many surgical scars and something seems off about $him.", _HS.scar["left breast"].surgical = 2 _HS.scar["right breast"].surgical = 2, _HS.scar["left buttock"].surgical = 2, _HS.scar["right buttock"].surgical = 2>> <<set $heroSlaves.push(_HS)>> /*heels*/ /*Added origin, makeup and nails, changed eyes -BoneyM*/ diff --git a/src/npc/descriptions/boobs/boobs.js b/src/npc/descriptions/boobs/boobs.js index 861b3193129cddc542bdbb39b8e3179b3f08be0f..b3f7eeadbaa29bc741b0473586a20e1cbf11dd8e 100644 --- a/src/npc/descriptions/boobs/boobs.js +++ b/src/npc/descriptions/boobs/boobs.js @@ -1486,7 +1486,7 @@ App.Desc.boobsExtra = function(slave, pronouns) { App.Desc.boobsBrand = function(slave) { if (State.variables.showBodyMods === 1) { if (slave.fuckdoll === 0) { - return(App.Desc.brand(slave, "chest") + App.Desc.brand(slave, "breast")); + return(App.Desc.mods(slave, "chest") + App.Desc.mods(slave, "breast")); } } }; diff --git a/src/npc/uploadSlave.tw b/src/npc/uploadSlave.tw index 227b8b40ade93850bbbe8188fe1572f9b47ba31e..f3327e64679041eeb30dc5d1d33551fb76295a1b 100644 --- a/src/npc/uploadSlave.tw +++ b/src/npc/uploadSlave.tw @@ -116,7 +116,6 @@ broodmotherOnHold: $activeSlave.broodmotherOnHold, broodmotherCountDown: $activeSlave.broodmotherCountDown, labor: $activeSlave.labor, births: $activeSlave.counter.births, -cSec: $activeSlave.cSec, armAccessory: "none", legAccessory: "none", bellyAccessory: "none", @@ -142,6 +141,11 @@ brand: <<if (!jQuery.isEmptyObject($activeSlave.brand))>>0,<<else>> _brandName: _brand, <</for>> <</if>> +scar: <<if (!jQuery.isEmptyObject($activeSlave.scar))>>0,<<else>> +<<for _scarName, scar range $activeSlave.scar>> + _scarName: scar, +<</for>> +<</if>> earPiercing: $activeSlave.earPiercing, nosePiercing: $activeSlave.nosePiercing, eyebrowPiercing: $activeSlave.eyebrowPiercing, diff --git a/src/pregmod/csec.tw b/src/pregmod/csec.tw index a88791f3fc2eaafa19d54535575d4d32eaf14162..00e3203d2bb4a15a825ea1d73128cb6cf95ebbdb 100644 --- a/src/pregmod/csec.tw +++ b/src/pregmod/csec.tw @@ -606,7 +606,7 @@ Since $his <<if $activeSlave.mpreg == 1>>ass<<else>>vagina<</if>> was spared fro </span> <</if>> <</if>> -<<set $activeSlave.cSec = 1>> +<<set $activeSlave.scar["belly"]["c-section"] = 1>> <<run SetBellySize($activeSlave)>> <<set $reservedChildren = FetusGlobalReserveCount("incubator")>> <<set $reservedChildrenNursery = FetusGlobalReserveCount("nursery")>> diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw index 4af0368fe596abb3c93d84c1e514c249ed71d21f..dd9d583e64e72862b1962a37957ec63e491706af 100644 --- a/src/pregmod/widgets/bodyswapWidgets.tw +++ b/src/pregmod/widgets/bodyswapWidgets.tw @@ -205,9 +205,8 @@ <<set $args[0].bellySag = $args[1].bellySag>> <<set $args[0].bellySagPreg = $args[1].bellySagPreg>> <<set $args[0].bellyPain = $args[1].bellyPain>> - <<set $args[0].csec = $args[1].csec>> <<set $args[0].cervixImplant = $args[1].cervixImplant>> - <<set $args[0].scars = $args[1].scars>> + <<set $args[0].scar = $args[1].scar>> <<set $args[0].pregControl = $args[1].pregControl>> <</if>> /* diff --git a/src/societies/aztec/slaveSacrifice.tw b/src/societies/aztec/slaveSacrifice.tw index 2de0d8319a3b09b09d6712dbb3fd872a8e103e73..a4383e7e24ad592270ac5af4629ae43f6fd6ec8d 100644 --- a/src/societies/aztec/slaveSacrifice.tw +++ b/src/societies/aztec/slaveSacrifice.tw @@ -20,7 +20,7 @@ <<elseif ($activeSlave.fetish == "humiliation")>> $He shudders with excitement. "I heard everyone can <<s>>ee me a<<s>> I <<s>>uffer. I hope the public penan<<c>>e will plea<<s>>e the godde<<ss>>." <<elseif ($activeSlave.fetish == "buttslut")>> - $He looks sadly at the floor. "Oh God<<s>>, that mean<<s>> no butt <<s>>e<<x>> for me. I hope Xochiquetzal be plea<<s>>ed by all that <<s>>acrifi<<c>>e." + $He <<if canSee($activeSlave)>>looks sadly at the floor<<else>>tilts $his head downwards sadly<</if>>. "Oh God<<s>>, that mean<<s>> no butt <<s>>e<<x>> for me. I hope Xochiquetzal be plea<<s>>ed by all that <<s>>acrifi<<c>>e." <</if>> <<else>> $He looks determined. "<<Master>>, I'll do my be<<s>>t. No other <<s>>lave will be cleaner for the godde<<ss>> than I. diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index c5b651341614d86bec7c2d34fbc0102d0a47f433..d1fc4b40aba32120bde6c03d16dc98ff9cc48253 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -54,6 +54,13 @@ <<set $brandDesign.official = "your personal symbol">> <</if>> +<<if ndef $scarTarget>> + <<set $scarTarget = {primary: "left cheek", secondary: "left cheek", local: "left cheek"}>> +<</if>> +<<if ndef $scarDesign>> + <<set $scarDesign = {primary: "generic", local: "generic"}>> +<</if>> + <<if def $servantMilkersJobs>> <<unset $servantMilkersJobs>> <</if>> diff --git a/src/uncategorized/addCustomDescriptors.tw b/src/uncategorized/addCustomDescriptors.tw index 182b8723f89ba5dc7f841f0361229e0b8e60e1f5..e22ab4293864c2f0efdc3dbadf169d5f52567cb4 100644 --- a/src/uncategorized/addCustomDescriptors.tw +++ b/src/uncategorized/addCustomDescriptors.tw @@ -148,7 +148,7 @@ Change $his custom label: <<textbox "$activeSlave.custom.label" $activeSlave.cus <br><br> Assign $him a custom image: <input id="customImageValue" type="text"> <<link "Reset" "Add custom descriptors">><<set $activeSlave.custom.image = null>><</link>> -<br> //File must be in// <tt><select id="customImageFormatSelector" style="border: none;"><option value="png">PNG</option><option value="jpg">JPG</option><option value="gif">GIF</option><option value="webm">WEBM</option></select></tt> //format. Place file in the \resources folder. Enter the filename without the extension. For example, for a file with the path// <tt>\bin\resources\headgirl.<span id="customImageFormatValue">png</span></tt>, //enter //<tt>headgirl</tt>. +<br> //File must be in// <tt><select id="customImageFormatSelector" style="border: none;"><option value="png">PNG</option><option value="jpg">JPG</option><option value="gif">GIF</option><option value="webm">WEBM</option><option value="webp">WEBP</option><option value="mp4">MP4</option></select></tt> //format. Place file in the \resources folder. Enter the filename without the extension. For example, for a file with the path// <tt>\bin\resources\headgirl.<span id="customImageFormatValue">png</span></tt>, //enter //<tt>headgirl</tt>. <<script>> jQuery(function() { function activeSlave() { diff --git a/src/uncategorized/bodyModification.tw b/src/uncategorized/bodyModification.tw index f7bb9432a996416cda33539c6b434031fa3dc4dd..c68bdefa7f9fff2f9be5b520c80ffd2a7181721b 100644 --- a/src/uncategorized/bodyModification.tw +++ b/src/uncategorized/bodyModification.tw @@ -11,7 +11,7 @@ <<= SlaveFullName($activeSlave)>> is lying strapped down on the table in your body modification studio. $He is entirely at your mercy. -<<if $brandApplied || $degradation>> +<<if $brandApplied || $degradation || $scarApplied>> <<if $activeSlave.fuckdoll == 0>> <<if canSee($activeSlave)>>There's a mirror on the ceiling, so $he can see<<else>>$He can't see, so <<if canHear($activeSlave)>>you're careful to describe<<else>>$he must, by $himself, get a feel for<</if>><</if>> $his new appearance. <</if>> @@ -20,6 +20,67 @@ <<set $activeSlave.health -= 10>> <<unset $brandApplied>> <</if>> + <<if $scarApplied>> + <<if $scarTarget.local === "entire body">> + <<switch $scarDesign.local>> + <<case "burn">> + Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the skin with an open flame. + <<case "surgical">> + <<if $PC.medicine === 100>> + Your medical mastery is perfect, so creating Frankenstein's monster was a deliberate work of art. + <<elseif $PC.medicine > 0>> + Your medical skills are progressing, and the Frankenstein effect reminds you of your earliest attempts. + <<else>> + You really slashed away with your knife, but were careful not to allow $him to bleed out. + <</if>> + <<default>> + The best way to apply scarring to the entire body is with a good old fashioned whip. $His body is a mess of crisscrossed lines<<if $activeSlave.amp != 1>>, and $his limbs twisted so violently in their restraints that they too have become scarred<</if>>. + <</switch>> + No matter how you chose to apply it, scarring so much of $his body has @@.red; hurt $his health.@@ + <<set $activeSlave.health -= 20>> + <<else>> + <<if $activeSlave.scar[$scarTarget.local][$scarDesign.local] > 0>> + This is not the first time $he was scarred like this. + <</if>> + <<switch $scarDesign.local>> + <<case "whip">> + Targetting a single area with a whip is not easy. You set the mood by carefully arranging candles drippping on to a whimpering $activeSlave.slaveName, then got $his attention with a quick <<if canSee($activeSLave)>>wave<<elseif canHear($activeSlave)>>crack<<else>>tap<</if>> of the whip. One by one, you carefully snuffed out the candles, flicking hot wax as you went. After pausing a moment, you prepared to leave your mark. + <<if ["penis", "vagina"].includes($scarTarget.local)>> + <<if $activeSlave.dick > 4 && $seeDicks>> + $His dick was large enough that it was not too difficult to hit, + <<elseif $activeSlave.dick > 0 && $seeDicks>> + $His dick was a challengingly small target, + <<else>> + <<if $activeSlave.clit > 0>> + $His clit was a difficult target, + <<else>> + $His clit was an impossibly tiny target, + <</if>> + <</if>> + but the end was never in doubt. The tip connected with $his most intimate place on the first try, and plunged $him into absolute agony. + <<else>> + The end was never in doubt. A few strokes of the whip plunged $him into agony $his body will not allow $him to forget. + <</if>> + <<case "burn">> + Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the $activeSlave.skin skin of $his $scarTarget.local with an open flame. + <<case "surgical">> + <<if $PC.medicine === 100>> + Your medical mastery is perfect, so creating such a scar was a deliberate act of degredation. + <<elseif $PC.medicine > 0>> + Your medical skills are progressing, and the sloppy scar reminds you of your earliest attempts. + <<else>> + You really slashed away at $scarTarget.local with your knife, but were careful not to allow $him to bleed out. + <</if>> + <<default>> + You had no shortage of kinky and medical tools for applying scars. $His $activeSlave.skin $scarTarget.local is bleeding profusely. + <</switch>> + + No matter how you chose to apply it, being scarred @@.red; hurt $his health a little.@@ + <<set $activeSlave.health -= 10>> + <</if>> + Afterwards you seal the wounds with a white medical spray. Infection is no risk to your slave thanks to your curatives, but in order to form obvious scar tissue you want to keep air out and delay normal healing as long as possible. + <<unset $scarApplied>> + <</if>> <<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0>> <<if $degradation > 1>> <<if $degradation > 5>> @@ -1103,3 +1164,178 @@ Or a custom site: <<textbox "$brandTarget.local" $brandTarget.local "Body Modifi <br> $He has an intricate tattoo on $his lower belly that suggests $he was made to be bred. [[Remove it|Body Modification][$activeSlave.breedingMark = 0]] <</if>> + +<br><br> + +/* Scars */ + +Scars: +<<for _scarName, _scar range $activeSlave.scar>> + <br> + $His _scarName is marked with <<= App.Desc.expandScarString($activeSlave, _scarName)>>: + <<capture _scarName>> + <<link "Remove Scar">> + <<set $scarApplied = 0>> + <<run delete $activeSlave.scar[_scarName]>> + <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> + <<set $degradation -= 10>> + <<goto "Body Modification">> + <</link>> + <</capture>> +<</for>> +<<if (jQuery.isEmptyObject($activeSlave.scar))>> + <br> + $His skin is not scarred. +<</if>> + +<br> +Use ''$scarDesign.local'' or choose another scar: + +[[Whip|Body Modification][$scarDesign.local = "whip"]] +| [[Burns|Body Modification][$scarDesign.local = "burn"]] +| [[Surgical|Body Modification][$scarDesign.local = "surgical"]] +| [[Menacing|Body Modification][$scarDesign.local = "menacing"]] +| [[Exotic|Body Modification][$scarDesign.local = "exotic"]] +/* Other common scars might be battle scars or c-Section but it makes little sense to include them here */ + +<br> +Or design your own: <<textbox "$scarDesign.local" $scarDesign.local "Body Modification">> + +<br> +Choose a site for scaring: + +<<if ["menacing", "exotic"].includes($scarDesign.local)>> + [[Cheeks|Body Modification][$scarTarget.local = "cheek"]] +<<else>> + /* Sorted head to toe */ + + [[Entire body|Body Modification][$scarTarget.local = "entire body"]] + + /* Head */ + <<if $activeSlave.earShape != "none">> + | [[Ears|Body Modification][$scarTarget.local = "ear"]] + <</if>> + | [[Cheeks|Body Modification][$scarTarget.local = "cheek"]] + | [[Neck|Body Modification][$scarTarget.local = "neck"]] + + /* Torso */ + | [[Chest|Body Modification][$scarTarget.local = "chest"]] + | [[Breasts|Body Modification][$scarTarget.local = "breast"]] + | [[Back|Body Modification][$scarTarget.local = "back"]] + | [[Lower Back|Body Modification][$scarTarget.local = "lower back"]] + | [[Belly|Body Modification][$scarTarget.local = "belly"]] + | [[Pubic Mound|Body Modification][$scarTarget.local = "pubic mound"]] + <<if $activeSlave.dick > 0>> + | [[Penis|Body Modification][$scarTarget.local = "penis"]] + <</if>> + <<if $activeSlave.balls > 0 && $activeSlave.scrotum > 0>> + | [[Testicles|Body Modification][$scarTarget.local = "testicle"]] + <</if>> + + /* Arms*/ + | [[Shoulders|Body Modification][$scarTarget.local = "shoulder"]] + <<if $activeSlave.amp == 0 && $activeSlave.missingArms != 3>> + | [[Arm, upper|Body Modification][$scarTarget.local = "upper arm"]] + | [[Arm, lower|Body Modification][$scarTarget.local = "lower arm"]] + | [[Wrists|Body Modification][$scarTarget.local = "wrist"]] + | [[Hands|Body Modification][$scarTarget.local = "hand"]] + <</if>> + + /* Legs */ + | [[Buttocks|Body Modification][$scarTarget.local = "buttock"]] + <<if $activeSlave.amp == 0 && $activeSlave.missingLegs != 3>> + | [[Thighs|Body Modification][$scarTarget.local = "thigh"]] + | [[Calves|Body Modification][$scarTarget.local = "calf"]] + | [[Ankles|Body Modification][$scarTarget.local = "ankle"]] + | [[Feet|Body Modification][$scarTarget.local = "foot"]] + <</if>> +<</if>> + +<br> +Or a custom site: <<textbox "$scarTarget.local" $scarTarget.local "Body Modification">> + +/* Correct some "bad" choices" */ +<<if ["menacing", "exotic"].includes($scarDesign.local)>> + <<if $scarTarget.local != "cheek">> + <<set $scarTarget.local = "cheek">> + <</if>> +<</if>> + +<br> +<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.local)>> + <<set _leftTarget = ("left " + $scarTarget.local)>> + <<set _rightTarget = ("right " + $scarTarget.local)>> + <<if $activeSlave.scar[_leftTarget]>> + $His _leftTarget is already marked with <<= App.Desc.expandScarString($activeSlave, _leftTarget)>>. + <</if>> + <<if $activeSlave.scar[_rightTarget]>> + $His _rightTarget is already marked with <<= App.Desc.expandScarString($activeSlave, _rightTarget)>>. + <</if>> + Scar $him now with ''$scarDesign.local'' on the + <<link "left">> + <<set $scarApplied = 1>> + <<run App.Medicine.Modification.addScar($activeSlave, _leftTarget, $scarDesign.local)>> + <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> + <<set $degradation += 10>> + <<goto "Body Modification">> + <</link>> + $scarTarget.local, or the + <<link "right">> + <<set $scarApplied = 1>> + <<run App.Medicine.Modification.addScar($activeSlave, _rightTarget, $scarDesign.local)>> + <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> + <<set $degradation += 10>> + <<goto "Body Modification">> + <</link>>? +<<else>> + <<if $activeSlave.scar.hasOwnProperty($scarTarget.local)>> + <<if $activeSlave.scar[$scarTarget.local][$scarDesign.local]>> + $He already has $scarDesign.local scars on $his $scarTarget.local. You can make it worse. + <<else>> /* check how much scarring is on this part */ + <<set _scarTotalValue = (Object.values($activeSlave.scar[$scarTarget.local])).reduce((a, b) => a + b, 0)>> + <<if _scarTotalValue>> + That would be a new kind of scar to add to the growing collection on $his $scarTarget.local. Life can always be worse for a slave. + <</if>> + <</if>> + <</if>> + <<link "Scar">> + <<if $scarTarget.local === "entire body" && $scarDesign.local.includes("whip")>> + /* Special case for whipping scene, producecs two scars */ + /* Whip marks */ + <<set _scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"]>> + <<if $activeSlave.amp != 1>> + <<set _scarArray.push("left upper arm", "right upper arm", "left thigh", "right thigh")>> + <</if>> + <<for _i to 0; _i < _scarArray.length; _i++>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarArray[_i], $scarDesign.local)>> + <</for>> + /* Manacles */ + <<if $activeSlave.amp != 1>> + <<set _scarArray = ["left wrist", "right wrist", "left ankle", "right ankle"]>> + <<for _i to 0; _i < _scarArray.length; _i++>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarArray[_i], "chain")>> + <</for>> + <</if>> + <<else>> + /* Normal entire body scarring */ + <<if $scarTarget.local === "entire body">> + <<set _scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"]>> + <<if $activeSlave.amp != 1>> + <<set _scarArray.push("left upper arm", "right upper arm", "left thigh", "right thigh")>> + <</if>> + /* Single scar */ + <<else>> + <<set _scarArray = [$scarTarget.local]>> + <</if>> + <<for _i to 0; _i < _scarArray.length; _i++>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarArray[_i], $scarDesign.local)>> + <<set $degradation += 10>> + <</for>> + <</if>> + <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> + <<set $scarApplied = 1>> + <<set $degradation += 10>> + <<goto "Body Modification">> + <</link>> + with $scarDesign.local on the $scarTarget.local<<if $activeSlave.scar[$scarTarget.local]>>, adding to the scars that are already there?<<else>>.<</if>> +<</if>> \ No newline at end of file diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw index 0d84ee8017de2c043755ae57fd756c43bdab7ee3..a44ccee34901868783081e710115e6d4d63a91aa 100644 --- a/src/uncategorized/longSlaveDescription.tw +++ b/src/uncategorized/longSlaveDescription.tw @@ -1157,9 +1157,9 @@ is <</if>> <<if $activeSlave.fuckdoll == 0>> - <<= App.Desc.brand($activeSlave, "cheek")>> - <<= App.Desc.brand($activeSlave, "ear")>> - <<= App.Desc.brand($activeSlave, "neck")>> + <<= App.Desc.mods($activeSlave, "cheek")>> + <<= App.Desc.mods($activeSlave, "ear")>> + <<= App.Desc.mods($activeSlave, "neck")>> <</if>> <<if $familyTesting == 1>> @@ -1967,65 +1967,19 @@ $He is <</if>> -/* -<<if $activeSlave.fuckdoll == 0>> - <<if ($activeSlave.scars == 0) && ($activeSlave.clothes != "no clothes")>> - $activeSlave.slaveName has no apparent scars, at least none that aren't hidden by $his clothes. - <<elseif ($activeSlave.scars == 0) && ($activeSlave.clothes == "no clothes")>> - $activeSlave.slaveName's body has no scars. - <<elseif ($activeSlave.scars == 0) && ($activeSlave.clothes == "body oil")>> - $activeSlave.slaveName's oiled body has no scars. - - <<elseif ($activeSlave.scars == 1) && ($activeSlave.clothes != "no clothes")>> - $activeSlave.slaveName's light scars are fully covered by $his clothes. - <<elseif ($activeSlave.scars == 1) && ($activeSlave.clothes == "no clothes")>> - $activeSlave.slaveName's light scars aren't really ugly just yet. - <<elseif ($activeSlave.scars == 1) && ($activeSlave.clothes == "body oil")>> - $activeSlave.slaveName's light scars are somewhat showing because of the oil. - - <<elseif ($activeSlave.scars == 2) and ($activeSlave.clothes != "no clothes")>> - $activeSlave.slaveName's big scars are showing even with $his clothes. - <<elseif ($activeSlave.scars == 2) and ($activeSlave.clothes == "no clothes")>> - $activeSlave.slaveName's big scars are quite repulsive on $his nude body. - <<elseif ($activeSlave.scars == 2) and ($activeSlave.clothes == "body oil")>> - $activeSlave.slaveName's big scars are really put into view because of the oil. - - <<elseif ($activeSlave.scars == 3) and ($activeSlave.clothes != "no clothes")>> - $activeSlave.slaveName's red scars are mostly hidden behind $his clothes - <<elseif ($activeSlave.scars == 3) and ($activeSlave.clothes == "no clothes")>>; - $activeSlave.slaveName's red scars really show on $his naked body. - <<elseif ($activeSlave.scars == 3) and ($activeSlave.clothes == "body oil")>> - $activeSlave.slaveName's red scars are even redder from the oil. - - <<elseif ($activeSlave.scars == 4) and ($activeSlave.clothes != "no clothes")>> - $activeSlave.slaveName's face shows burn scars. - <<elseif ($activeSlave.scars == 4) and ($activeSlave.clothes == "no clothes")>> - $activeSlave.slaveName's face and body show some burn scars. - <<elseif ($activeSlave.scars == 4) and ($activeSlave.clothes == "body oil")>> - The oil glistens strangely on $activeSlave.slaveName's burn scars. - - <<elseif ($activeSlave.scars == 5)>> - $activeSlave.slaveName has a big, menacing scar across $his face. - <<elseif ($activeSlave.scars == 5) and ($activeSlave.clothes == "body oil")>> - $activeSlave.slaveName has a big, menacing scar that is gleaming with the oil. - - <<elseif ($activeSlave.scars == 6) and ($activeSlave.clothes != "no clothes")>> - $He has an easily visible scar on $his face that gives it an exotic, yet appealing look. - <<elseif ($activeSlave.scars == 6) and ($activeSlave.clothes == "no clothes")>> - $He has an easily visible scar on $his face that makes it stand out from the rest of $his naked body. - <<elseif ($activeSlave.scars == 6) and ($activeSlave.clothes == "body oil")>> - $He has an easily visible scar on $his face that stands out thanks to the oil. +<<set _scarCounter = 0>> +<<for _scarName, _scar range $activeSlave.scar>> + <<if ($activeSlave.ID == $Bodyguard.ID) && _scarCounter > 1>> + $His scars make $him look even more menacing than $he actually is. + <<break>> + <<elseif ($activeSlave.ID == $Bodyguard.ID) && $activeSlave.scar[_scarName].menacing > 0>> + $His menacing scar makes $him look terrifying. + <<break>> + <<elseif ($activeSlave.ID == $Wardeness.ID) && _scarCounter > 1>> + $His scars make $him look like $he's in the right place. <</if>> -<</if>> -*/ - -<<if ($activeSlave.ID == $Bodyguard.ID) && ($activeSlave.scars > 1) && ($activeSlave.scars < 6)>> - $His scars make $him look even more menacing than $he actually is. -<<elseif ($activeSlave.ID == $Bodyguard.ID) && ($activeSlave.scars == 6)>> - $His menacing scar makes $him look terrifying. -<<elseif ($activeSlave.ID == $Wardeness.ID) && ($activeSlave.scars > 1)>> - $His scars make $him look like $he's in the right place. -<</if>> + <<set _scarCounter++>> +<</for>> <<if $activeSlave.fuckdoll == 0>> <<if $activeSlave.markings == "birthmark" && $activeSlave.prestige == 0 && $activeSlave.pornPrestige < 2>> @@ -2059,7 +2013,7 @@ $He is <<if $activeSlave.fuckdoll == 0>> /* Describe any brands that are not directly addressed elsewhere in longSlave */ - <<= App.Desc.brand($activeSlave, "extra")>> + <<= App.Desc.mods($activeSlave, "extra")>> <</if>> <<if ($showClothing == 1) && ($saleDescription == 0)>> diff --git a/src/uncategorized/neighborDescription.tw b/src/uncategorized/neighborDescription.tw index f228a98beea4eaf93fc8478edaf095e84939e7c5..d16585fddfe0de4a851292e99aa61046aadf9294 100644 --- a/src/uncategorized/neighborDescription.tw +++ b/src/uncategorized/neighborDescription.tw @@ -205,6 +205,42 @@ its neighbors. <</if>> <<set _neighborDescription.push($desc)>> <</if>> +<<if $arcologies[$i].FSIntellectualDependency != "unset">> + <<if $arcologies[$i].FSIntellectualDependency > 80>> + <<set $desc = "committed to ">> + <<elseif $arcologies[$i].FSIntellectualDependency > 20>> + <<set $desc = "pursuing ">> + <<else>> + <<set $desc = "just establishing ">> + <</if>> + <<set $desc = $desc + "@@.gold;Intellectual Dependency,@@ and is ">> + <<if $arcologies[$i].FSIntellectualDependency > 95>> + <<set $desc = $desc + "both terrifying and alluring to slaves worldwide, as a place where none leave with any semblance of intelligence but always flaunt the enjoyment they've had.">> + <<elseif $arcologies[$i].FSIntellectualDependency > 40>> + <<set $desc = $desc + "becoming known for its unusually simple-minded chattel.">> + <<else>> + <<set $desc = $desc + "importanting large quantities of aphrodisiacs and psychosuppressants.">> + <</if>> + <<set _neighborDescription.push($desc)>> +<</if>> +<<if $arcologies[$i].FSSlaveProfessionalism != "unset">> + <<if $arcologies[$i].FSSlaveProfessionalism > 80>> + <<set $desc = "committed to ">> + <<elseif $arcologies[$i].FSSlaveProfessionalism > 20>> + <<set $desc = "pursuing ">> + <<else>> + <<set $desc = "just establishing ">> + <</if>> + <<set $desc = $desc + "@@.gold;Slave Professionalism,@@ and is ">> + <<if $arcologies[$i].FSSlaveProfessionalism > 95>> + <<set $desc = $desc + "renowned as a source of some of the world's finest courtesans.">> + <<elseif $arcologies[$i].FSSlaveProfessionalism > 40>> + <<set $desc = $desc + "becoming revered as an intellectual paradise.">> + <<else>> + <<set $desc = $desc + "seeking out high-class slave trainers.">> + <</if>> + <<set _neighborDescription.push($desc)>> +<</if>> <<if $arcologies[$i].FSBodyPurist != "unset">> <<if $arcologies[$i].FSBodyPurist > 80>> <<set $desc = "committed to ">> @@ -277,6 +313,42 @@ its neighbors. <</if>> <<set _neighborDescription.push($desc)>> <</if>> +<<if $arcologies[$i].FSPetiteAdmiration != "unset">> + <<if $arcologies[$i].FSPetiteAdmiration > 80>> + <<set $desc = "committed to ">> + <<elseif $arcologies[$i].FSPetiteAdmiration > 20>> + <<set $desc = "pursuing ">> + <<else>> + <<set $desc = "just establishing ">> + <</if>> + <<set $desc = $desc + "@@.gold;Petite Admiration,@@ and is ">> + <<if $arcologies[$i].FSPetiteAdmiration > 95>> + <<set $desc = $desc + "known as a place where even the shortest person can feel tall.">> + <<elseif $arcologies[$i].FSPetiteAdmiration > 40>> + <<set $desc = $desc + "investing large sums of money into petite clothing lines.">> + <<else>> + <<set $desc = $desc + "starting to accumulate an unusually large number of short slaves.">> + <</if>> + <<set _neighborDescription.push($desc)>> +<</if>> +<<if $arcologies[$i].FSStatuesqueGlorification != "unset">> + <<if $arcologies[$i].FSStatuesqueGlorification > 80>> + <<set $desc = "committed to ">> + <<elseif $arcologies[$i].FSStatuesqueGlorification > 20>> + <<set $desc = "pursuing ">> + <<else>> + <<set $desc = "just establishing ">> + <</if>> + <<set $desc = $desc + "@@.gold;Statuesque Glorification,@@ and is ">> + <<if $arcologies[$i].FSStatuesqueGlorification > 95>> + <<set $desc = $desc + "world famous among tall slaves, who see it as a paradise in which they are valued above all.">> + <<elseif $arcologies[$i].FSStatuesqueGlorification > 40>> + <<set $desc = $desc + "going out of its way to import only the tallest of slaves.">> + <<else>> + <<set $desc = $desc + "starting to drive out its shorter citizenry.">> + <</if>> + <<set _neighborDescription.push($desc)>> +<</if>> <<if $arcologies[$i].FSSlimnessEnthusiast != "unset">> <<if $arcologies[$i].FSSlimnessEnthusiast > 80>> <<set $desc = "committed to ">> diff --git a/src/uncategorized/neighborInteract.tw b/src/uncategorized/neighborInteract.tw index 44acd64c8725016eb9ae30d376e995eeaebfa835..fe4b25d8ecb03176ceea69fcfb354847bee458b2 100644 --- a/src/uncategorized/neighborInteract.tw +++ b/src/uncategorized/neighborInteract.tw @@ -149,6 +149,18 @@ You have <<print $arcologies.length-1>> neighbors. <br><br> <<if $arcologies[0].FSIncestFetishist > 60>> <<set $desc.push("Incest Fetishism")>> <</if>> +<<if $arcologies[0].FSIntellectualDependency > 60>> + <<set $desc.push("Intellectual Dependency")>> +<</if>> +<<if $arcologies[0].FSSlaveProfessionalism > 60>> + <<set $desc.push("Slave Professionalism")>> +<</if>> +<<if $arcologies[0].FSPetiteAdmiration > 60>> + <<set $desc.push("Petite Admiration")>> +<</if>> +<<if $arcologies[0].FSStatuesqueGlorification > 60>> + <<set $desc.push("Statuesque Glorification")>> +<</if>> <<if $arcologies[0].FSChattelReligionist > 60>> <<set $desc.push("Chattel Religionism")>> <</if>> @@ -318,6 +330,12 @@ You have <<print $arcologies.length-1>> neighbors. <br><br> <<if $arcologies[_currentNeighbor].FSGenderRadicalist != "unset">> <br><<link "Force Abandonment of Gender Radicalism">><<set $arcologies[_currentNeighbor].FSGenderRadicalist = "unset">><<goto "Neighbor Interact">><</link>> <</if>> + <<if $arcologies[_currentNeighbor].FSIntellectualDependency != "unset">> + <br><<link "Force Abandonment of Intellectual Dependency">><<set $arcologies[_currentNeighbor].FSIntellectualDependency = "unset">><<goto "Neighbor Interact">><</link>> + <</if>> + <<if $arcologies[_currentNeighbor].FSSlaveProfessionalism != "unset">> + <br><<link "Force Abandonment of Slave Professionalism">><<set $arcologies[_currentNeighbor].FSSlaveProfessionalism = "unset">><<goto "Neighbor Interact">><</link>> + <</if>> <<if $arcologies[_currentNeighbor].FSGenderFundamentalist != "unset">> <br><<link "Force Abandonment of Gender Fundamentalism">><<set $arcologies[_currentNeighbor].FSGenderFundamentalist = "unset">><<goto "Neighbor Interact">><</link>> <</if>> @@ -339,6 +357,12 @@ You have <<print $arcologies.length-1>> neighbors. <br><br> <<if $arcologies[_currentNeighbor].FSMaturityPreferentialist != "unset">> <br><<link "Force Abandonment of Maturity Preferentialism">><<set $arcologies[_currentNeighbor].FSMaturityPreferentialist = "unset">><<goto "Neighbor Interact">><</link>> <</if>> + <<if $arcologies[_currentNeighbor].FSPetiteAdmiration != "unset">> + <br><<link "Force Abandonment of Petite Admiration">><<set $arcologies[_currentNeighbor].FSPetiteAdmiration = "unset">><<goto "Neighbor Interact">><</link>> + <</if>> + <<if $arcologies[_currentNeighbor].FSStatuesqueGlorification != "unset">> + <br><<link "Force Abandonment of Statuesque Glorification">><<set $arcologies[_currentNeighbor].FSStatuesqueGlorification = "unset">><<goto "Neighbor Interact">><</link>> + <</if>> <<if $arcologies[_currentNeighbor].FSSlimnessEnthusiast != "unset">> <br><<link "Force Abandonment of Slimness Enthusiasm">><<set $arcologies[_currentNeighbor].FSSlimnessEnthusiast = "unset">><<goto "Neighbor Interact">><</link>> <</if>> @@ -578,6 +602,69 @@ You have <<print $arcologies.length-1>> neighbors. <br><br> <</if>> <<set _exports = 1>> <</if>> + <<if $arcologies[_currentNeighbor].FSIntellectualDependency > 95>> + <<if !isItemAccessible("temp")>> + <<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>> + <br><<link "Request a shipment of outfits suitable for bimbos" "Neighbor Interact">> + <<set $clothesBoughtBimbo = 1>> + <</link>> + <<elseif $PC.hacking >= 50>> + <br><<link "Divert an outgoing shipment of outfits suitable for bimbos" "Neighbor Interact">> + <<set $clothesBoughtBimbo = 1>> + <</link>> + <<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>> + <br><<link "Purchase a shipment of outfits suitable for bimbos" "Neighbor Interact">> + <<set $clothesBoughtBimbo = 1>> + <<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>> + <</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>// + <</if>> + <<else>> + <br>You already have enough temp. + <</if>> + <<set _exports = 1>> + <</if>> + <<if $arcologies[_currentNeighbor].FSSlaveProfessionalism > 95>> + <<if !isItemAccessible("a courtesan dress")>> + <<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>> + <br><<link "Request a shipment of courtesan dresses" "Neighbor Interact">> + <<set $clothesBoughtCourtesan = 1>> + <</link>> + <<elseif $PC.hacking >= 50>> + <br><<link "Divert an outgoing shipment of courtesan dresses" "Neighbor Interact">> + <<set $clothesBoughtCourtesan = 1>> + <</link>> + <<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>> + <br><<link "Purchase a shipment of courtesan dresses" "Neighbor Interact">> + <<set $clothesBoughtCourtesan = 1>> + <<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>> + <</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>// + <</if>> + <<else>> + <br>You already have enough courtesan dresses. + <</if>> + <<set _exports = 1>> + <</if>> + <<if $arcologies[_currentNeighbor].FSPetiteAdmiration > 95>> + <<if !isItemAccessible("temp")>> + <<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>> + <br><<link "Request a shipment of petite-sized dresses" "Neighbor Interact">> + <<set $clothesBoughtPetite = 1>> + <</link>> + <<elseif $PC.hacking >= 50>> + <br><<link "Divert an outgoing shipment of petite-sized dresses" "Neighbor Interact">> + <<set $clothesBoughtPetite = 1>> + <</link>> + <<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>> + <br><<link "Purchase a shipment of petite-sized dresses" "Neighbor Interact">> + <<set $clothesBoughtPetite = 1>> + <<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>> + <</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>// + <</if>> + <<else>> + <br>You already have enough temp. + <</if>> + <<set _exports = 1>> + <</if>> <<if $arcologies[_currentNeighbor].FSPhysicalIdealist > 95>> <<if !isItemAccessible("body oil")>> <<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>> @@ -718,6 +805,27 @@ You have <<print $arcologies.length-1>> neighbors. <br><br> <</if>> <<set _exports = 1>> <</if>> + <<if $arcologies[_currentNeighbor].FSStatuesqueGlorification > 95>> + <<if !isItemAccessible("temp")>> + <<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>> + <br><<link "Request a shipment of height boosting footwear" "Neighbor Interact">> + <<set $shoesBoughtHeels = 1>> + <</link>> + <<elseif $PC.hacking >= 50>> + <br><<link "Divert an outgoing shipment of height boosting footwear" "Neighbor Interact">> + <<set $shoesBoughtHeels = 1>> + <</link>> + <<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>> + <br><<link "Purchase a shipment of height boosting footwear" "Neighbor Interact">> + <<set $shoesBoughtHeels = 1>> + <<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>> + <</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>// + <</if>> + <<else>> + <br>You already have enough varieties of high heels and other height boosting footwear. + <</if>> + <<set _exports = 1>> + <</if>> <<if _exports != 1>> <<if $arcologies[_currentNeighbor].direction == $arcologies[0].embargoTarget>> Fortunately, diff --git a/src/uncategorized/newSlaveIntro.tw b/src/uncategorized/newSlaveIntro.tw index 6d2c3289d9a2ef9dca7c1b6b6d5046c56dfe277d..bec5870b44b6d7d1b6e4dafe723ee58c22be10b9 100644 --- a/src/uncategorized/newSlaveIntro.tw +++ b/src/uncategorized/newSlaveIntro.tw @@ -13,13 +13,67 @@ <<setPlayerPronouns>> <<setLocalPronouns $activeSlave>> -/* use the secondary location if the primary brand target won't work for this slave */ -<<set _brandTarget = $brandTarget.primary>> -<<if ($activeSlave.dick == 0 && $brandTarget.primary == "penis") -|| ($activeSlave.earShape != "none" && $brandTarget.primary == "ear") -|| ($activeSlave.amp != 0 && ($brandTarget.primary == "thigh" || $brandTarget.primary == "calve" || $brandTarget.primary == "ankle" || $brandTarget.primary == "foot")) -|| ($activeSlave.balls == 0 && $activeSlave.scrotum == 0 && $brandTarget.primary == "testicle")>> - <<set _brandTarget = $brandTarget.secondary>> +/* use the secondary location if the primary mark target won't work for this slave */ +<<set _brandTarget = $brandTarget.primary, _scarTarget = $scarTarget.primary>> +<<if $activeSlave.dick == 0>> + <<if $brandTarget.primary == "penis">> + <<set _brandTarget = $brandTarget.secondary>> + <</if>> + <<if $scarTarget.primary == "penis">> + <<set _scarTarget = $scarTarget.secondary>> + <</if>> +<</if>> +<<if $activeSlave.balls == 0 && $activeSlave.scrotum == 0>> + <<if ["left testicle", "right testicle"].includes($brandTarget.primary)>> + <<set _brandTarget = $brandTarget.secondary>> + <</if>> + <<if ["left testicle", "right testicle"].includes($scarTarget.primary)>> + <<set _scarTarget = $scarTarget.secondary>> + <</if>> +<</if>> +<<if $activeSlave.earShape == "none">> + <<if ["left ear", "right ear"].includes($brandTarget.primary)>> + <<set _brandTarget = $brandTarget.secondary>> + <</if>> + <<if ["left ear", "right ear"].includes($scarTarget.primary)>> + <<set _scarTarget = $scarTarget.secondary>> + <</if>> +<</if>> +<<if $activeSlave.amp != 0>> + <<if ([ + "left upper arm", "right upper arm", + "left lower arm", "right lower arm", + "left wrist", "right wrist", + "left hand", "right hand" + ].includes($brandTarget.primary))>> + <<set _brandTarget = $brandTarget.secondary>> + <</if>> + <<if ([ + "left upper arm", "right upper arm", + "left lower arm", "right lower arm", + "left wrist", "right wrist", + "left hand", "right hand" + ].includes($scarTarget.primary))>> + <<set _scarTarget = $scarTarget.secondary>> + <</if>> +<</if>> +<<if $activeSlave.amp != 0>> /* amp check is in two parts for future multiamp */ + <<if ([ + "left thigh", "right thigh", + "left calve", "right calve", + "left ankle", "right ankle", + "left foot", "right foot" + ].includes($brandTarget.primary))>> + <<set _brandTarget = $brandTarget.secondary>> + <</if>> + <<if ([ + "left thigh", "right thigh", + "left calve", "right calve", + "left ankle", "right ankle", + "left foot", "right foot" + ].includes($scarTarget.primary))>> + <<set _scarTarget = $scarTarget.secondary>> + <</if>> <</if>> <<if $specialSlave == 1>> @@ -1188,6 +1242,90 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << //This option costs <<print cashFormat($SPcost)>>// <</if>> +<br> + +<<link "Whip $him until $he scars">> + /* Whip marks */ + <<set _scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"]>> + <<if $activeSlave.amp != 1>> + <<set _scarArray.push("left upper arm", "right upper arm", "left thigh", "right thigh")>> + <</if>> + <<for _i to 0; _i < _scarArray.length; _i++>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarArray[_i], "whip")>> + <</for>> + /* Manacles */ + <<if $activeSlave.amp != 1>> + <<set _scarArray = ["left wrist", "right wrist", "left ankle", "right ankle"]>> + <<for _i to 0; _i < _scarArray.length; _i++>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarArray[_i], "chain")>> + <</for>> + <</if>> + + <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> /* Let's just bill once, for the whip and disinfectant. */ + <<set $activeSlave.devotion -= 5>> + <<set $activeSlave.trust -= 10>> + <<set $activeSlave.health -= 10>> + <<replace "#introResult">> + You drag $him to the + <<if $cellblock>> + $cellblockName + <<else>> + body modification studio + <</if>> + and + <<if $activeSlave.amp != 1>> + chain $him spread-eagled + <<else>> + secure $him + <</if>> + with $his face to the wall and $his naked back defenseless. $He doesn't understand what's coming for a while, even as disinfectant is applied from $his neck + <<if $activeSlave.amp != 1>> + to $his knees. + <<else>> + down. + <</if>> + $He can't see you prepare the whip, + <<if !canSee($activeSlave)>> + of course, + <</if>> + <<if canHear($activeSlave)>> + but almost jumps out of $his $activeSlave.skin skin when you crack it behind $him. + <<else>> + and in $his deaf state every blow is a devastating suprise. + <</if>> + $He frantically + <<if $activeSlave.amp != 1>> + wrenches $his hands and feet as you work up and down $his exposed back and limbs, but is completely unable to get free. + <<else>> + twists and turns, but without limbs is powerless to escape the curling whip. + <</if>> + If $he didn't know $he was a slave before, @@.mediumorchid;$he does now,@@ and $he's got the @@.gold;agonizing@@ @@.red;injury@@ to prove it. What $he doesn't yet know is just how permanent this lashing's effects will be. The level of violence and the coating you used will leave $him scarred with the marks of slavery forever. + <<if ($arcologies[0].FSSubjugationistRace == $activeSlave.race) && ($arcologies[0].FSSubjugationist > 0)>> + Society @@.green;approves@@ of your purchase and whipping of an inferior $activeSlave.race person; this advances the idea that $activeSlave.race people ought to be enslaved. + <<= FutureSocieties.Change("Subjugationist", 2)>> + <<elseif ($arcologies[0].FSSupremacistRace == $activeSlave.race) && ($arcologies[0].FSSupremacist > 0)>> + Society @@.red;disapproves@@ of your purchase and whipping of <<if $activeSlave.race == "amerindian" || $activeSlave.race == "asian" || $activeSlave.race == "indo-aryan">>an<<else>>a<</if>> $activeSlave.race person; this reduces support for the idea that $activeSlave.race people are superior. + <<= FutureSocieties.Change("Supremacist", -2)>> + <</if>> + <</replace>> +<</link>> + +| <<link "Scar $him on the _scarTarget">> + <<replace "#introResult">> + You drag $him to the body modification studio and strap $him down with $his _scarTarget clear and defenseless. $He doesn't understand what's coming for a while, even as disinfectant is applied to $his _scarTarget. You have a wide selection of tools to create scars, the trick is to keep the wound from healing correctly afterward. Of course, $he has no way of knowing that the pain you are inflicting as you cut into $his flesh will leave such a permanent mark, but the basic message is clear: if $he didn't know $he was a slave before, @@.mediumorchid;$he does now,@@ and $he's got the @@.gold;agonizing@@ @@.red;injury@@ to prove it. + <<if ($arcologies[0].FSSubjugationistRace == $activeSlave.race) && ($arcologies[0].FSSubjugationist > 0)>> + Society @@.green;approves@@ of your purchase and scarring of an inferior $activeSlave.race person; this advances the idea that $activeSlave.race people ought to be enslaved. + <<= FutureSocieties.Change("Subjugationist", 2)>> + <<elseif ($arcologies[0].FSSupremacistRace == $activeSlave.race) && ($arcologies[0].FSSupremacist > 0)>> + Society @@.red;disapproves@@ of your purchase and scarring of <<if $activeSlave.race == "amerindian" || $activeSlave.race == "asian" || $activeSlave.race == "indo-aryan">>an<<else>>a<</if>> $activeSlave.race person; this reduces support for the idea that $activeSlave.race people are superior. + <<= FutureSocieties.Change("Supremacist", -2)>> + <</if>> + <</replace>> + <<run App.Medicine.Modification.addScar($activeSlave, _scarTarget, $scarDesign.primary)>> + <<set $activeSlave.devotion -= 5>> + <<set $activeSlave.trust -= 10>> + <<set $activeSlave.health -= 10>> +<</link>> <<if $arcologies[0].FSHedonisticDecadence >= 50 && $activeSlave.behavioralFlaw == "anorexic" && $activeSlave.weight < 10>> <br> diff --git a/src/uncategorized/pRivalryHostage.tw b/src/uncategorized/pRivalryHostage.tw index 655201cae4d04b8d2d0c23ec1ff15bc2bf32e419..6e0cb87554bf273feac238f18c4f60b086e8911f 100644 --- a/src/uncategorized/pRivalryHostage.tw +++ b/src/uncategorized/pRivalryHostage.tw @@ -75,7 +75,7 @@ <<set $activeSlave.counter.vaginal = 158>> <<set $activeSlave.counter.anal = 76>> <<set $activeSlave.counter.mammary = 320>> - <<set $activeSlave.cSec = 1>> + <<set $activeSlave.scar["belly"]["c-section"] = 1>> <<case "servant">> <<set $activeSlave.career = "a maid">> <<if $pedo_mode == 1>> diff --git a/src/uncategorized/reRelativeRecruiter.tw b/src/uncategorized/reRelativeRecruiter.tw index 65c06919ed51bcf7b3a63c7ccc19cf680f338941..a1e1dc382138e7d182840415e5588af0a1743684 100644 --- a/src/uncategorized/reRelativeRecruiter.tw +++ b/src/uncategorized/reRelativeRecruiter.tw @@ -109,7 +109,7 @@ <<set $activeSlave.lipsPiercing = 0>> <<set $activeSlave.tonguePiercing = 0>> <<set $activeSlave.vaginaPiercing = 0>> - <<set $activeSlave.cSec = 0>> + <<set $activeSlave.scar = {}>> <<set $activeSlave.clitPiercing = 0>> <<set $activeSlave.dick = 0>> <<set $activeSlave.anus = 0>> @@ -465,9 +465,7 @@ <<set $activeSlave.anusPiercing = 0>> <<set $activeSlave.anusTat = 0>> <<set $activeSlave.bellyAccessory = "none">> -<<for _brandName, _brand range $activeSlave.brand>> - <<set _brand = 0>> -<</for>> +<<set $activeSlave.brand = {}>> <<set $activeSlave.shouldersTat = 0>> <<set $activeSlave.armsTat = 0>> <<set $activeSlave.legsTat = 0>> diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw index 92687c30e64f9079b876b68ecc09422aa3a8f55a..720df83812b2acefe4201b625cbe12b52bd785ed 100644 --- a/src/uncategorized/remoteSurgery.tw +++ b/src/uncategorized/remoteSurgery.tw @@ -489,14 +489,14 @@ $He has <</if>> -<<if $activeSlave.scars > 0>> +<<if $activeSlave.scar["left cheek"]>> <br> - $He has notable facial scarring. - [[Remove scars|Surgery Degradation][$activeSlave.scars = 0, cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarRemov"]] -<<elseif $activeSlave.scars == 0>> + $He has <<= App.Desc.expandScarString($activeSlave, "left cheek")>> on $his left cheek. + [[Remove scars|Surgery Degradation][delete $activeSlave.scar["left cheek"], cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarRemov"]] +<<else>> <br> - $His face is unscarred. [[Give a menacing scar|Surgery Degradation][$activeSlave.scars = 5, cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarFear"]] | - [[Give an exotic scar|Surgery Degradation][$activeSlave.scars = 6, cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarExo"]] + $His face is unscarred. [[Give a menacing scar|Surgery Degradation][$activeSlave.scar["left cheek"].menacing = 1, cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarFear"]] | + [[Give an exotic scar|Surgery Degradation][$activeSlave.scar["left cheek"].exotic = 1, cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 5, $surgeryType = "scarExo"]] <</if>> <br><br> @@ -839,10 +839,17 @@ $He's <</if>> <</if>> -<<if ($activeSlave.cSec == 1)>> - <br> - $He has an unsightly c-section scar. - [[Remove Caesarean scar|Surgery Degradation][$activeSlave.cSec = 0,cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave), $activeSlave.health -= 10,$surgeryType = "bellyscar"]] +<<if ($activeSlave.scar.hasOwnProperty("belly") && $activeSlave.scar.belly.hasOwnProperty("c-section"))>> + <<if $activeSlave.scar.belly["c-section"] > 0>> + <br> + $He has an unsightly c-section scar. + <<link "Remove Caesarean scar">> + <<set $activeSlave.scar["belly"]["c-section"] = 0>> + <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> + <<set $activeSlave.health -= 10,$surgeryType = "bellyscar">> + <<goto "Surgery Degradation">> + <</link>> + <</if>> <</if>> <br><br> diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index a0b1f1552dbe45efce636c20a28636dc7271fed7..1e30f7654c7bd76c1b0bbc9315eb796a99db29f2 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -5617,14 +5617,28 @@ <</if>> /* pregmod */ - <<if ($slaves[$i].scars != 0) && ($slaves[$i].scars != 6)>> - <<if $arcologies[0].FSDegradationist != "unset">> - Society @@.green;mildly approves@@ of your slave's scarring; this encourages the further abuse of slaves. - <<= FutureSocieties.ChangePorn("Degradationist", 1)>> - <<elseif $arcologies[0].FSPaternalist != "unset">> - Society @@.red;mildly disapproves@@ of your scarred slaves, viewing them as a sign of mistreatment. - <<= FutureSocieties.ChangePorn("Paternalist", -1)>> - <</if>> + <<if !(jQuery.isEmptyObject($slaves[$i].scar))>> + <<set _hasScar = 0>> + <<for _scarPlace, _scar range $slaves[$i].scar>> /* loop through all body parts */ + <<for _scarType, _scar range $slaves[$i].scar[_scarPlace]>> /* loop through all scar types */ + <<if _scarPlace === "exotic">> /* exotic scars don't count */ + <<continue>> + <<elseif _scar>> /*any other scar greater than 0 does */ + <<if $arcologies[0].FSDegradationist != "unset">> + Society @@.green;mildly approves@@ of your slave's scarring; this encourages the further abuse of slaves. + <<= FutureSocieties.ChangePorn("Degradationist", 1)>> + <<elseif $arcologies[0].FSPaternalist != "unset">> + Society @@.red;mildly disapproves@@ of your scarred slaves, viewing them as a sign of mistreatment. + <<= FutureSocieties.ChangePorn("Paternalist", -1)>> + <</if>> + <<set _hasScar = 1>> + <<break>> + <</if>> + <</for>> + <<if _hasScar>> + <<break>> + <</if>> + <</for>> <</if>> <<if $arcologies[0].FSBodyPurist != "unset">> @@ -8163,12 +8177,6 @@ <</if>> <</if>> -/* pregmod */ -<<if ($slaves[$i].scarheal == 5)>> - $slaves[$i].slaveName's wound has @@.green;healed@@ leaving a big scar. It is still @@.red;quite ugly@@ but doesn't hurt anymore. - <<set $slaves[$i].scars -= 1>> -<</if>> - /* LANGUAGE */ <<if ($slaves[$i].accent > 0) && ($slaves[$i].fetish != "mindbroken")>> diff --git a/src/uncategorized/slaveAssignmentsReport.tw b/src/uncategorized/slaveAssignmentsReport.tw index d239cfa9be367f31d6ac2c9e478cd6c43a8a455c..bcd580715d87c25b6c9c5078aae71619b1360661 100644 --- a/src/uncategorized/slaveAssignmentsReport.tw +++ b/src/uncategorized/slaveAssignmentsReport.tw @@ -613,11 +613,6 @@ $NPCMarketShareLC = Math.trunc(($NPCSexSupply.lowerClass * 1000) / ($NPCSexSuppl <</if>> <</if>> -/* -<<if ($slaves[$i].scars == 3)>> - <<set $slaves[$i].scarheal += 1>> -<</if>> -*/ <<if $slaves[$i].fetish == "mindbroken" && $slaves[$i].relationship == -3>> <<if (def $slaves[$i].kindness) && $slaves[$i].kindness > 0>> <<set $slaves[$i].kindness-->> diff --git a/src/uncategorized/slaveStats.tw b/src/uncategorized/slaveStats.tw index ae0f622c11b1f04f2f431fe95b6d01e06be5d905..506b32c9d3cc8a728c1457774088af3f0c4b5a02 100644 --- a/src/uncategorized/slaveStats.tw +++ b/src/uncategorized/slaveStats.tw @@ -186,7 +186,6 @@ slaveName: $activeSlave.slaveName /* TODO: figure out why this is being inden <br>labor: $activeSlave.labor <br>births: $activeSlave.counter.births <br>laborCount: $activeSlave.counter.laborCount -<br>cSec: $activeSlave.cSec <br>bellyAccessory: $activeSlave.bellyAccessory <br>labia: $activeSlave.labia <br>clit: $activeSlave.clit @@ -210,6 +209,10 @@ slaveName: $activeSlave.slaveName /* TODO: figure out why this is being inden <<for _brandName, _brand range $activeSlave.brand>> _brandName: _brand, <</for>> +<br>scar: +<<for _scarName, scar range $activeSlave.scar>> + _scarName: scar, +<</for>> <br>earPiercing: $activeSlave.earPiercing <br>nosePiercing: $activeSlave.nosePiercing <br>eyebrowPiercing: $activeSlave.eyebrowPiercing @@ -320,7 +323,6 @@ slaveName: $activeSlave.slaveName /* TODO: figure out why this is being inden <br>birthsTotal: $activeSlave.counter.birthsTotal <br>pubertyAgeXX: $activeSlave.pubertyAgeXX <br>pubertyAgeXY: $activeSlave.pubertyAgeXY -<br>scars: $activeSlave.scars <br>breedingMark: $activeSlave.breedingMark <br>bodySwap: $activeSlave.bodySwap <br>HGExclude: $activeSlave.HGExclude diff --git a/src/uncategorized/universalRules.tw b/src/uncategorized/universalRules.tw index ac2713115882ea4563479b839bfd741cf21f1010..2f8122318f777ced9e0191b3df27740c946724b5 100644 --- a/src/uncategorized/universalRules.tw +++ b/src/uncategorized/universalRules.tw @@ -151,33 +151,55 @@ Or design your own: <<textbox "$brandDesign.official" $brandDesign.official "Uni <br><br> One 'welcome' for a new slave is to have them branded. Where would you like such brands to be applied? -<br>Current site is ''$brandTarget.primary'': - -[[Ears|Universal Rules][$brandTarget.primary = "ear"]] -| [[Cheeks|Universal Rules][$brandTarget.primary = "cheek"]] -| [[Shoulders|Universal Rules][$brandTarget.primary = "shoulder"]] -| [[Breasts|Universal Rules][$brandTarget.primary = "breast"]] -| [[Arm, upper|Universal Rules][$brandTarget.primary = "upper arm"]] -| [[Arm, lower|Universal Rules][$brandTarget.primary = "lower arm"]] -| [[Wrist|Universal Rules][$brandTarget.primary = "wrist"]] -| [[Hand|Universal Rules][$brandTarget.primary = "hand"]] -| [[Buttocks|Universal Rules][$brandTarget.primary = "buttock"]] -| [[Thigh|Universal Rules][$brandTarget.primary = "thigh"]] -| [[Calf|Universal Rules][$brandTarget.primary = "calve"]] -| [[Ankle|Universal Rules][$brandTarget.primary = "ankle"]] -| [[Feet|Universal Rules][$brandTarget.primary = "foot"]] -| [[Neck|Universal Rules][$brandTarget.primary = "neck"]] -| [[Chest|Universal Rules][$brandTarget.primary = "chest"]] -| [[Belly|Universal Rules][$brandTarget.primary = "belly"]] -| [[Pubic Mound|Universal Rules][$brandTarget.primary = "pubic mound"]] -| [[Penis|Universal Rules][$brandTarget.primary = "penis"]] -| [[Testicles|Universal Rules][$brandTarget.primary = "testicle"]] -| [[Back|Universal Rules][$brandTarget.primary = "back"]] -| [[Lower Back|Universal Rules][$brandTarget.primary = "lower back"]] +<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($brandTarget.primary)>> + <br> On the + [[left|Universal Rules][$brandTarget.primary = ("left " + $brandTarget.primary)]] + $brandTarget.primary, or the + [[right|Universal Rules][$brandTarget.primary = ("right " + $brandTarget.primary)]]? +<<else>> + <br> Current site is ''$brandTarget.primary'': + [[Ears|Universal Rules][$brandTarget.primary = "ear"]] + | [[Cheeks|Universal Rules][$brandTarget.primary = "cheek"]] + | [[Shoulders|Universal Rules][$brandTarget.primary = "shoulder"]] + | [[Breasts|Universal Rules][$brandTarget.primary = "breast"]] + | [[Arm, upper|Universal Rules][$brandTarget.primary = "upper arm"]] + | [[Arm, lower|Universal Rules][$brandTarget.primary = "lower arm"]] + | [[Wrist|Universal Rules][$brandTarget.primary = "wrist"]] + | [[Hand|Universal Rules][$brandTarget.primary = "hand"]] + | [[Buttocks|Universal Rules][$brandTarget.primary = "buttock"]] + | [[Thigh|Universal Rules][$brandTarget.primary = "thigh"]] + | [[Calf|Universal Rules][$brandTarget.primary = "calve"]] + | [[Ankle|Universal Rules][$brandTarget.primary = "ankle"]] + | [[Feet|Universal Rules][$brandTarget.primary = "foot"]] + | [[Neck|Universal Rules][$brandTarget.primary = "neck"]] + | [[Chest|Universal Rules][$brandTarget.primary = "chest"]] + | [[Belly|Universal Rules][$brandTarget.primary = "belly"]] + | [[Pubic Mound|Universal Rules][$brandTarget.primary = "pubic mound"]] + | [[Penis|Universal Rules][$brandTarget.primary = "penis"]] + | [[Testicles|Universal Rules][$brandTarget.primary = "testicle"]] + | [[Back|Universal Rules][$brandTarget.primary = "back"]] + | [[Lower Back|Universal Rules][$brandTarget.primary = "lower back"]] +<</if>> -<br> -<<if ["ankle", "calve", "ear", "foot", "hand", "lower arm", "penis", "testicle", "thigh", "upper arm", "wrist"].includes($brandTarget.primary)>> - It's possible that ''$brandTarget.primary'' may be missing from a slave. Choose a fallback in case it is not available: Current backup is ''$brandTarget.secondary'': +<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($brandTarget.secondary)>> + <br> On the + [[left|Universal Rules][$brandTarget.secondary = ("left " + $brandTarget.secondary)]] + $brandTarget.secondary, or the + [[right|Universal Rules][$brandTarget.secondary = ("right " + $brandTarget.secondary)]]? +<<elseif [ + "left ankle", "right ankle", + "left calve", "right calve", + "left ear", "right ear", + "left foot", "right foot", + "left hand", "right hand", + "left lower arm", "right lower arm", + "left penis", "right penis", + "left testicle", "right testicle", + "left thigh", "right thigh", + "left upper arm", "right upper arm", + "left wrist", "right wrist" + ].includes($brandTarget.primary)>> + <br> It's possible that ''$brandTarget.primary'' may be missing from a slave. Choose a fallback in case it is not available: Current backup is ''$brandTarget.secondary'': /* Material copied from bodyModification, but please leave commented out any sections that may not be on ALL slaves. */ /*<<if $activeSlave.earShape != "none">>[[Ears|Universal Rules][$brandTarget.secondary = "ear"]]<</if>>*/ @@ -209,9 +231,9 @@ One 'welcome' for a new slave is to have them branded. Where would you like suc <</if>>*/ | [[Back|Universal Rules][$brandTarget.secondary = "back"]] | [[Lower Back|Universal Rules][$brandTarget.secondary = "lower back"]] - <br> <</if>> +<br> Use ''$brandDesign.primary'' or choose another brand: [[Your slaving emblem|Universal Rules][$brandDesign.primary = "your personal symbol"]] @@ -290,7 +312,113 @@ Use ''$brandDesign.primary'' or choose another brand: | //FS// [[Imperial Seal|Universal Rules][$brandDesign.primary = "your Imperial Seal"]] <</if>> <br> -Or design your own: <<textbox "$brandDesign.primary" $brandDesign.primary "Universal Rules">> //For best results, use a single word// +Or design your own: <<textbox "$scarDesign.primary" $scarDesign.primary "Universal Rules">> //For best results, use a single word// +<br><br> +''Scaring for slaves'' +<br> + +/* Correct some "bad" choices" */ +<<if ["menacing", "exotic"].includes($scarDesign.primary)>> + <<if !["cheek", "left cheek", "right cheek"].includes($scarTarget.primary)>> + <<set $scarTarget.primary = "cheek">> + <</if>> +<</if>> + +One 'welcome' for a new slave is to have them scarred. Where would you like such scars to be applied? +<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.primary)>> + <br> On the + [[left|Universal Rules][$scarTarget.primary = ("left " + $scarTarget.primary)]] + $scarTarget.primary, or the + [[right|Universal Rules][$scarTarget.primary = ("right " + $scarTarget.primary)]]? +<<else>> + <br> Current site is ''$scarTarget.primary'': + [[Ears|Universal Rules][$scarTarget.primary = "ear"]] + | [[Cheeks|Universal Rules][$scarTarget.primary = "cheek"]] + | [[Shoulders|Universal Rules][$scarTarget.primary = "shoulder"]] + | [[Breasts|Universal Rules][$scarTarget.primary = "breast"]] + | [[Arm, upper|Universal Rules][$scarTarget.primary = "upper arm"]] + | [[Arm, lower|Universal Rules][$scarTarget.primary = "lower arm"]] + | [[Wrist|Universal Rules][$scarTarget.primary = "wrist"]] + | [[Hand|Universal Rules][$scarTarget.primary = "hand"]] + | [[Buttocks|Universal Rules][$scarTarget.primary = "buttock"]] + | [[Thigh|Universal Rules][$scarTarget.primary = "thigh"]] + | [[Calf|Universal Rules][$scarTarget.primary = "calve"]] + | [[Ankle|Universal Rules][$scarTarget.primary = "ankle"]] + | [[Feet|Universal Rules][$scarTarget.primary = "foot"]] + | [[Neck|Universal Rules][$scarTarget.primary = "neck"]] + | [[Chest|Universal Rules][$scarTarget.primary = "chest"]] + | [[Belly|Universal Rules][$scarTarget.primary = "belly"]] + | [[Pubic Mound|Universal Rules][$scarTarget.primary = "pubic mound"]] + | [[Penis|Universal Rules][$scarTarget.primary = "penis"]] + | [[Testicles|Universal Rules][$scarTarget.primary = "testicle"]] + | [[Back|Universal Rules][$scarTarget.primary = "back"]] + | [[Lower Back|Universal Rules][$scarTarget.primary = "lower back"]] +<</if>> + +<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.secondary)>> + <br> On the + [[left|Universal Rules][$scarTarget.secondary = ("left " + $scarTarget.secondary)]] + $scarTarget.secondary, or the + [[right|Universal Rules][$scarTarget.secondary = ("right " + $scarTarget.secondary)]]? +<<elseif [ + "left ankle", "right ankle", + "left calve", "right calve", + "left ear", "right ear", + "left foot", "right foot", + "left hand", "right hand", + "left lower arm", "right lower arm", + "left penis", "right penis", + "left testicle", "right testicle", + "left thigh", "right thigh", + "left upper arm", "right upper arm", + "left wrist", "right wrist" + ].includes($scarTarget.primary)>> + <br> It's possible that ''$scarTarget.primary'' may be missing from a slave. Choose a fallback in case it is not available: Current backup is ''$scarTarget.secondary'': + /* Material copied from bodyModification, but please leave commented out any sections that may not be on ALL slaves. */ + + /*<<if $activeSlave.earShape != "none">>[[Ears|Universal Rules][$scarTarget.secondary = "ear"]]<</if>>*/ + | [[Cheeks|Universal Rules][$scarTarget.secondary = "cheek"]] + | [[Shoulders|Universal Rules][$scarTarget.secondary = "shoulder"]] + | [[Breasts|Universal Rules][$scarTarget.secondary = "breast"]] + /*<<if $activeSlave.amp == 0>> + | [[Arm, upper|Universal Rules][$scarTarget.secondary = "upper arm"]] + | [[Arm, lower|Universal Rules][$scarTarget.secondary = "lower arm"]] + | [[Wrist|Universal Rules][$scarTarget.secondary = "wrist"]] + | [[Hand|Universal Rules][$scarTarget.secondary = "hand"]] + <</if>>*/ + | [[Buttocks|Universal Rules][$scarTarget.secondary = "buttock"]] + /*<<if $activeSlave.amp == 0>> + | [[Thigh|Universal Rules][$scarTarget.secondary = "thigh"]] + | [[Calf|Universal Rules][$scarTarget.secondary = "calve"]] + | [[Ankle|Universal Rules][$scarTarget.secondary = "ankle"]] + | [[Feet|Universal Rules][$scarTarget.secondary = "foot"]] + <</if>>*/ + | [[Neck|Universal Rules][$scarTarget.secondary = "neck"]] + | [[Chest|Universal Rules][$scarTarget.secondary = "chest"]] + | [[Belly|Universal Rules][$scarTarget.secondary = "belly"]] + | [[Pubic Mound|Universal Rules][$scarTarget.secondary = "pubic mound"]] + /*<<if $activeSlave.dick > 0>> + | [[Penis|Universal Rules][$scarTarget.secondary = "penis"]] + <</if>>*/ + /*<<if $activeSlave.balls > 0 && $activeSlave.scrotum > 0>> + | [[Testicles|Universal Rules][$scarTarget.secondary = "testicle"]] + <</if>>*/ + | [[Back|Universal Rules][$scarTarget.secondary = "back"]] + | [[Lower Back|Universal Rules][$scarTarget.secondary = "lower back"]] +<</if>> + +<br> + +Use ''$scarDesign.primary'' or choose another scar: +[[Whip|Universal Rules][$scarDesign.local = "whip"]] +| [[Burns|Universal Rules][$scarDesign.local = "burn"]] +| [[Surgical|Universal Rules][$scarDesign.local = "surgical"]] +| [[Menacing|Universal Rules][$scarDesign.local = "menacing"]] +| [[Exotic|Universal Rules][$scarDesign.local = "exotic"]] +/* Other common scars might be battle scars or c-Section but it makes little sense to include them here */ + +<br> +Or design your own: <<textbox "$scarDesign.primary" $scarDesign.primary "Universal Rules">> //For best results, use a single word// <br><br> ''Names for slaves'' diff --git a/src/utility/birthWidgets.tw b/src/utility/birthWidgets.tw index 99bacde48147737c46aa273298d761527ba77bc0..7624b8eeffb75270294ad71fb9247b88c5441524 100644 --- a/src/utility/birthWidgets.tw +++ b/src/utility/birthWidgets.tw @@ -4,7 +4,7 @@ <br> <<if $birthDamage > 5 || $universalRulesCSec == 1>> <<if $universalRulesCSec == 1 || ($slaves[$i].mpreg == 0 && $slaves[$i].vagina < 0)>> - <<set $csec = 1, $slaves[$i].cSec = 1>> + <<set $csec = 1, $slaves[$i].scar["belly"]["c-section"] = 1>> <<if $clinic != 0>> $slaves[$i].slaveName is taken to $clinicName since $he <<if ($slaves[$i].mpreg == 0 && $slaves[$i].vagina < 0)>> @@ -24,9 +24,9 @@ <</if>> <<else>> <<if $clinic != 0>> - $He is lead to $clinicName since $he is likely to face complications with childbirth. $He is helped from $his clothes and into a comfortable hospital bed to relax until $he is ready. $He makes $himself comfortable and begins working on birthing $his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>>, fully aware of $his watching helpers. <<if $birthDamage > 10>><<set $csec = 1, $slaves[$i].cSec = 1>>After several hours of intense labor, $he is transferred to the surgery wing. Following an emergency c-section, $he is returned to the recovery wing to rest<<else>>After several hours, and a touch of morphine, $he has successfully given birth<</if>>. $His child<<if $slaves[$i].pregType > 1>>ren are<<else>> is<</if>> promptly taken and $he is left under observation to make sure $he recovers. + $He is lead to $clinicName since $he is likely to face complications with childbirth. $He is helped from $his clothes and into a comfortable hospital bed to relax until $he is ready. $He makes $himself comfortable and begins working on birthing $his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>>, fully aware of $his watching helpers. <<if $birthDamage > 10>><<set $csec = 1, $slaves[$i].scar["belly"]["c-section"] = 1>>After several hours of intense labor, $he is transferred to the surgery wing. Following an emergency c-section, $he is returned to the recovery wing to rest<<else>>After several hours, and a touch of morphine, $he has successfully given birth<</if>>. $His child<<if $slaves[$i].pregType > 1>>ren are<<else>> is<</if>> promptly taken and $he is left under observation to make sure $he recovers. <<else>> - <<set $csec = 1, $slaves[$i].cSec = 1>> + <<set $csec = 1, $slaves[$i].scar["belly"]["c-section"] = 1>> $He is lead to the autosurgery, since $he is likely to face complications with childbirth. $He is stripped from $his clothes and set up on the operating table. $He is quickly sedated and subjected to a c-section in order to avoid potential problems. The surgery is quick, and $he is moved to a bed to recover. When $he awakes, $his child<<if $slaves[$i].pregType > 1>>ren have<<else>> has<</if>> already been taken away. <</if>> <</if>> @@ -409,9 +409,9 @@ <<if $birthDamage > 5>> <<set $csec = 1>> <<if $clinic != 0>> - $He is carried to $clinicName, since $he is likely to face complications with childbirth. $He is stripped from $his clothes and set up in a comfortable hospital bed to relax until $he is ready. $He wiggles $himself into a comfortable spot and begins working on birthing $his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>>, fully aware of $his watching helpers. <<if $birthDamage > 10>><<set $csec = 1, $slaves[$i].cSec = 1>>After several hours of intense labor, $he is transferred to the surgery wing. Following an emergency c-section, $he is returned to the recovery wing to rest<<else>>After several hours, and a touch of morphine, $he has successfully given birth<</if>>. $His child<<if $slaves[$i].pregType > 1>>ren are<<else>> is<</if>> promptly taken and $he is left under observation to make sure $he recovers. + $He is carried to $clinicName, since $he is likely to face complications with childbirth. $He is stripped from $his clothes and set up in a comfortable hospital bed to relax until $he is ready. $He wiggles $himself into a comfortable spot and begins working on birthing $his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>>, fully aware of $his watching helpers. <<if $birthDamage > 10>><<set $csec = 1, $slaves[$i].scar["belly"]["c-section"] = 1>>After several hours of intense labor, $he is transferred to the surgery wing. Following an emergency c-section, $he is returned to the recovery wing to rest<<else>>After several hours, and a touch of morphine, $he has successfully given birth<</if>>. $His child<<if $slaves[$i].pregType > 1>>ren are<<else>> is<</if>> promptly taken and $he is left under observation to make sure $he recovers. <<else>> - <<set $csec = 1, $slaves[$i].cSec = 1>> + <<set $csec = 1, $slaves[$i].scar["belly"]["c-section"] = 1>> $He is carried to the autosurgery, since $he is likely to face complications with childbirth. $He is stripped from $his clothes and set up on the operating table. $He is quickly sedated and subjected to a c-section in order to avoid potential problems. The surgery is quick and $he is moved to a bed to recover. When $he awakes, $his child<<if $slaves[$i].pregType > 1>>ren have<<else>> has<</if>> already been taking away. <</if>> diff --git a/src/utility/descriptionWidgetsFlesh.tw b/src/utility/descriptionWidgetsFlesh.tw index 3ff35c6e455a6140026344bd8fe14d29374bbc17..8ee62efc68f8be5dcc1e3b59dfcbf03e11a48e83 100644 --- a/src/utility/descriptionWidgetsFlesh.tw +++ b/src/utility/descriptionWidgetsFlesh.tw @@ -3616,8 +3616,8 @@ $He's got a <<if $showBodyMods == 1>> <<dickTatDescription>> <<dickPiercingDescription>> - <<= App.Desc.brand($activeSlave, "penis")>> - <<= App.Desc.brand($activeSlave, "testicle")>> + <<= App.Desc.mods($activeSlave, "penis")>> + <<= App.Desc.mods($activeSlave, "testicle")>> <</if>> <</if>> @@ -4090,7 +4090,7 @@ $He's got a <<if $activeSlave.fuckdoll == 0>> <<if $showBodyMods == 1>> - <<= App.Desc.brand($activeSlave, "pubic mound")>> + <<= App.Desc.mods($activeSlave, "pubic mound")>> <</if>> <</if>> @@ -15414,7 +15414,7 @@ $He has It has a short length of chain dangling from it. <</if>> <</if>> - <<= App.Desc.brand($activeSlave, "belly")>> + <<= App.Desc.mods($activeSlave, "belly")>> <</if>> <<else>> <<if $showBodyMods == 1>> @@ -15433,9 +15433,6 @@ $He has It has a short length of chain dangling from it. <</if>> <</if>> - <<if $activeSlave.cSec == 1>> - $He has an unsightly c-section scar under $his navel. - <</if>> <<if $activeSlave.bellyTat != 0>> <<if $activeSlave.belly >= 300000>> <<if $activeSlave.bellyTat == "a heart">> @@ -15489,7 +15486,7 @@ $He has <<elseif $activeSlave.abortionTat == 0 && $activeSlave.birthsTat == -1 && $activeSlave.pregKnown == 1>> $He has a single baby-shaped temporary tattoo adorning $his stomach. <</if>> - <<= App.Desc.brand($activeSlave, "belly")>> + <<= App.Desc.mods($activeSlave, "belly")>> <</if>> <<if $activeSlave.breedingMark == 1>> <<if $propOutcome == 1>> @@ -18416,10 +18413,6 @@ $His womb contains <<= num(_slaveWD.litters.length)>> separate pregnancies; <</if>> <</if>> - <<if $activeSlave.cSec == 1>> - $He has an unsightly c-section scar under $his navel. - <</if>> - <<if $activeSlave.bellyTat != 0>> <<if $activeSlave.bellyImplant >= 32000>> <<if $activeSlave.bellyTat == "a heart">> @@ -18472,7 +18465,7 @@ $His womb contains <<= num(_slaveWD.litters.length)>> separate pregnancies; <<elseif $activeSlave.abortionTat == 0 && $activeSlave.birthsTat == -1 && $activeSlave.pregKnown == 1>> $He has a single baby-shaped temporary tattoo adorning $his stomach. <</if>> - <<= App.Desc.brand($activeSlave, "belly")>> + <<= App.Desc.mods($activeSlave, "belly")>> <<if $activeSlave.breedingMark == 1>> <<if $propOutcome == 1>> @@ -19519,10 +19512,6 @@ $His womb contains <<= num(_slaveWD.litters.length)>> separate pregnancies; <</if>> <</if>> -<<if $activeSlave.cSec == 1>> - $He has an unsightly c-section scar under $his navel. -<</if>> - <<if $activeSlave.navelPiercing == 1>> $His navel bears a simple stud. <<elseif $activeSlave.navelPiercing == 2>> @@ -19552,7 +19541,7 @@ $His womb contains <<= num(_slaveWD.litters.length)>> separate pregnancies; <</if>> <</if>> -<<= App.Desc.brand($activeSlave, "belly")>> +<<= App.Desc.mods($activeSlave, "belly")>> <<if $activeSlave.breedingMark == 1>> <<if $propOutcome == 1>> diff --git a/src/utility/descriptionWidgetsTattoos.tw b/src/utility/descriptionWidgetsTattoos.tw index 1d4327535c10a6f0ad383cc84231b8a61573a570..3b578fee44000876bf3de45477468793951b6016 100644 --- a/src/utility/descriptionWidgetsTattoos.tw +++ b/src/utility/descriptionWidgetsTattoos.tw @@ -44,7 +44,7 @@ $activeSlave.shouldersTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "shoulder")>> + <<= App.Desc.mods($activeSlave, "shoulder")>> <</if>> <</widget>> @@ -91,7 +91,7 @@ $activeSlave.lipsTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "lips")>> + <<= App.Desc.mods($activeSlave, "lips")>> <</if>> <</widget>> @@ -136,7 +136,7 @@ <</switch>> <</if>> /* App.Desc.boobsBrand handles boobBrands */ - /*<<= App.Desc.brand($activeSlave, "breast")>>*/ + /*<<= App.Desc.mods($activeSlave, "breast")>>*/ <</if>> <</widget>> @@ -224,10 +224,10 @@ $activeSlave.armsTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "upper arm")>> - <<= App.Desc.brand($activeSlave, "lower arm")>> - <<= App.Desc.brand($activeSlave, "hand")>> - <<= App.Desc.brand($activeSlave, "wrist")>> + <<= App.Desc.mods($activeSlave, "upper arm")>> + <<= App.Desc.mods($activeSlave, "lower arm")>> + <<= App.Desc.mods($activeSlave, "hand")>> + <<= App.Desc.mods($activeSlave, "wrist")>> <</if>> <</widget>> @@ -309,7 +309,7 @@ $activeSlave.backTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "back")>> + <<= App.Desc.mods($activeSlave, "back")>> <</if>> <</widget>> @@ -359,7 +359,7 @@ $activeSlave.stampTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "lower back")>> + <<= App.Desc.mods($activeSlave, "lower back")>> <</if>> <</widget>> @@ -424,7 +424,7 @@ $activeSlave.buttTat <</switch>> <</if>> -<<= App.Desc.brand($activeSlave, "buttock")>> +<<= App.Desc.mods($activeSlave, "buttock")>> <</if>> <</widget>> @@ -591,8 +591,8 @@ <</switch>> <</if>> /* Just in case someone makes these someday: */ -<<= App.Desc.brand($activeSlave, "anus")>> -<<= App.Desc.brand($activeSlave, "asshole")>> +<<= App.Desc.mods($activeSlave, "anus")>> +<<= App.Desc.mods($activeSlave, "asshole")>> <</widget>> <<widget "legsTatDescription">> @@ -633,9 +633,9 @@ $activeSlave.legsTat <</switch>> <</if>> - <<= App.Desc.brand($activeSlave, "thigh")>> - <<= App.Desc.brand($activeSlave, "calf")>> - <<= App.Desc.brand($activeSlave, "ankle")>> - <<= App.Desc.brand($activeSlave, "foot")>> + <<= App.Desc.mods($activeSlave, "thigh")>> + <<= App.Desc.mods($activeSlave, "calf")>> + <<= App.Desc.mods($activeSlave, "ankle")>> + <<= App.Desc.mods($activeSlave, "foot")>> <</if>> <</widget>>