diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index faee542935c8facd9df072af85cb6b606466b174..0c90088afa9445e90142d27f5958d7ad10410e53 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -749,7 +749,7 @@ Accepts int ageImplant: -has has facial surgery to reduce age +has had facial surgery to reduce age 0 - no 1 - yes diff --git a/src/SpecialForce/CheatEdit.tw b/src/SpecialForce/CheatEdit.tw index 2abf6d88bba52a9d0182e5b0e21def4624b50cce..b67c351099399d59634fa6ef4b1cd2e367f602b6 100644 --- a/src/SpecialForce/CheatEdit.tw +++ b/src/SpecialForce/CheatEdit.tw @@ -6,14 +6,16 @@ <br>''Armory:'' <<textbox "$SF.Squad.Armoury" $SF.Squad.Armoury "CheatEdit">>/_AU <br>''Drug Lab:'' <<textbox "$SF.Squad.Drugs" $SF.Squad.Drugs "CheatEdit">>/_DrugsU <<if $SF.Squad.Firebase >= 2>> -<br>''Drone Bay:'' <<textbox "$SF.Squad.Drones" $SF.Squad.Drones "CheatEdit">>/_DU<</if>> + <br>''Drone Bay:'' <<textbox "$SF.Squad.Drones" $SF.Squad.Drones "CheatEdit">>/_DU +<</if>> <<if $SF.Squad.Firebase >= 1 && $terrain !== "oceanic">> <br><br>''Garage:'' <br> ''Vehicles:'' <br> ''Attack:'' <<textbox "$SF.Squad.AV" $SF.Squad.AV "CheatEdit">>/_AVU <br> ''Transport:'' <<textbox "$SF.Squad.TV" $SF.Squad.TV "CheatEdit">>/_TVU <<if _T1>> - <br> ''Prototype Goliath Tank:'' <<textbox "$SF.Squad.PGT" $SF.Squad.PGT "CheatEdit">>/_PGTU<</if>> + <br> ''Prototype Goliath Tank:'' <<textbox "$SF.Squad.PGT" $SF.Squad.PGT "CheatEdit">>/_PGTU + <</if>> <</if>> <<if $SF.Squad.Firebase >= 4>> <br><br>''Hangar:'' @@ -21,15 +23,18 @@ <br> ''Attack:'' <<textbox "$SF.Squad.AA" $SF.Squad.AA "CheatEdit">>/_AAU <br> ''Transport:'' <<textbox "$SF.Squad.TA" $SF.Squad.TA "CheatEdit">>/_TAU <<if _T1>> - <br> ''Spaceplane'': <<textbox "$SF.Squad.SpacePlane" $SF.Squad.SpacePlane "CheatEdit">>/_SPU - <br> ''Gunship:'' <<textbox "$SF.Squad.GunS" $SF.Squad.GunS "CheatEdit">>/_GunSU + <br> ''Spaceplane'': <<textbox "$SF.Squad.SpacePlane" $SF.Squad.SpacePlane "CheatEdit">>/_SPU + <br> ''Gunship:'' <<textbox "$SF.Squad.GunS" $SF.Squad.GunS "CheatEdit">>/_GunSU <br><br>''Launch Bay:'' <br> ''Satellite:'' <<textbox "$SF.Squad.Satellite.lv" $SF.Squad.Satellite.lv "CheatEdit">>/_SatU <<if $terrain !== "oceanic">> - <br> ''Giant Robot:'' <<textbox "$SF.Squad.GiantRobot" $SF.Squad.GiantRobot "CheatEdit">>/_GRU<</if>> + <br> ''Giant Robot:'' <<textbox "$SF.Squad.GiantRobot" $SF.Squad.GiantRobot "CheatEdit">>/_GRU + <</if>> <br> ''Cruise Missile:'' <<textbox "$SF.Squad.MissileSilo" $SF.Squad.MissileSilo "CheatEdit">>/_MSU -<<if $terrain === "oceanic" || $terrain === "marine">> <br><br>''Naval Yard:'' - <br> ''Aircraft Carrier:'' <<textbox "$SF.Squad.AircraftCarrier" $SF.Squad.AircraftCarrier "CheatEdit">>/_ACU - <br> ''Submarine:'' <<textbox "$SF.Squad.Sub" $SF.Squad.Sub "CheatEdit">>/_SubU - <br> ''Amphibious Transport:'' <<textbox "$SF.Squad.HAT" $SF.Squad.HAT "CheatEdit">>/_HATU -<</if>><</if>><</if>> \ No newline at end of file + <<if $terrain === "oceanic" || $terrain === "marine">> <br><br>''Naval Yard:'' + <br> ''Aircraft Carrier:'' <<textbox "$SF.Squad.AircraftCarrier" $SF.Squad.AircraftCarrier "CheatEdit">>/_ACU + <br> ''Submarine:'' <<textbox "$SF.Squad.Sub" $SF.Squad.Sub "CheatEdit">>/_SubU + <br> ''Amphibious Transport:'' <<textbox "$SF.Squad.HAT" $SF.Squad.HAT "CheatEdit">>/_HATU + <</if>> + <</if>> +<</if>> \ No newline at end of file diff --git a/src/SpecialForce/NamingColonel.tw b/src/SpecialForce/NamingColonel.tw index 52b824280b3cffab8409299ce37df130246d6260..a6b7a33715803eece6215752456f74d325c7cb8f 100644 --- a/src/SpecialForce/NamingColonel.tw +++ b/src/SpecialForce/NamingColonel.tw @@ -71,7 +71,7 @@ <<if $PC.dick > 0>> then force your cock roughly down her throat while you cum. She swallows as much as she can before pulling <<else>> - tightly with your thighs, pressing her face tightly against your pussy as you cum. When you release her, she pulls + tightly with your thighs, pressing her face tightly against your pussy as you cum. When you release her, she pulls <</if>> away, coughing. <br><br> @@ -116,6 +116,6 @@ <<if $mercenaries > 1>> Either way, I'll keep my hands off those mercs you've already installed. I figure that you've reasons for having two different death squads under contract. <</if>> - <br><br>Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arco owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like. + <br><br>Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arc owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like. <br><br>Talk to you later, boss.// <</if>> \ No newline at end of file diff --git a/src/SpecialForce/Proposal.tw b/src/SpecialForce/Proposal.tw index 7bdc653e619f71f97fa00086844ad1e357fbc7d0..72ca2c8bb32f7ad3d7694ec5aa4d74a9951ab7cb 100644 --- a/src/SpecialForce/Proposal.tw +++ b/src/SpecialForce/Proposal.tw @@ -20,7 +20,7 @@ <<set _price *= .75>> <</if>> <br><<link "Prepare for an announcement." "Security Force Naming-Colonel">> - <<replace "#result">> + <<replace "#result">> <<= App.SF.Init()>> <<set $SF.IntroProgress = -1>> <<run cashX(forceNeg(_price), "specialForces")>> @@ -30,5 +30,5 @@ <<replace "#result">> <<set $SF.Active = 0>> <</replace>> - <</link>> + <</link>> </span> \ No newline at end of file diff --git a/src/SpecialForce/SpecialForce.js b/src/SpecialForce/SpecialForce.js index 3b5cfcc48d636d7cd41eca3b65edfccda56b091c..ee3e6c6540e24fa721f3da5119bc17d889fa2513 100644 --- a/src/SpecialForce/SpecialForce.js +++ b/src/SpecialForce/SpecialForce.js @@ -15,8 +15,7 @@ App.SF.Init = function() { V.SF.Regs = V.SF.Regs || "strict"; V.SF.Caps = V.SF.Caps || "The Special Force"; V.SF.Lower = V.SF.Lower || "the special force"; - App.SF.AAR(0); - + if (V.SF.Squad === undefined) V.SF.Squad = {}; V.SF.Squad.Troops = V.SF.Squad.Troops || 40; V.SF.Squad.Armoury = V.SF.Squad.Armoury || 0; @@ -56,7 +55,7 @@ App.SF.Init = function() { V.SF.MercCon.TotalMercs = V.SF.MercCon.TotalMercs || 0; V.SF.FS.Tension = V.SF.FS.Tension || -1; - + App.SF.AAR(0); // V.arcologies[0].SFRaid = 1; V.arcologies[0].SFRaidTarget = -1; /* if (typeof V.SF.Facility === "undefined") { V.SF.Facility = { @@ -844,10 +843,10 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nEvery vehicle crew leader in the Firebase is an Elite, and is thus privy to the contents of these strategy meetings. As such, every vehicle crew has a great deal of power in determining their own armor kits and loadouts to best fit the tactics used for their next mission. Every crewman is handpicked, and every single vehicle unit is unique, with the only similarity being the common ground vehicle chassis types between them. Your tanker crews have been known to snatch victory from the jaws of defeat with the help of their unique and unpredictable individuality and unconventional unit compositions throughout their careers in your armor units. Inspired of these glorious service records, their offspring often choose to become vehicle crewmen themselves.\n`; } if (textDisplay === 70 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nThe hangar is a cavernous place, and when takeoffs and landings are not in progress there are many open spaces for gangs of ambitious air force understudies to gather around veterans and teachers and learn more about their craft, as well as lots of places to simply kick back with a good book and await the next summons for a CASEVAC, air assault, or assault support flight mission. At any given time, these open spaces are in heavy use by the the airmen and airwomen who are not busy at work here. The longest wall of the hangar is also host to a massive and beautiful mural altogether depicting all of the renowned aces and flight instructors the Firebase has known throughout its history thus far. While artful, this mural also holds the promise that through this multitude of Elite personnel, the hangar should always have a rich pool of skillful pilots and maintenance personnel for the good of the service.\n`; + text += `\nThe hangar is a cavernous place, and when takeoffs and landings are not in progress there are many open spaces for gangs of ambitious air force understudies to gather around veterans and teachers and learn more about their craft, as well as lots of places to simply kick back with a good book and await the next summons for a CASEVAC, air assault, or assault support flight mission. At any given time, these open spaces are in heavy use by the airmen and airwomen who are not busy at work here. The longest wall of the hangar is also host to a massive and beautiful mural altogether depicting all of the renowned aces and flight instructors the Firebase has known throughout its history thus far. While artful, this mural also holds the promise that through this multitude of Elite personnel, the hangar should always have a rich pool of skillful pilots and maintenance personnel for the good of the service.\n`; } if (textDisplay === 75 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nWithin the numerous transport aircraft of the hangar, a unique change can be found; since greater human quality is a focus and priority of the Firebase, the seating for passengers has has been completely replaced by rows of specialized transport pods; every passenger now has a life-support enabled, environmentally-sealed, shock-absorbent, blast-resistant, and fireproof individual pod to climb into and remain inside of until their aircraft arrives at their intended destination. These pods are welded into the interiors of every passenger section, leading to an extreme degree of passenger survivability, even when crashed or shot down by enemy fire, but at the cost of smaller troop payloads once the transport aircraft touch down. While it currently is uncomfortable for the troops, once the proud few, specially bred and registered children of the current generation of Firebase troops grow up and seek to follow in their parent's footsteps, these advanced 'seating' arrangements will be downright necessary to protect the lives of the Firebase's greatest and scarcest asset; it's Elite fighting personnel.\n`; + text += `\nWithin the numerous transport aircraft of the hangar, a unique change can be found; since greater human quality is a focus and priority of the Firebase, the seating for passengers has been completely replaced by rows of specialized transport pods; every passenger now has a life-support enabled, environmentally-sealed, shock-absorbent, blast-resistant, and fireproof individual pod to climb into and remain inside of until their aircraft arrives at their intended destination. These pods are welded into the interiors of every passenger section, leading to an extreme degree of passenger survivability, even when crashed or shot down by enemy fire, but at the cost of smaller troop payloads once the transport aircraft touch down. While it currently is uncomfortable for the troops, once the proud few, specially bred and registered children of the current generation of Firebase troops grow up and seek to follow in their parent's footsteps, these advanced 'seating' arrangements will be downright necessary to protect the lives of the Firebase's greatest and scarcest asset; it's Elite fighting personnel.\n`; } if (textDisplay === 80 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nNear the barracks, the residents of the Firebase are grateful to have the aid of the Aristocracy Academy. This impressively large and well-equipped facility is staffed with Elites from all over the arcology, and these impeccable men and women carry out all the services needed to help this place function as a part-time 'Finishing School' for all members of the Firebase; the curriculum specializes in training unkempt soldiers and staff to become proper ladies and gentlemen; how to dress, speak, behave, dance, and handle a wide variety of decidedly civilian scenarios in the classiest manner possible.\n`; @@ -965,7 +964,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nOn the longest wall of the garage is a cartoonish motion picture illustration depicting quite a lovely, lavish scene; every fighting vehicle used in the Firebase is depicted as being on parade, streaming past the arcology in precise rows of vehicles that form an endless tide of disciplined armor units obviously on their way to their next victory. Flanking the armor columns are a long crowd of women throwing colorful flowers of all kinds\n`; } if (textDisplay === 65 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nYour crewmen feel very attached to the vehicles they have been given charge of, as as such every single vehicle is the garage has a feminine name and is affectionately regarded as 'female'. To celebrate this, every vehicle hull has been decorated with a beautiful high-resolution pin-up illustration of a unique, sexy, sassy, scantily-clad lady with her name (and thus that vehicle's name) drawn right next to her.\n`; + text += `\nYour crewmen feel very attached to the vehicles they have been given charge of, and as such every single vehicle is the garage has a feminine name and is affectionately regarded as 'female'. To celebrate this, every vehicle hull has been decorated with a beautiful high-resolution pin-up illustration of a unique, sexy, sassy, scantily-clad lady with her name (and thus that vehicle's name) drawn right next to her.\n`; } if (textDisplay === 70 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nWith its high-ceiling and many light fixtures, the hangar is distinctive in its appearance and function; the conventional overhead lighting has been replaced with elegant chandelier lighting that makes the work stations below perpetually look like tables at a classy gala. And in a way, they are. Well-stocked juice bars occupy the hangar's busier corners, while the bathroom's many stalls are kept spotless by a well-staffed janitorial outfit. An inviting but expensive deli-grocery shop and adjacent ATM machine lie near the entrance too, their clean presentation almost beckoning to the staff and pilots of the hangar to enter.\n`; @@ -1027,7 +1026,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nIt is worth noting that the garage has taken on many characteristics of a sandy beach, harkening back to the amphibious landings of times both past and present. The entire garage floor is covered in a thick blanket of sand, complete with small sand dunes, patches of marram grass, rocky outcroppings, an enormous overhead fluorescent light fixture to mimic the sun, and even an artificial breeze from powerful new air filtration systems. Work stations are protectively sectioned off with hand-crafted wooden palisades, and vehicles are tended to on raised wooden platforms meant to help keep the sand out of the machinery. Meanwhile tiny communities of crabs, lobsters, frogs, and other natural amphibians gravitate towards the small refillable pool installed next to the far wall of the building.\n`; } if (textDisplay === 65 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nWithin the garage, extreme attention to detail is paid to the subject of camouflage. Every ground vehicle is camouflaged extremely well, with a hefty reserve supply of custom handmade and semi-adhesive frost, mud, foliage, rubble, and many other forms of concealment kept on stock at all times to tailor the appearance of each vehicle precisely to the mission. The staff of the the garage are some of the best vehicle camouflage outfitters in the world, and your ground vehicles are often not spotted by enemy combatants until it is far too late.\n`; + text += `\nWithin the garage, extreme attention to detail is paid to the subject of camouflage. Every ground vehicle is camouflaged extremely well, with a hefty reserve supply of custom handmade and semi-adhesive frost, mud, foliage, rubble, and many other forms of concealment kept on stock at all times to tailor the appearance of each vehicle precisely to the mission. The staff of the garage are some of the best vehicle camouflage outfitters in the world, and your ground vehicles are often not spotted by enemy combatants until it is far too late.\n`; } if (textDisplay === 70 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe floor of the hangar is a thick bed of rich, moist brown soil, complete with its own grass patches, stone footpaths, and flowerbeds. It is a lively place, and spaces that are not filled with clean and filtered air are rather filled with the smell of burning hemp and soft melodic music. The hangar's breakroom has become a yoga room, complete with hired instructors, and the various workstations often feature little potted plants that have been given pet names by the staff. Moss and vines are covering many of the walls in the hangar, with overgrowth being regularly pruned by on-slaves when there are no other duties to perform. The same can be said for the weeds that frequently crop up throughout the facility.\n`; @@ -1446,7 +1445,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nCushioned couches, lounge chairs, and futons lie all around the armory, and on every last one of them lies a debriefed soldier sleeping off their last deployment with the help of some opium. Most of them haven't even bothered to change out of their fatigues, and many have their weapons and body armor strewn carelessly on the floor beside them. Further still, a few have their pants pulled down to their ankles, whilst an intoxicated slave-whore lazily rides them. Heavy smoke fills the air, and adjacent to the central quartermaster's booth is a tidy fast food bar where shots of soft drinks, small plates of fried foods, and tiny condiments are always in quick supply for those that the time to spare.\n`; } if (textDisplay === 40 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nThere are are drug platters, snack bowls, and punch bowls for every battle station of the command center. During combat maneuvers the staff here are especially ravenous, chugging down large amounts of substance while they send messages that carry power over life and death. The pressure to succeed and secure victory is high, and in order to cope, the staff consume.\n`; + text += `\nThere are drug platters, snack bowls, and punch bowls for every battle station of the command center. During combat maneuvers the staff here are especially ravenous, chugging down large amounts of substance while they send messages that carry power over life and death. The pressure to succeed and secure victory is high, and in order to cope, the staff consume.\n`; } if (textDisplay === 45 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe distribution point of the drug laboratory is an eerie place, with a very thick white mist for soldiers to stroll through on their way to the drug selection buffet. The mist is so dense and rich that many soldiers report feeling either high or buzzed after just a few minutes inside of it.\n`; @@ -1499,7 +1498,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nSex toys, and a generous supply of snack bars, porn magazines, and electric cigarettes are issued to every cage inmate upon internment. The captives are free to relieve their anxieties at any time, and are encouraged to do so.\n`; } if (textDisplay === 25 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nThe smell of milk has slowly spread throughout the Firebase, especially in the vicinity of the open-air ranch on the northern outskirts of the common area. This place supplies most of the milk used in preparing Firebase meals. Here, dozens of diverse, prized slave-cows are lined up on adjustable milk racks and serviced by cheerful, seasoned farmers from around the arcology. Visiting soldiers are rewarded for hand-milking the cows themselves, with both a bottle of the free warm milk (or cum) they just squoze out and with permission to fuck a choice cow in any position they desire. It's a good deal, and this place is frequented quite a bit by men who like milky tits and women who like the huge bull-dicks.\n`; + text += `\nThe smell of milk has slowly spread throughout the Firebase, especially in the vicinity of the open-air ranch on the northern outskirts of the common area. This place supplies most of the milk used in preparing Firebase meals. Here, dozens of diverse, prized slave-cows are lined up on adjustable milk racks and serviced by cheerful, seasoned farmers from around the arcology. Visiting soldiers are rewarded for hand-milking the cows themselves, with both a bottle of the free warm milk (or cum) they just squeezed out and with permission to fuck a choice cow in any position they desire. It's a good deal, and this place is frequented quite a bit by men who like milky tits and women who like the huge bull-dicks.\n`; } if (textDisplay === 30 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nTroop bedding is clearly separated by drawn boundaries on the ground every 50 bunks, and for good reason: For every 50 troops, there is a designated slave cow assigned to service them and only them. During mornings and evenings, these cows wander along their assigned bunks to attend to the physical needs of their soldiers, be those needs sexual or nutritional.\n`; @@ -1523,7 +1522,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nThe garage resembles a large farm's toolshed, only this toolshed is very big, and it definitely has more than one tractor. Most of the walls of the garage have been covered with decorative wooden planks to resemble the walls of a barn, as have most of its tables and counterspaces. Duty stations have been separated by imperfect high wooden gates and fences as well, to give the impression of having 'stables' for the various vehicle 'steeds' around as well. Naturally, there are a few cows tied down to some of the workstations, next to wooden tables stacked with cups. After all what hardworking mechanics doesn't want a sweet warm glass of milk after completing a job well done?\n`; } if (textDisplay === 65 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nTo their good credit, the mechanics have also managed to affix compact chilled human milk dispensers to the interiors of the ground vehicles too. The seating for pilots have been reupholstered with tanned hide materials upon request, many of the the interiors have been repainted with farmland or bovine designs, and even the floors have been given a light blanket of straw covering.\n`; + text += `\nTo their good credit, the mechanics have also managed to affix compact chilled human milk dispensers to the interiors of the ground vehicles too. The seating for pilots have been reupholstered with tanned hide materials upon request, many of the interiors have been repainted with farmland or bovine designs, and even the floors have been given a light blanket of straw covering.\n`; } if (textDisplay === 70 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe hangar's appearance is somewhat reminiscent of that of improvised rural airfields of the sort found in farmland countrysides all over the world; tall rows of crops and ploughed fields of dirt now surround or flank the runways and landing pads of the hangar, while the walls themselves are mostly covered in an active illustration wallpaper that depicts the outdoor sky in colors that change to reflect the actual time of day.\n`; @@ -1656,10 +1655,10 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nUnbeknownst to the variety of non-hostile actors that your aircraft must pass overhead in order to reach their next mission, your selected personal favorite quotes, books & articles excerpts, and works of art taken from your multiculturalist collection are diligently inscribed onto every inch the interior of the aircrafts' cockpits and passenger sections, where vehicle occupants can see them and have their resolve and conviction bolstered by them before and after battle. The ceilings of each aircraft's interior must be scrubbed clean of soot every week as well, since thick and tall imported wax candles are burnt inside of the aircraft interiors during all hours of aircraft operation in remembrance of every pilot and passenger that has died while operating from that aircraft.\n`; } if (textDisplay === 80 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nA grand supermarket now occupies the prime area behind the common area. The familiar architecture of the structure, combined with the highly prolific paint scheme and globalized interior decoration, makes the building itself acheive a certain rapport with all who enter. The layout of the building is complex, with sections for buying international delicacy foods, rows of racks for shoppers to buy rare and specialized tools and trinkets, and platforms for customers to browse all manner of Free Cities and Old World apparels, luxury cars, exotic pets, and many other amusements. It is also a place of great finds; highly coveted niche publications and artworks are on offer in the less frequented corners, and huge high resolution wallscreens adorn the walls and ceilings as they illustrate the newest products and clearance sales on offer. Everyday, upbeat music and audio adverts can be heard from within the building, inviting all to come and partake of the fun within. There is no doubt that this place serves as the centerpiece to the Firebase's materialistic culture.\n`; + text += `\nA grand supermarket now occupies the prime area behind the common area. The familiar architecture of the structure, combined with the highly prolific paint scheme and globalized interior decoration, makes the building itself achieve a certain rapport with all who enter. The layout of the building is complex, with sections for buying international delicacy foods, rows of racks for shoppers to buy rare and specialized tools and trinkets, and platforms for customers to browse all manner of Free Cities and Old World apparels, luxury cars, exotic pets, and many other amusements. It is also a place of great finds; highly coveted niche publications and artworks are on offer in the less frequented corners, and huge high resolution wallscreens adorn the walls and ceilings as they illustrate the newest products and clearance sales on offer. Everyday, upbeat music and audio adverts can be heard from within the building, inviting all to come and partake of the fun within. There is no doubt that this place serves as the centerpiece to the Firebase's materialistic culture.\n`; } if (textDisplay === 85 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nA carefully paved world-class swimming pool occupies the exterior of the Firebase, with an intergrated water heater, several water slides, and even a built-in waterfall. The pool and its surrounding platform plays host to the regular pool parties and swimming competitions that are open to all soldiers and staff that have some free time. Laughter can frequently be heard from the swimwear-clad partygoers as they hang out and socialize here.\n`; + text += `\nA carefully paved world-class swimming pool occupies the exterior of the Firebase, with an integrated water heater, several water slides, and even a built-in waterfall. The pool and its surrounding platform plays host to the regular pool parties and swimming competitions that are open to all soldiers and staff that have some free time. Laughter can frequently be heard from the swimwear-clad partygoers as they hang out and socialize here.\n`; } if (textDisplay === 90 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nLenghty, good-spirited debates and competitions have become regular activities in the Firebase, and that is to be expected. Your exciting, inclusive tolerant, and artistic multiculture fills a void within your warriors that killing, drugging, and whoring do not. For many it provides new outlooks on life, for those that delve deep enough, it provides novel reams of worldly wisdom. Rather than take up space in cemeteries, the bodies of your fallen are promptly cremated to make more room for the living. Every week, ceremonies are held in honor of Life itself. Sanctioned protocols for properly interacting with non-hostile civilians, soldiers, and slaves from foreign countries and arcologies are taught consistently throughout basic training alongside the conventional curricula, which has so far worked well in avoiding faux pas that could have lead to needless conflict with members of other cultures. Soldiers and staff can be heard humming internationally-popular songs or quietly chanting military cadences as they clean weapons and tools, get dressed, move about, and perform many other typical tasks, including fucking. Quite a few officers and NCO's double as language teachers too, and trained interpreters are a coveted addition to any platoon that doesn't already have one. It is common for deployed troops to exchange gifts with one another before mounting up and heading for battle, and as you see a fully kitted infantry section huddled around an ornate tree right now, you are confident that the globalization effort has succeeded.\n`; @@ -1670,7 +1669,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) break; case 'Slimness_Enthusiasm': if (textDisplay === -1 && V.SF.FS[FS_OPTIONS[i]].gift > 0) { - text += `\nIn celebration of Slimness Enthusiasm, you've gifted the Colonel with her very own fleet of small single-seater reconnaissance buggies, all made from extremely lightweight-yet-durable alloys, and precisely engineered miniature nuclear reactors meant to allow each vehicle in the fleet to achieve obscene speeds in the field in all terrains. They even come with roof hardpoint mounts for mounting light remote-operated weapons. Thanks to their stellar support systems they also ensure driver safety and orientation during use, reliably absorbing and redistributing the energy received from the the multitude of shocks, bounces, g-forces, jolts, jumps, and other maneuverability hiccups that would make these vehicles impossible to handle without them. All that being said, they are very fun to drive and eventually master. Also, their extreme mobility, tiny target profiles, quiet engines, and ease of camouflage all make them excellent recon vehicles for the Colonel and her friends to use for races, scouting missions, and raids whenever things in the Firebase get too boring.\n`; + text += `\nIn celebration of Slimness Enthusiasm, you've gifted the Colonel with her very own fleet of small single-seater reconnaissance buggies, all made from extremely lightweight-yet-durable alloys, and precisely engineered miniature nuclear reactors meant to allow each vehicle in the fleet to achieve obscene speeds in the field in all terrains. They even come with roof hardpoint mounts for mounting light remote-operated weapons. Thanks to their stellar support systems they also ensure driver safety and orientation during use, reliably absorbing and redistributing the energy received from the multitude of shocks, bounces, g-forces, jolts, jumps, and other maneuverability hiccups that would make these vehicles impossible to handle without them. All that being said, they are very fun to drive and eventually master. Also, their extreme mobility, tiny target profiles, quiet engines, and ease of camouflage all make them excellent recon vehicles for the Colonel and her friends to use for races, scouting missions, and raids whenever things in the Firebase get too boring.\n`; } if (textDisplay === 5 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe meals are prepared and presented as low-calorie or even calorie-free, stripping fatty content wherever possible. Smaller portions and slices than market standard are not uncommon either.\n`; @@ -1756,7 +1755,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nThe men and women of the Firebase are always encouraged to expand upon their weaponry, and for most, the armory is the place to do exactly that. In the center of the armory lies a massive table that hosts a dizzying and splendid assortment of magnetic picatinny rails, huge under-barrel shotguns or grenade launchers, tritium iron sights, broad and adjustable laser sights, large zoomable scopes, collapsible tactical bipods and tripods, extended or reinforced gun barrels, adjustable stocks, extended magazines, massive drum magazines, terrifyingly large bayonets and combat knives, bulky grenades with extra fragmentation effects, and so on, and so forth. Troops are encouraged to pile as many attachments and accessories onto their weapons as practically possible, and by the time they are done, you could swear that their weapons are almost as big as they are.\n`; } if (textDisplay === 40 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nBattlestations within the command center are twice as tall as they were before, due to the implementation of universal equipment redundancies. Every wall-mounted machine, holographic operations table, computer console, digital archive, and backup hard drive has been bolstered with the existence of new identical back up copies, ensuring that no data is lost should some terrible accident, physical attack, or cyber breach occur. These backups have been been stacked vertically to avoid taking up precious floorspace.\n`; + text += `\nBattlestations within the command center are twice as tall as they were before, due to the implementation of universal equipment redundancies. Every wall-mounted machine, holographic operations table, computer console, digital archive, and backup hard drive has been bolstered with the existence of new identical back up copies, ensuring that no data is lost should some terrible accident, physical attack, or cyber breach occur. These backups have been stacked vertically to avoid taking up precious floorspace.\n`; } if (textDisplay === 45 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe drug lab facility has a built-up topless bar extension where off duty personnel can come and drink themselves silly. All manner of typical bar snacks and games can be found, with darts, beer pong, and other games of marksmanship being particularly popular. Of course, the men will sometimes tire of these games and decide to play with one of the numerous big-tittied barmaids instead. Spicing up the festivities is the abundance of newfangled trial drugs freely given to those who come, since your chemical engineers are happy to let bar patrons be their second test population for the effects of their newer substances. After each event, lots of empty syringes and spilt beer alike can be seen all over the floors.\n`; @@ -1833,7 +1832,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nThe garage, also known as the Stabula Machinis, is filled with noise of mechanicuses performing check-ups, upgrades, and repairs on your vehicles, making sure that Roman engineering is still the best in the world.\n`; } if (textDisplay === 65 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nParticular vehicles within the garage have been painted and modified to look more like quadrigas of old, with four horse heads and intricate reliefs of weels.\n`; + text += `\nParticular vehicles within the garage have been painted and modified to look more like quadrigas of old, with four horse heads and intricate reliefs of wheels.\n`; } if (textDisplay === 70 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nThe hangar, also known as the Aer Navale, is filled with noise of mechanicuses performing check-ups, upgrades, and repairs on your aircraft, while the stalwart nauta caeli prepare for their next flight to ensure your dominance.\n`; @@ -1945,7 +1944,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nThe command center is monumental, adorned with hieroglyphs and depictions of the Gods and great battles in the history of Kemet, and hieroglyphic wall inscriptions praising loyalty to the Pharaoh and glorifying him.\n`; } if (textDisplay === 45 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nMeanwhile, the local Temple of Imhotep srves as a place of healing and enhancement, where miracles of cutting-edge modern medicine as well as more traditional cures are available for your nakhtu-aa.\n`; + text += `\nMeanwhile, the local Temple of Imhotep serves as a place of healing and enhancement, where miracles of cutting-edge modern medicine as well as more traditional cures are available for your nakhtu-aa.\n`; } if (textDisplay === 50 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nElaborate jewelry, luxurious tunics, wigs, and even burning perfume cones have become popular fashion trends for off-duty personnel to wear in between missions.\n`; @@ -2158,7 +2157,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) text += `\nOutside the Firebase gates, a majestic walled perimeter has been carefully erected so as to make the outside grounds of the Firebase more closely resemble the Forbidden City; a broad garden of bright yellow chrysanthemums, a heavily reinforced stone roadway with accompanying stone footpaths, finely sanded wooden benches and fences, and brightly colored walls and gates greet any who would presume to enter or exit the Firebase domain... Besides you, of course.\n`; } if (textDisplay === 90 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { - text += `\nYour soldiers put in effort carry themselves in a manner befitting such a communal setting; they are cooperative, diligent, and disciplined at all times. They identify first and formost as warriors of 'the emperor', and are proud to have a powerful empire such as your arcology to call home and fight for. In their personal dealings, they do their best to handle most affairs using the esteemed Mandarin dialect, and they avoid unseemly things like disloyalty, foolishness, and dishonor like the plagues that they are. These are true Imperial men and women, and they will relentlessly carry your society into the future as they fight to impress your name upon both Heaven and Earth themselves.\n`; + text += `\nYour soldiers put in effort carry themselves in a manner befitting such a communal setting; they are cooperative, diligent, and disciplined at all times. They identify first and foremost as warriors of 'the emperor', and are proud to have a powerful empire such as your arcology to call home and fight for. In their personal dealings, they do their best to handle most affairs using the esteemed Mandarin dialect, and they avoid unseemly things like disloyalty, foolishness, and dishonor like the plagues that they are. These are true Imperial men and women, and they will relentlessly carry your society into the future as they fight to impress your name upon both Heaven and Earth themselves.\n`; } if (textDisplay === 100 && V.SF.FS[FS_OPTIONS[i]].lv >= textDisplay) { text += `\nChinese Revivalism: Sometimes when The Colonel is relaxing or just making her rounds in the Firebase, you'll see her wearing a long qipao cut high along the sides for ease of movement. She is known to prefer going commando, and the slits sometimes part to tease what's underneath for anyone watching her. She keeps a number of intelligent eunuchs in her company often, and they usually scurry along behind her to record everything that she says and does for later review. Her pavilion is lavishly furnished and concubines wait on her hand and foot when she rests. Her combat battledress now features lacquered armor and a golden burnished helm signifying her position as leader.\n`; @@ -2227,7 +2226,7 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) r += `Finally weary of your constant intrusions into her territory and crew, The Colonel gathers up her people for a full scale liquidation and dispersal of personnel and assets throughout the Free City itself; they are going to discreetly sell off the majority of their military hardware, assume new identities and melt into the fabric of the Free City's wider population. Gone are the days of plunder and dominion, as this retirement plan will make many of them some of the wealthiest tenants in the entire Free City, and they will no longer need to break their backs living the lives of soldiers. With the liquidation complete and the money distributed, the army moves on to the net stage of the plan.`; r += `\nAt midnight, the lights are the first thing the Colonel's forces disable, as they still have the excellent night vision equipment you purchased for them. Some of your citizens panic almost immediately at the sudden blackout; this is very reminiscent of the Daughters of Liberty attack that still haunts many of their memories. Her army moves fast and quietly throughout the arcology and the streets outside of it, slipping through your security units and drones with an ease that stinks of months of careful planning and study. Most disturbingly, your penthouse's communications networks are all but destroyed, and your PA has been unreachable, seemingly hacked by some obscure technology you figure only the Colonel's contacts and few others could provide.`; r += `\nOutside, her many aircraft escape the local airspace to patrol the Arcology outskirts, evading recon scans, the monitoring systems of your secured penthouse, and the feeble attempts of your sentries to shoot them down. A great many of them will be escaping by air, it seems. Many are escaping by land too: Swarms of personnel carriers and utility trucks are driving off to neighboring arcologies or even neighboring Free Cities by the dozens for retirement, as the remainder of her army purchase new apartments and properties in various arcologies nearby while being dressed in civilian clothing. After just a few days, the entire army has essentially disappeared, hopelessly obscured by mountains of digital noise, detailed fake backstories, lavish fake identities, and lots of bribes and carefully destroyed digital and physical records. Your special force has gone completely AWOL and there is nothing you or anyone can do about it. It seems your experienced former warriors have a eye for deception too.`; - r += `\nYou are trapped inside your Penthouse by the electricity-cutting digital virus that has kept you inside and communicatively isolated for the past week. Probably with the goal of keeping you in the dark, figuratively and literally, so that you could not intervene in the The Colonel's total assimilation into the Free Cities. The lazy bitch did not want to cooperate with your Future Societies plans, so she and her men decided to stop being soldiers altogether, and live off of their savings. Your only relief comes at the midnight of the seventh day, when the virus self-terminates and the arcology's electricity, PA, and communications lines return to full functioning.`; + r += `\nYou are trapped inside your Penthouse by the electricity-cutting digital virus that has kept you inside and communicatively isolated for the past week. Probably with the goal of keeping you in the dark, figuratively and literally, so that you could not intervene in The Colonel's total assimilation into the Free Cities. The lazy bitch did not want to cooperate with your Future Societies plans, so she and her men decided to stop being soldiers altogether, and live off of their savings. Your only relief comes at the midnight of the seventh day, when the virus self-terminates and the arcology's electricity, PA, and communications lines return to full functioning.`; r += `\nYour arcology is once more yours, but your people will never forget the troubling week they spent in total darkness and lockdown, or the sudden mass desertion and disappearance of the army that you convinced them to allow, or the fact that there was nothing you could do to prevent or mitigate any of it.`; break; case "Shell-Shocked": @@ -2260,13 +2259,13 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100, text = `\n`) App.SF.AAR = function(endWeekCall = 1) { const V = State.variables, T = State.temporary, - S = V.SF.Squad; - const target = 50000, + S = V.SF.Squad, + target = 50000, baseLine = 5000; let profit = 0, upkeep = 0, - income = 0; - let r = ``; + income = 0, + r = ``; if (V.SF.FS.Tension > 100 && endWeekCall > 0) { if (V.SF.FS.BadOutcome === undefined) { App.SF.fsIntegration('BadOutcome'); @@ -2980,7 +2979,7 @@ App.SF.UnitText = function(input) { turret = ``; let B = `has been recommissioned for use by ${V.SF.Lower}. They`; - let C = `, mechanics are giving the new purchases a final tuneup`; + let C = `, mechanics are giving the new purchases a final tune-up`; let squad = `a squad`, G1 = `20`, G2 = `in a firefight`; diff --git a/src/SpecialForce/WeeklyChoices.tw b/src/SpecialForce/WeeklyChoices.tw index 4ebdc86b41004fdbd2bbe9adcd51e67a8c0fd547..6456bc9a421ca7d1047b54412a48b8d5d9ab888e 100644 --- a/src/SpecialForce/WeeklyChoices.tw +++ b/src/SpecialForce/WeeklyChoices.tw @@ -92,7 +92,7 @@ pastoralist shop, helping the Colonel select a more comfortable breast pump. <<else>> shop that catches the Colonel's eye. - <</if>> + <</if>> <<if $PC.slaving >= 100 && $PC.career == "slaver">> Your mastery and extensive history of slaving allows you to assist the Colonel greatly. The shop owner is so impressed by your understanding of slavery that she asks you for some advice. Before you leave, you manage to pass on a few tips, helping the business with future customers. <<if $arcologies[0].prosperity < $AProsperityCap>> <<set $arcologies[0].prosperity++>> <</if>> diff --git a/src/js/assayJS.js b/src/js/assayJS.js index 7a26ca5908602c535dbc6f6f8bf1a7ffe3b24231..b7f0d4604806cf45ab29a2589628c16f08288d81 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -119,6 +119,11 @@ window.newSlave = function newSlave(slave) { slave.override_Eye_Color = 0; /* eslint-enable camelcase */ + // too tall to be a dwarf catch for event slaves + if (slave.geneticQuirks.dwarfism === 2 && slave.geneticQuirks.gigantism !== 2 && slave.height > 165) { + slave.geneticQuirks.dwarfism = 1; + } + if (V.surnamesForbidden === 1) { slave.slaveSurname = 0; } diff --git a/src/js/assignJS.js b/src/js/assignJS.js index e36c6b3e5bff089e0e223d6fb82c2bf6f6c0c651..5062946543e1038306b3abb3a9de40552a59ecee 100644 --- a/src/js/assignJS.js +++ b/src/js/assignJS.js @@ -574,7 +574,7 @@ App.UI.jobLinks = function() { /** * Generates assignment links - * @param {number} index index in the slaves array or -1 for the activeSlave + * @param {number} index in the slaves array or -1 for the activeSlave * @param {string} [passage] optional next passage to go to * @param {linkCallback} [callback] * @returns {string} diff --git a/src/js/generateGenetics.js b/src/js/generateGenetics.js index 680a818a62aee0ac989f789320af5920699a8b00..3dd348dcba655cca05aed98a5ddda0755b22d28c 100644 --- a/src/js/generateGenetics.js +++ b/src/js/generateGenetics.js @@ -872,6 +872,56 @@ window.generateGenetics = (function() { } else if (mother.geneticQuirks.uFace === 2) { quirks.uFace = 1; } + + // gigantism + if (father !== 0) { + if (mother.geneticQuirks.gigantism === 2 && father.geneticQuirks.gigantism === 2) { + quirks.gigantism = 2; + } else if (mother.geneticQuirks.gigantism + father.geneticQuirks.gigantism >= 3) { + chance = jsRandom(1, 4); + if (chance >= 3) { + quirks.gigantism = 2; + } else if (chance !== 1) { + quirks.gigantism = 1; + } + } else if (mother.geneticQuirks.gigantism === 1 && father.geneticQuirks.gigantism === 1) { + if (jsRandom(1, 4) === 1) { + quirks.gigantism = 2; + } + } + } else if (mother.geneticQuirks.gigantism === 2) { + chance = jsRandom(1, 4); + if (chance >= 3) { + quirks.gigantism = 2; + } else if (chance !== 1) { + quirks.gigantism = 1; + } + } + + // dwarfism + if (father !== 0) { + if (mother.geneticQuirks.dwarfism === 2 && father.geneticQuirks.dwarfism === 2) { + quirks.dwarfism = 2; + } else if (mother.geneticQuirks.dwarfism + father.geneticQuirks.dwarfism >= 3) { + chance = jsRandom(1, 4); + if (chance >= 3) { + quirks.dwarfism = 2; + } else if (chance !== 1) { + quirks.dwarfism = 1; + } + } else if (mother.geneticQuirks.dwarfism === 1 && father.geneticQuirks.dwarfism === 1) { + if (jsRandom(1, 4) === 1) { + quirks.dwarfism = 2; + } + } + } else if (mother.geneticQuirks.dwarfism === 2) { + chance = jsRandom(1, 4); + if (chance >= 3) { + quirks.dwarfism = 2; + } else if (chance !== 1) { + quirks.dwarfism = 1; + } + } // albinism if (father !== 0) { @@ -1502,6 +1552,38 @@ window.generateChild = function(mother, ova, destination) { child.cloneID = genes.cloneID; } + if (child.geneticQuirks.dwarfism === 2 && child.geneticQuirks.gigantism !== 2) { + if (child.actualAge === 3) { + child.height = jsRandom(74, 79); + } else if (child.actualAge === 4) { + child.height = jsRandom(77, 87); + } else if (child.actualAge === 5) { + child.height = jsRandom(83, 93); + } else if (child.actualAge === 6) { + child.height = jsRandom(85, 97); + } else if (child.actualAge === 7) { + child.height = jsRandom(93, 102); + } else if (child.actualAge === 8) { + child.height = jsRandom(95, 105); + } else if (child.actualAge === 9) { + child.height = jsRandom(100, 110); + } else if (child.actualAge === 10) { + child.height = jsRandom(102, 115); + } else if (child.actualAge === 11) { + child.height = jsRandom(105, 120); + } else if (child.actualAge === 12) { + child.height = jsRandom(106, 122); + } else if (child.actualAge === 13) { + child.height = jsRandom(110, 127); + } else if (child.actualAge === 14) { + child.height = jsRandom(113, 130); + } else if (child.actualAge === 15) { + child.height = jsRandom(117, 133); + } else { + child.height = jsRandom(120, 135); + } + } + child.mother = genes.mother; child.father = genes.father; child.nationality = genes.nationality; diff --git a/src/js/generateMarketSlave.js b/src/js/generateMarketSlave.js index 7ec26382f744753422e2de43523dfa5ce2203e35..30bf3581877c2c6367f0efb9d9a962e06371e20c 100644 --- a/src/js/generateMarketSlave.js +++ b/src/js/generateMarketSlave.js @@ -2039,11 +2039,11 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { V.activeSlave.balls = 0; V.activeSlave.preg = 0; V.activeSlave.eyebrowHStyle = "bald"; - V.activeSlave.armpitHStyle = "bald"; + V.activeSlave.underArmHStyle = "bald"; V.activeSlave.pubicHStyle = "bald"; V.activeSlave.hStyle = "bald"; V.activeSlave.behavioralFlaw = jsEither(["none", "odd"]); - V.activeSlave.customTat = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder."; + V.activeSlave.custom.tattoo = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder."; break; case "gangs and smugglers": if (V.pedo_mode === 1) { diff --git a/src/js/relationshipChecks.js b/src/js/relationshipChecks.js index 6507db75550936deff4929d2eed5760f90ca1a3b..79e936e38a450cbaf9aeecb6e9d1dd9d34cf0dcd 100644 --- a/src/js/relationshipChecks.js +++ b/src/js/relationshipChecks.js @@ -1,35 +1,49 @@ +/** + * @param {{ rivalry: number; }} id + * @returns {string} + */ window.rivalryTerm = function(id) { if (id.rivalry === 1) { - return `growing rival`; + return "growing rival"; } else if (id.rivalry === 2) { - return `rival`; + return "rival"; } else { - return `bitter rival`; + return "bitter rival"; } }; + +/** + * @param {{ relationship: number; }} id + * @returns {string} + */ window.relationshipTerm = function(id) { if (id.relationship === 1) { - return `friend`; + return "friend"; } else if (id.relationship === 2) { - return `best friend`; + return "best friend"; } else if (id.relationship === 3) { - return `friend with benefits`; + return "friend with benefits"; } else if (id.relationship === 4) { - return `lover`; + return "lover"; } else { - return `slave wife`; + return "slave wife"; } }; + +/** + * @param {{ relationship: number; }} id + * @returns {string} + */ window.relationshipTermShort = function(id) { if (id.relationship === 1) { - return `friend`; + return "friend"; } else if (id.relationship === 2) { - return `BFF`; + return "BFF"; } else if (id.relationship === 3) { - return `FWB`; + return "FWB"; } else if (id.relationship === 4) { - return `lover`; + return "lover"; } else { - return `wife`; + return "wife"; } }; diff --git a/src/js/removeActiveSlave.js b/src/js/removeActiveSlave.js index 230c2e16b5f50a41956094f295112e90c6e26982..d40f8b2ef19fd04320f2185b077241c728d11776 100644 --- a/src/js/removeActiveSlave.js +++ b/src/js/removeActiveSlave.js @@ -249,7 +249,9 @@ window.removeActiveSlave = function removeActiveSlave() { V.JobIDArray = resetJobIDArray(); /* need to call this once more to update count of resting slaves*/ } }; - +/** + * @param {App.Entity.SlaveState} removedSlave + */ window.removeNonNGPSlave = function removeNonNGPSlave(removedSlave) { "use strict"; diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index 5cae9ede34fd5f1bb82770e3e78ac59d397f74bf..399d95b4a9ff85ec0b1e2bf609444c1c036bb8a1 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -93,7 +93,6 @@ window.ruleApplied = function(slave, rule) { * remove slave from the facility described by the rule * @param {App.Entity.SlaveState} slave * @param {Object} rule - * @returns {string} */ window.RAFacilityRemove = function RAFacilityRemove(slave, rule) { const V = State.variables; @@ -195,7 +194,7 @@ window.RAFacilityRemove = function RAFacilityRemove(slave, rule) { /** * return whether the rule applies to the slave - * @param {Object} cond + * @param {{function:boolean|string, data, specialSlaves, selectedSlaves, excludedSlaves, assignment}} cond * @param {App.Entity.SlaveState} slave * @returns {boolean} flag */ window.ruleAppliesP = function ruleAppliesP(cond, slave) { diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js index ec5868851a98ef90bf7fcb191d0b65619f28b852..573f3b7ba71fc3218ebc36aba22c15708c6fac05 100644 --- a/src/js/sexActsJS.js +++ b/src/js/sexActsJS.js @@ -1,7 +1,7 @@ -/* - times is how many times to increment the anal counts. - if left undefined it will assume it to be 1. -*/ +/** + * @param {number} [times=1] is how many times to increment the anal counts. + * @returns {string} + */ window.AnalVCheck = function AnalVCheck(times = 1) { const V = State.variables; const slave = V.activeSlave; @@ -52,10 +52,10 @@ window.AnalVCheck = function AnalVCheck(times = 1) { return r; }; -/* - times is how many times to increment the vaginal counts. - if left undefined it will assume it to be 1. -*/ +/** + * @param {number} [times=1] is how many times to increment the vaginal counts. + * @returns {string} + */ window.VaginalVCheck = function VaginalVCheck(times = 1) { const V = State.variables; const slave = V.activeSlave; @@ -109,10 +109,10 @@ window.VaginalVCheck = function VaginalVCheck(times = 1) { return r; }; -/* - analTimes is how many times to increment the anal counts, if there is no vagina available. - bothTimes is how many times to increment both holes counts (usually it is half of analTimes). - In both cases if left undefined it will assume it to be 1. +/** + * @param {number} [analTimes=1] how many times to increment the anal counts, if there is no vagina available. + * @param {number} [bothTimes=1] how many times to increment both holes counts (usually it is half of analTimes). + * @returns {string} */ window.BothVCheck = function BothVCheck(analTimes = 1, bothTimes = 1) { const V = State.variables; @@ -237,11 +237,11 @@ window.BothVCheck = function BothVCheck(analTimes = 1, bothTimes = 1) { return r; }; -/* - times is how many times to increment either the Vaginal or the Anal counts, if there is no Vagina available. - If left undefined it will assume it to be 1. +/** + * @param {number} [times=1] how many times to increment either the Vaginal or the Anal counts, if there is no Vagina available. + * @returns {string} */ -window.SimpleVCheck = function SimpleVCheck(times) { +window.SimpleVCheck = function SimpleVCheck(times=1) { let r = ``; if (canDoVaginal(State.variables.activeSlave)) { r += VaginalVCheck(times); @@ -322,11 +322,11 @@ window.PartnerVCheck = function PartnerVCheck(analTimes = 1, bothTimes = 1) { }; /** - count is how many times to increment either the Vaginal, Anal, or Oral counts, depending on availability of slave. - If count is left undefined it will assume it to be 1. - Intended to be a simple "I want to fuck x and not have to code a bunch of logic for it". + * fuckCount is how many times to increment either the Vaginal, Anal, or Oral counts, depending on availability of slave. + * If count is left undefined it will assume it to be 1. + * Intended to be a simple "I want to fuck x and not have to code a bunch of logic for it". * @param {App.Entity.SlaveState} slave - * @param {number} fuckCount + * @param {number} [fuckCount=1] * @returns {string} */ window.SimpleSexAct = function SimpleSexAct(slave, fuckCount = 1) { @@ -387,7 +387,6 @@ window.SimpleSlaveFucking = function SimpleSlaveFucking(slave, fuckCount = 1) { slave.counter.oral += 1; } } - return; }; /** diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index 21add638d260a1ce64f11f5eb746ad074f26f6fa..a4a571ffe939660eeb3162e3d41a1c9410d0545b 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -19,7 +19,7 @@ window.Beauty = (function() { beauty += 30; calcFaceBeauty(slave); calcTeethBeauty(slave); - calcModBeauty(slave); + calcModBeauty(); calcCosmeticsBeauty(slave); calcFSNotFuckdollBeauty(slave); calcMiscNotFuckdollBeauty(slave); @@ -1833,7 +1833,7 @@ window.slaveCost = (function() { calcMiscCost(slave); calcIndentureCost(slave); /* multipliers */ - calcCost(slave); + calcCost(); if (isStartingSlave) { calcStartingSlaveCost(slave); } diff --git a/src/js/slaveGenerationJS.js b/src/js/slaveGenerationJS.js index 867e78ee5e518ad36a98bdc985ace9680ba5ef0b..a5e7d3fdb7924f14125c5000f6fa841b5feead62 100644 --- a/src/js/slaveGenerationJS.js +++ b/src/js/slaveGenerationJS.js @@ -23,6 +23,12 @@ window.raceToNationality = function raceToNationality(slave) { } }; +/** + * @param {string | Object} nationality + * @param {string | Object} race + * @param {boolean} male + * @param {undefined} [filter] + */ window.generateName = function generateName(nationality, race, male, filter) { filter = filter || _.stubTrue; /* default: allow all */ const lookup = (male ? setup.malenamePoolSelector : setup.namePoolSelector); @@ -36,6 +42,12 @@ window.generateName = function generateName(nationality, race, male, filter) { return result; }; +/** + * @param {string | number} nationality + * @param {any} race + * @param {any} male + * @param {() => true} filter + */ window.generateSurname = function generateSurname(nationality, race, male, filter) { filter = filter || _.stubTrue; /* default: allow all */ const result = jsEither( @@ -52,6 +64,12 @@ window.generateSurname = function generateSurname(nationality, race, male, filte return result || 0; }; +/** + * @param {string} name + * @param {string | Object} nationality + * @param {any} race + * @returns {boolean} + */ window.isMaleName = function isMaleName(name, nationality, race) { const names = setup.malenamePoolSelector[`${nationality}.${race}`] || setup.malenamePoolSelector[nationality] || @@ -1511,6 +1529,9 @@ window.generatePronouns = function generatePronouns(slave) { } }; +/** + * @param {App.Entity.SlaveState} slave + */ window.generatePuberty = function(slave) { if ((slave.ovaries === 1 || slave.mpreg === 1) && slave.physicalAge >= slave.pubertyAgeXX) { slave.pubertyXX = 1; @@ -1524,6 +1545,9 @@ window.generatePuberty = function(slave) { } }; +/** + * @param {App.Entity.SlaveState} slave + */ window.ageImplantAdjustment = function(slave) { if (slave.visualAge > 80) { slave.visualAge -= 40; diff --git a/src/js/storyJS.js b/src/js/storyJS.js index 97f535d36db4fd072e7b47cd613fa78004f981d8..2b07b507e0b900097bcf36d41ba4b5049b8851d6 100644 --- a/src/js/storyJS.js +++ b/src/js/storyJS.js @@ -1,10 +1,17 @@ /* config.history.tracking = false;*/ // State.expired.disable; -window.variableAsNumber = function(x, defaultValue, minValue, maxValue) { +/** + * @param {number} x + * @param {number} defaultValue + * @param {number} minValue + * @param {number} maxValue + * @returns {number} + */ +window.variableAsNumber = function(x, defaultValue = 0, minValue, maxValue) { x = Number(x); - if (x !== x) { // NaN - return defaultValue || 0; // In case the default value was not supplied. + if (isNaN(x)) { + return defaultValue; } if (x < minValue) { // Works even if minValue is undefined. return minValue; @@ -39,6 +46,11 @@ if (typeof interpolate === "undefined") { window.interpolate = interpolate; } +/** + * @param {any[]} arr + * @param {any} val + * @returns {any[]} + */ window.removeFromArray = function(arr, val) { for (let i = 0; i < arr.length; i++) { if (val === arr[i]) { @@ -48,6 +60,11 @@ window.removeFromArray = function(arr, val) { return null; }; +/** + * @param {any[]} arr + * @param {any} callback + * @param {any} thisArg + */ window.filterInPlace = function(arr, callback, thisArg) { let j = 0; @@ -121,6 +138,11 @@ window.canImpreg = function(slave1, slave2) { } }; +/** + * Determines whether PC is fertile + * @param {{ preg: number; pregWeek: number; vagina: number; }} PC + * @returns {boolean} + */ window.isPlayerFertile = function(PC) { if (!PC) { return null; @@ -139,7 +161,7 @@ window.isPlayerFertile = function(PC) { /** * @param {App.Entity.SlaveState} slave - * @returns {null | string} + * @returns {string|number} */ window.relationTargetWord = function(slave) { if (!slave) { @@ -179,7 +201,7 @@ window.milkAmount = function(slave) { milk = (8 + ((calcs - 400) / 50)); } if (slave.boobsImplant > 0) { - milk *= Math.max(.25, (1 - (slave.boobsImplant / slave.boobs))); + milk *= Math.max(0.25, (1 - (slave.boobsImplant / slave.boobs))); } if (slave.lactation === 2) { milk *= 1.2; @@ -252,6 +274,10 @@ window.cumAmount = function(slave) { return cum; }; +/** + * @param {string} text + * @returns {string} + */ window.lispReplace = function(text) { text = text.replace(/Sh/g, "Th"); text = text.replace(/SS/g, "Th"); @@ -337,7 +363,7 @@ window.lispReplace = function(text) { /** * @param {App.Entity.SlaveState} slave - * @param {object} arcology // I think + * @param {Object} arcology // I think * @returns {number} */ window.repGainSacrifice = function(slave, arcology) { @@ -394,6 +420,10 @@ window.ngUpdateMissingTable = function(missingTable) { return newTable; }; +/** + * @param {any} obj + * @returns {string} + */ window.toJson = function(obj) { let jsontext = JSON.stringify(obj); jsontext = jsontext.replace(/^{/, ""); @@ -436,7 +466,7 @@ window.nippleColor = function(slave) { /** * @param {App.Entity.SlaveState} slave - * @param {object} PC + * @param {Object} PC * @returns {number} */ window.overpowerCheck = function(slave, PC) { @@ -498,7 +528,6 @@ window.jsConsoleInfo = function(obj) { /** * @param {App.Entity.SlaveState} slave - * */ window.SoftenBehavioralFlaw = function SoftenBehavioralFlaw(slave) { switch (slave.behavioralFlaw) { @@ -535,7 +564,6 @@ window.SoftenBehavioralFlaw = function SoftenBehavioralFlaw(slave) { /** * @param {App.Entity.SlaveState} slave - * */ window.SoftenSexualFlaw = function SoftenSexualFlaw(slave) { switch (slave.sexualFlaw) { @@ -570,6 +598,9 @@ window.SoftenSexualFlaw = function SoftenSexualFlaw(slave) { slave.sexualFlaw = "none"; }; +/** + * @param {{ title: number; pronoun: string; possessivePronoun: string; possessive: string; object: string; objectReflexive: string; noun: string; }} PC + */ window.generatePlayerPronouns = function(PC) { if (PC.title === 0) { PC.pronoun = "she"; diff --git a/src/js/utilJS.js b/src/js/utilJS.js index c7c75937b564057d75f646d676695b9f831a3e9c..1266a2c34ac31243abd5a680e74ef4780d2e67ee 100644 --- a/src/js/utilJS.js +++ b/src/js/utilJS.js @@ -63,7 +63,11 @@ window.Height = (function() { let minHeight = 0; let maxHeight = 999; - // Configuration method for the above values + /** + * Configuration method for the above values + * @param {any} [conf] + * @returns {{ limitMult: number[]; limitHeight: number[]; skew: number; spread: number; }} + */ const _config = function(conf) { if (_.isUndefined(conf)) { return { @@ -537,13 +541,24 @@ window.Height = (function() { "": 171.42, // defaults }; - // Helper method - table lookup for nationality/race combinations + /** + * Helper method - table lookup for nationality/race combinations + * @param {{ [table: string]: number; }} table + * @param {string|Object} nationality + * @param {string} race + * @param {undefined} [def] + */ const nationalityMeanHeight = function(table, nationality, race, def) { return table[`${nationality}.${race}`] || table[nationality] || table[`.${race}`] || table[""] || def; }; - // Helper method: Generate a skewed normal random variable with the skew s - // Reference: http://azzalini.stat.unipd.it/SN/faq-r.html + + /** + * Helper method: Generate a skewed normal random variable with the skew s + * Reference: http://azzalini.stat.unipd.it/SN/faq-r.html + * @param {number} s + * @returns {number} + */ const skewedGaussian = function(s) { let randoms = gaussianPair(); if (s === 0) { @@ -555,7 +570,10 @@ window.Height = (function() { return randoms[0] >= 0 ? result : -result; }; - // Height multiplier generator; skewed gaussian according to global parameters + /** + * Height multiplier generator; skewed gaussian according to global parameters + * @returns {number} + */ const multGenerator = function() { let result = skewedGaussian(skew); while (result < minMult || result > maxMult) { @@ -564,7 +582,11 @@ window.Height = (function() { return result; }; - // Helper method: Generate a height based on the mean one and limited according to config. + /** + * Helper method: Generate a height based on the mean one and limited according to config. + * @param {number} mean + * @returns {number} + */ const heightGenerator = function(mean) { let result = mean * (1 + multGenerator() * spread); while (result < minHeight || result > maxHeight) { @@ -573,7 +595,13 @@ window.Height = (function() { return Math.round(result); }; - // Helper method - apply age and genes to the adult height + /** + * Helper method - apply age and genes to the adult height + * @param {number} height + * @param {number} age + * @param {string} genes + * @returns {number} + */ const applyAge = function(height, age, genes) { if (!_.isFinite(age) || age < 2 || age >= 20) { return height; @@ -616,6 +644,13 @@ window.Height = (function() { } }; + /** + * @param {string|{nationality: string, race: string, genes: string, physicalAge: number, birthWeek: number}} nationality + * @param {string} race + * @param {string} genes + * @param {number} age + * @returns {number} + */ const _meanHeight = function(nationality, race, genes, age) { if (_.isObject(nationality)) { // We got called with a single slave as the argument @@ -659,6 +694,12 @@ window.Height = (function() { return applyAge(result, age, genes); }; + /** + * @param {any} nationality + * @param {any} race + * @param {string} genes + * @param {number} age + */ const _randomHeight = function(nationality, race, genes, age) { const mean = _meanHeight(nationality, race, genes, age); // If we got called with a slave object and options, temporarily modify @@ -673,6 +714,12 @@ window.Height = (function() { return heightGenerator(mean); }; + /** + * @param {number} height + * @param {number|{physicalAge:number, birthWeek:number, genes:string}} age + * @param {string} genes + * @returns {number} + */ const _forAge = function(height, age, genes) { if (_.isObject(age)) { // We got called with a slave as a second argument @@ -690,7 +737,7 @@ window.Height = (function() { }; })(); -/* +/** * Intelligence.random(options) - returns a random intelligence. If no options are passed, the generated number * will be on a normal distribution with mean 0 and standard deviation 45. * @@ -720,6 +767,7 @@ window.Height = (function() { * intelligences until one "fits". * * This was modeled using the Height generator above. For some more information, see the comments for that. +* @returns {{random: number, _config: Object}} */ window.Intelligence = (function() { "use strict"; @@ -733,7 +781,10 @@ window.Intelligence = (function() { let minIntelligence = -101; let maxIntelligence = 100; - // Configuration method for the above values + /** + * Configuration method for the above values + * @param {{ mean: number; limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; } | { limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; mean?: undefined; }} [conf] + */ const _config = function(conf) { if (_.isUndefined(conf)) { return { @@ -771,8 +822,12 @@ window.Intelligence = (function() { }; }; - // Helper method: Generate a skewed normal random variable with the skew s - // Reference: http://azzalini.stat.unipd.it/SN/faq-r.html + /** + * Helper method: Generate a skewed normal random variable with the skew s + * Reference: http://azzalini.stat.unipd.it/SN/faq-r.html + * @param {number} s + * @returns {number} + */ const skewedGaussian = function(s) { let randoms = gaussianPair(); if (s === 0) { @@ -802,6 +857,10 @@ window.Intelligence = (function() { return Math.ceil(result); }; + /** + * @param {{ mean: number; limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; } | { limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; mean?: undefined; }} settings + * @returns {number} + */ const _randomIntelligence = function(settings) { if (settings) { const currentConfig = _config(); @@ -819,7 +878,10 @@ window.Intelligence = (function() { }; })(); -// Helper method - generate two independent Gaussian numbers using Box-Muller transform +/** + * Helper method - generate two independent Gaussian numbers using Box-Muller transform + * @returns {number[]} +*/ window.gaussianPair = function() { let r = Math.sqrt(-2.0 * Math.log(1 - Math.random())); let sigma = 2.0 * Math.PI * (1 - Math.random()); @@ -914,19 +976,19 @@ window.num = function(x) { const SCALES = ["thousand", "million", "billion", "trillion"]; /** - * helper function for use with Array.filter - * @param {any} item - * @returns {boolean} - */ + * helper function for use with Array.filter + * @param {any} item + * @returns {boolean} + */ function isTruthy(item) { return !!item; } /** - * convert a number into "chunks" of 0-999 - * @param {number} number - * @returns {number[]} - */ + * convert a number into "chunks" of 0-999 + * @param {number} number + * @returns {number[]} + */ function chunk(number) { const thousands = []; @@ -939,10 +1001,10 @@ window.num = function(x) { } /** - * translate a number from 1-999 into English - * @param {number} number - * @returns {string} - */ + * translate a number from 1-999 into English + * @param {number} number + * @returns {string} + */ function inEnglish(number) { let hundreds; let tens; @@ -972,11 +1034,11 @@ window.num = function(x) { } /** - * append the word for a scale. Made for use with Array.map - * @param {string} chunk - * @param {number} exp - * @returns {string} - */ + * append the word for a scale. Made for use with Array.map + * @param {string} chunk + * @param {number} exp + * @returns {string} + */ function appendScale(chunk, exp) { let scale; if (!chunk) { @@ -987,9 +1049,9 @@ window.num = function(x) { } /** - * @param {number} s - * @returns {string} - */ + * @param {number} s + * @returns {string} + */ function commaNum(s) { if (!s) { return "0"; @@ -1182,6 +1244,7 @@ window.isFloat = function(n) { }; /** + * Returns a random number between min and max * @param {number} min * @param {number} max * @returns {number} @@ -1561,6 +1624,10 @@ window.ordinalSuffix = function ordinalSuffix(i) { return `${i}th`; }; +/** + * @param {Iterable<any>} array + * @returns {Set<any>} + */ window.removeDuplicates = function removeDuplicates(array) { return [...new Set(array)]; }; @@ -2036,9 +2103,11 @@ window.jsDef = function(input) { } }; -/* Return a career at random that would be suitable for the given slave. - - Currently only considers their age +/** + * Return a career at random that would be suitable for the given slave. + * Currently only considers their age + * @param {App.Entity.SlaveState} slave + * @returns {string} */ window.randomCareer = function(slave) { if (slave.actualAge < 16) { @@ -2052,6 +2121,9 @@ window.randomCareer = function(slave) { } }; +/** + * @param {App.Entity.SlaveState} slave + */ window.resyncSlaveToAge = function(slave) { slave.height = Height.random(slave); slave.pubertyXX = slave.actualAge < slave.pubertyAgeXX ? 0 : 1; @@ -2093,6 +2165,11 @@ window.resyncSlaveToAge = function(slave) { slave.career = randomCareer(slave); }; +/** + * @param {string} input + * @param {number} [increase=1] + * @returns {string} + */ window.IncreasePCSkills = function(input, increase = 1) { const player = State.variables.PC; const oldSkill = player[input]; @@ -2116,6 +2193,10 @@ window.IncreasePCSkills = function(input, increase = 1) { } }; +/** + * @param {string} raceName + * @returns {string} + */ window.randomRaceSkin = function(raceName) { let skin; switch (raceName) { @@ -2149,6 +2230,10 @@ window.randomRaceSkin = function(raceName) { return skin; }; +/** + * @param {string} raceName + * @returns {string} + */ window.randomRaceEye = function(raceName) { let eye; switch (raceName) { @@ -2178,6 +2263,10 @@ window.randomRaceEye = function(raceName) { return eye; }; +/** + * @param {string} raceName + * @returns {string} + */ window.randomRaceHair = function(raceName) { let hair; switch (raceName) { @@ -2205,6 +2294,10 @@ window.randomRaceHair = function(raceName) { return hair; }; +/** + * @param {string} skinTone + * @returns {number} + */ window.skinToneLevel = function(skinTone) { if (!setup.naturalSkins.includes(skinTone)) { return undefined; @@ -2239,6 +2332,13 @@ window.skinToneLevel = function(skinTone) { return skinToMelanin[skinTone]; }; +/** + * Increase or decrease skinTone + * @param {string} skin + * @param {number} value + * @returns {string} + */ + window.changeSkinTone = function(skin, value) { if (!setup.naturalSkins.includes(skin)) { return skin; @@ -2284,63 +2384,40 @@ window.changeSkinTone = function(skin, value) { return prop; }; +/** + * Determines if FS Decor level is above or equal to value + * @param {number} value + * @returns {boolean} + */ window.FSDecorLevel = function(value) { - const V = State.variables; + "use strict"; + const V = State.variables, + FS = [ + 'Supremacist', 'Subjugationist', 'GenderRadicalist', 'GenderFundamentalist', + 'Paternalist', 'Degradationist', 'BodyPurist', 'TransformationFetishist', + 'YouthPreferentialist', 'MaturityPreferentialist', 'SlimnessEnthusiast', 'AssetExpansionist', + 'Pastoralist', 'PhysicalIdealist', 'ChattelReligionist', 'RomanRevivalist', + 'AztecRevivalist', 'EgyptianRevivalist', 'EdoRevivalist', 'ArabianRevivalist', + 'ChineseRevivalist', 'RepopulationFocus', 'Restart', 'HedonisticDecadence' + ]; + let valid = 0; if (!value) { return null; - } else if (V.arcologies[0].FSSupremacistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSSubjugationistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSGenderRadicalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSGenderFundamentalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSPaternalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSDegradationistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSBodyPuristDecoration >= value) { - return true; - } else if (V.arcologies[0].FSTransformationFetishistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSYouthPreferentialistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSMaturityPreferentialistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSSlimnessEnthusiastDecoration >= value) { - return true; - } else if (V.arcologies[0].FSAssetExpansionistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSPastoralistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSPhysicalIdealistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSChattelReligionistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSRomanRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSAztecRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSEgyptianRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSEdoRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSArabianRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSChineseRevivalistDecoration >= value) { - return true; - } else if (V.arcologies[0].FSRepopulationFocusDecoration >= value) { - return true; - } else if (V.arcologies[0].FSRestartDecoration >= value) { - return true; - } else if (V.arcologies[0].FSHedonisticDecadenceDecoration >= value) { - return true; + } + + for (let i = 0;i < FS.length;i++) { + const tail = 'FS' + FS[i] + 'Decoration'; + if (V.arcologies[0][tail] >= value) { + valid += 1; + } + } + + if (valid > 0) { + return true; } else { return false; } -} - +}; /** * Creates a span for an link with tooltip containing the reasons why it is disabled @@ -2352,7 +2429,7 @@ App.UI.disabledLink = function(link, reasons) { const tooltips = reasons.length === 1 ? `<span class="tooltip">${reasons}</span>`: `<div class="tooltip"><ul>${reasons.map(e => `<li>${e}</li>`).join('')}</ul></div>`; - return '<span class="textWithTooltip">' + link + tooltips + '</span>'; + return `<span class="textWithTooltip">${link}${tooltips}</span>`; }; /** @@ -2381,4 +2458,4 @@ App.Utils.setActiveSlaveByIndex = function(index) { if (index >= 0) { State.variables.activeSlave = State.variables.slaves[index]; } -} +}; diff --git a/src/npc/agent/agentFramework.js b/src/npc/agent/agentFramework.js index aa5e80c1b78cd8ffedd3b3894d2409dbbb048f97..2dff5de1bf1e6b39c7f99df83735fee336d91526 100644 --- a/src/npc/agent/agentFramework.js +++ b/src/npc/agent/agentFramework.js @@ -3,7 +3,7 @@ App.Data.Facilities.arcologyAgent = { genericName: null, jobs: { agentsSlave: { - position: "agents's toy", + position: "agent's toy", assignment: "live with your agent", publicSexUse: true, fuckdollAccepted: false @@ -29,9 +29,9 @@ App.Data.Facilities.arcologyAgent = { App.Entity.Facilities.AgentJob = class extends App.Entity.Facilities.ManagingJob { /** - * @param {App.Entity.SlaveState} slave - * @returns {string[]} - */ + * @param {App.Entity.SlaveState} slave + * @returns {string[]} + */ canEmploy(slave) { let r = super.canEmploy(slave); if (slave.intelligence + slave.intelligenceImplant <= 15) { diff --git a/src/npc/fDance.tw b/src/npc/fDance.tw index 388fa4b9e8b93804fb4960aa4088f42d027b0636..64921408944fc39f567116f082b880e02e0f3167 100644 --- a/src/npc/fDance.tw +++ b/src/npc/fDance.tw @@ -366,7 +366,7 @@ But it's not over yet. You tell your slave that it's time to incorporate some st <<elseif ($activeSlave.sexualFlaw == "attention whore")>> As an attention whore, this is what $he lives for. <<if ($activeSlave.skill.entertainment >= 99)>> - Your slave is a masterful entertainer, able to keep anyone entertained for even the most lengthy of strip teases. Being a an attention whore, $he is obsessed with attracting the sexual arousal of others. $He begins by writhing $his hips and rolling $his ass. $He knows how to use $his hips and ass to draw and keep your attention while slowly moving up to $his chest. $His body is nothing more than an object for your desire, and $he knows how to fulfill $his purpose, even though $he is also fulfilled by the event $he knows that your desire is all that matters. You keep trying to get back to work, but your slave's movements are so enthralling that you cannot seem to break free. + Your slave is a masterful entertainer, able to keep anyone entertained for even the most lengthy of strip teases. Being an attention whore, $he is obsessed with attracting the sexual arousal of others. $He begins by writhing $his hips and rolling $his ass. $He knows how to use $his hips and ass to draw and keep your attention while slowly moving up to $his chest. $His body is nothing more than an object for your desire, and $he knows how to fulfill $his purpose, even though $he is also fulfilled by the event $he knows that your desire is all that matters. You keep trying to get back to work, but your slave's movements are so enthralling that you cannot seem to break free. <<elseif ($activeSlave.skill.entertainment >= 60)>> Your slave is a skilled entertainer, well above average. Being an attention whore, $he is obsessed with attracting the sexual arousal of others. $He begins by writhing $his hips and rolling $his ass. $He knows how to use $his hips and ass to draw and keep your attention while slowly moving up to $his chest. $His body is nothing more than an object for your desire, and $he is learning to fulfill $his purpose. $He surely wishes $he were a better entertainer so you would call on $him to strip more often. <<elseif ($activeSlave.skill.entertainment >= 40)>> diff --git a/src/npc/fPCImpreg.tw b/src/npc/fPCImpreg.tw index 8b4e7fe90c5334d576044fc5a1ac7f56bcc8adc7..4425c140df1e0bc6b0080861583e80e3408420fe 100644 --- a/src/npc/fPCImpreg.tw +++ b/src/npc/fPCImpreg.tw @@ -132,7 +132,7 @@ You call $him over so you can <<else>> You take $him from behind against your desk. $He steadies $himself as $he feels your hands roaming across $his _belly belly. As the sex reaches its climax, $his breaths grow short and $his moans passionate. $He pushed against you, <</if>> - As the sex reaches its climax your semen<<if $PC.balls == 3>> fills $him until $his stomach is distended and wobbling with your cum<<elseif $PC.balls == 2>> pours into $him until $he is stuffed with your cum<<elseif $PC.balls == 1>> pours into $him<<else>> jets into $his welcoming depths<</if>> as $he begs you to use $his unworthy body to make a new slave. + As the sex reaches its climax your semen<<if $PC.balls == 3>> fills $him until $his stomach is distended and wobbling with your cum<<elseif $PC.balls == 2>> pours into $him until $he is stuffed with your cum<<elseif $PC.balls == 1>> pours into $him<<else>> jets into $his welcoming depths<</if>> as $he begs you to use $his unworthy body to make a new slave. <<elseif $activeSlave.devotion < -20>> $He tries to refuse, so you bend the disobedient slave over your desk and take $him hard from behind. $His breasts slide back and forth across the desk. You give $his buttocks some nice hard swats as you pound $him. $He grunts and moans but knows better than to try to get away. $He begs you not to cum inside $him, knowing $he's fertile, and sobs when $he feels you<<if $PC.balls == 3>> filling $him until $his stomach is distended and wobbling with your cum<<elseif $PC.balls == 2>> pouring into $him until $he is stuffed with your cum<<elseif $PC.balls == 1>> pouring into $him<<else>> blow your load<</if>> despite $his pleas. <<elseif $activeSlave.devotion <= 20>> diff --git a/src/pregmod/incubatorReport.tw b/src/pregmod/incubatorReport.tw index 830e4061a3cba04439e57c801d9cc84cb0c05dca..0899a17ff49fe704886bb85c38073407b387011f 100644 --- a/src/pregmod/incubatorReport.tw +++ b/src/pregmod/incubatorReport.tw @@ -143,6 +143,9 @@ <br> <<set _heightLimit = Math.trunc(Math.clamp((Height.mean($tanks[_inc]) * 1.25),0,274))>> <<set _heightLimitAge = Height.forAge($tanks[_inc].height, $tanks[_inc])>> + <<if $tanks[_inc].geneticQuirks.dwarfism == 2 && $tanks[_inc].geneticQuirks.gigantism != 2>> + <<set _heightLimit = Math.min(_heightLimit, 160)>> + <</if>> <<if $tanks[_inc].geneMods.NCS == 1>> /* ** NCS should block physical growth beyond that of a toddler, but some players might like diff --git a/src/pregmod/pRaped.tw b/src/pregmod/pRaped.tw index 92d96f2ebafed4ed9c26b6f2b322b2ea752b54fd..9df384125e4469c5cdc11883aa4f7bb58418e551 100644 --- a/src/pregmod/pRaped.tw +++ b/src/pregmod/pRaped.tw @@ -2,250 +2,346 @@ <<set $raped = 1, $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> -<<set $activeSlaveOneTimeMinAge = 16>> -<<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 $PC.vagina > 0>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<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>> + <<set $activeSlave = GenerateNewSlave("XY")>> + <<set $activeSlave.origin = "You sentenced her to enslavement for the attempted rape of a free woman.">> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = -100>> + <<set $activeSlave.health = random(-50,-20)>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.dick = 6>> + <<set $activeSlave.balls = 5>> + <<set $activeSlave.boobs = 0>> + <<set $activeSlave.waist = 50>> + <<set $activeSlave.skill.oral = 0>> + <<set $activeSlave.skill.anal = 0>> + <<set $activeSlave.behavioralFlaw = "arrogant">> + <<set $activeSlave.sexualFlaw = "judgemental">> +<<else>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<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>> + <<set $activeSlave = GenerateNewSlave("XX")>> + <<set $activeSlave.origin = "You sentenced her to enslavement for the attempted rape of a free man.">> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = -100>> + <<set $activeSlave.health = random(-50,-20)>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.vagina = 1>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.waist = -20>> + <<set $activeSlave.behavioralFlaw = "arrogant">> + <<set $activeSlave.sexualFlaw = "judgemental">> <</if>> -<<set $activeSlave = GenerateNewSlave("XY")>> -<<set $activeSlave.origin = "You sentenced her to enslavement for the attempted rape of a free woman.">> -<<set $activeSlave.devotion = -100>> -<<set $activeSlave.trust = -100>> -<<set $activeSlave.health = random(-50,-20)>> -<<set $activeSlave.anus = 0>> -<<set $activeSlave.dick = 6>> -<<set $activeSlave.balls = 5>> -<<set $activeSlave.boobs = 0>> -<<set $activeSlave.waist = 50>> -<<set $activeSlave.skill.oral = 0>> -<<set $activeSlave.skill.anal = 0>> -<<set $activeSlave.behavioralFlaw = "arrogant">> -<<set $activeSlave.sexualFlaw = "judgemental">> <<setPlayerPronouns>> +<<setLocalPronouns $activeSlave>> While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason. <<if $PC.career == "mercenary" || $PC.warfare >= 85>> - The moment you hear the sound of the knife unsheathe your reflexes take over. With a single strike, the man tailing you lies in a heap on the ground. + The moment you hear the sound of the knife unsheathe your reflexes take over. With a single strike, the $woman tailing you lies in a heap on the ground. <<set $raped = 0>> <<elseif $PC.career == "slaver" || $PC.warfare >= 45>> The moment you notice an arm coming around from behind you does your training kick in. You quickly disarm the assailant and knock them to the floor before placing them in a chokehold. Once they are subdued, you stand back to decide what to do next. <<set $raped = 0>> <<elseif $PC.career == "gang">> - The moment you hear the sound of the knife unsheathe your reflexes take over. With a single stab, your own shiv is buried in his chest, incapacitating him. + The moment you hear the sound of the knife unsheathe your reflexes take over. With a single stab, your own shiv is buried in $his chest, incapacitating $him. <<set $raped = 0>> <<else>> - You stifle a scream when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place. + You stifle a <<if $PC.title == 1>>swear<<else>>scream<</if>> when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place. <</if>> -<<if $raped == 1>> <br><br> -"Well, well, well, look what <<if $PC.belly >= 5000 || $PC.preg >= 20>>waddled<<else>>walked<</if>> into my territory. If it isn't $PC.name, come to grace me with _hisP presence." The man binds your hands behind you, all the while keeping the knife to your throat. "Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow. Now let's see what we have here." With his free hand, he begins to explore your vulnerable body. -<<switch $PC.career>> -<<case "wealth">> - <<if $PC.boobs > 0>> - "Nice and supple. How much did you have to pay for these babies?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Couldn't afford an abortion after you took over? How sad," he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Went with the full package didn't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "capitalist">> - <<if $PC.boobs > 0>> - "Nice and supple. Bet these got you some great deals with guys, didn't they?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Sleeping with guys to close deals? Such a slut," he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Guess you fuck people over in more ways than one, don't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "engineer">> - <<if $PC.boobs > 0>> - "Nice and supple. Did the other engineers care about your designs or just your tits?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "I can see why your designs were so popular, you fucked your way into the spotlight!" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Well you do know how to erect things, don't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "medicine">> - <<if $PC.boobs > 0>> - "Nice and supple. Did you implant them yourself?" he smirks as he gropes your breasts. +<<if $raped == 1>> + <<if $PC.vagina > 0>> + "Well, well, well, look what <<if $PC.belly >= 5000 || $PC.preg >= 20>>waddled<<else>>walked<</if>> into my territory. If it isn't $PC.name, come to grace me with _hisP presence." + <<else>> + "I've been watching you ever since you first moved in, $PC.name, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I." <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - <<if $PC.dick > 0>> - "Look at that belly! I bet you inseminated yourself with your own seed," he chuckles as he rubs your pregnant belly. + The $woman binds your hands behind you, all the while keeping the knife to your throat. "Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow. Now let's see what we have here." + + <<if $PC.vagina > 0>> + With $his free hand, $he begins to explore your vulnerable body. + <<switch $PC.career>> + <<case "wealth">> + <<if $PC.boobs > 0>> + "Nice and supple. How much did you have to pay for these babies?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "Couldn't afford an abortion after you took over? How sad," he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "Went with the full package didn't you?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "capitalist">> + <<if $PC.boobs > 0>> + "Nice and supple. Bet these got you some great deals with guys, didn't they?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "Sleeping with guys to close deals? Such a slut," he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "Guess you fuck people over in more ways than one, don't you?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "engineer">> + <<if $PC.boobs > 0>> + "Nice and supple. Did the other engineers care about your designs or just your tits?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "I can see why your designs were so popular, you fucked your way into the spotlight!" he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "Well you do know how to erect things, don't you?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "medicine">> + <<if $PC.boobs > 0>> + "Nice and supple. Did you implant them yourself?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + <<if $PC.dick > 0>> + "Look at that belly! I bet you inseminated yourself with your own seed," he chuckles as he rubs your pregnant belly. + <<else>> + "I see how you work. Mess up a surgery and give the guy a pity fuck. Surprised you couldn't get their spawn out of your belly though. Guess you aren't that good of a surgeon," he chuckles as he rubs your pregnant belly. + <</if>> + <</if>> + <<if $PC.dick > 0>> + "I'm impressed. Your woman impression is quite good. Did you do the surgery yourself?" he mocks as he flicks the tip of your stiffening cock. "Still going to fuck you though." + <</if>> + <<case "celebrity">> + <<if $PC.boobs > 0>> + "Nice and supple. I wonder how many guys jacked off to your pictures?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "I can see how you got so popular!" he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "How much tape did it take to hold this guy down?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "escort">> + <<if $PC.boobs > 0>> + "Nice and soft. How many dicks have been between these babies?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "What kind of whore doesn't know about protection?" he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "So, did you ever get to use this when you were a prostitute?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "servant">> + <<if $PC.boobs > 0>> + "Nice and supple. Bet your master spent a fortune making these so nice," he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "Holding on to your master's final gift are you?" he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "When your master first undressed you, what did he think of his 'girl'?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <<case "BlackHat">> + <<if $PC.boobs > 0>> + "Nice and supple. What are the odds that I can find these babies on the internet?" he smirks as he gropes your breasts. + <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>> + "You'd think someone so skilled at breaking security would understand protection themselves. Or did you trade your pussy for information?" he chuckles as he rubs your pregnant belly. + <</if>> + <<if $PC.dick > 0>> + "Trying to catch a signal with that?" he mocks as he flicks the tip of your stiffening cock. + <</if>> + <</switch>> + Finally he reaches your moistening pussy. "Already wet are we? Glad you know your place," he states as he pulls your clothes off and bends you over. + <br><br> + You can feel the head of his cock teasing your pussy lips; you hope it feels bigger than it really is. As he struggles to force it into you, you regret thinking about it. He must have undergone surgery or something because he fills you completely. You feel weak just from him sticking it in, you can't fathom what will happen once he starts thrusting. You soon find out as he wastes no time starting slow. He violently rams his oversized cock deep into you, threatening to penetrate your cervix with each thrust. He quickens his pace, fucking you like a beast. + <<if $PC.preg < 1>> + <<if random(1,100) > 60>> + His hand rises to your lips and forces something into your mouth. "Swallow it." You obey, hoping to just get this over with. + <<set $PC.forcedFertDrugs += 3>> + <</if>> + With one final thrust, he forces through your battered cervix and unloads in the depths of your <<if isPlayerFertile($PC)>>fertile <</if>>womb. <<else>> - "I see how you work. Mess up a surgery and give the guy a pity fuck. Surprised you couldn't get their spawn out of your belly though. Guess you aren't that good of a surgeon," he chuckles as he rubs your pregnant belly. + With one final thrust, he forces it in as deep as he can into you and blows his seed deep in your aching cunt. <</if>> + <<if $PC.preg >= 20 || $PC.belly >= 5000>>"Now your child<<if $PC.pregType > 1>>ren<</if>> will know what a real man's sperm is like!" <</if>> + He shoves you to the ground, pussy gaping from the size of his shaft and leaking his huge load all over yourself. By the time you loosen your bindings, he is long gone. + <br><br> + It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Such a thing, happening to you. You can't allow such an indignity to happen again, you think to yourself, as you try to coax his sperm from your abused pussy. + <<if isPlayerFertile($PC)>> + For some reason your body feels really satisfied, despite not climaxing... Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure he didn't knock you up. + <<= knockMeUp($PC, 100, 0, 0, 1)>> + <</if>> + <<else>> + With $his free hand, $he begins to explore your bound body. + <<switch $PC.career>> + <<case "wealth">> + <<if $PC.boobs > 0>> + "Spared no expenses for these babies, did you?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Now there's the money maker!" + <<case "capitalist">> + <<if $PC.boobs > 0>> + "Ever wonder if they were listening to you or just oggling the man with the breasts?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Now that explains how you were so successful!" + <<case "engineer">> + <<if $PC.boobs > 0>> + "How did you get any work done with these hanging over your designs?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "I see what kind of tools you like. Big and strong!" + <<case "medicine">> + <<if $PC.boobs > 0>> + "I'm sure you had quite the number of clients after a pair of these," $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Huh, I wonder if that's real..." + <<case "celebrity">> + <<if $PC.boobs > 0>> + "Nice and supple. Just like I'd expect from a man sporting tits." $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Oh, now those tabloids make sense." + <<case "escort">> + <<if $PC.boobs > 0>> + "With these hanging out, how many men tried to pick you up?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Now there's the money maker!" + <<case "servant">> + <<if $PC.boobs > 0>> + "Did your Master even ask before he stuck you with these?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "Now that's surprising. I expected something smaller." + <<case "BlackHat">> + <<if $PC.boobs > 0>> + "Nice and supple. What are the odds that I can find these babies on the internet?" $he smirks as $he gropes your breasts. + <</if>> + $He slips $his hand down your pants; "You wouldn't mind if I download a few files now yould you? Well, not that it matters." + <</switch>> + Satisfied, $he pulls your cock out of its increasingly cramped confines. "Look at him grow, he knows what comes next..." $He teases as $he pushes you to the ground and climbs on top of you. + <br><br> + $He lines $himself up with the tip of your dick before taking its entire length into $himself. $He lets out a lust filled moan as $he begins to bounce on your traitorous member. You can do nothing to stop $him from riding you to climax, so you just enjoy the sight of $his breasts bouncing to $his pace. As you feel your orgasm approaching, you try to time it so you can slip out of $him just before you blow your load, but you have no such luck. + "You really think I'd let you spoil my plans?" $He asks as $he grinds against you, making sure you cum deep in $his pussy. $He leans back and massages $his taut stomach, savoring the sensation of your seed seeping into $him. "That's it, make me a mommy." $He leans in close and you pop free of $his snatch. "Be a good boy and make this arcology a nice place for your bastard. I want to retire in luxury." $He blows you a kiss as $he stuffs a plug up $his vagina, redresses and heads on $his way. By the time you loosen your bindings, $he is long gone. + <br><br> + It would be prudent to up security in your arcology, that or take a guard along when you leave the penthouse. You can't allow such an indignity to happen again, nor do you need the stress of a bastard trying to seize control of your estate when you want to retire, but you wouldn't mind having your way with $him if you get the chance. <</if>> - <<if $PC.dick > 0>> - "I'm impressed. Your woman impression is quite good. Did you do the surgery yourself?" he mocks as he flicks the tip of your stiffening cock. "Still going to fuck you though." - <</if>> -<<case "celebrity">> - <<if $PC.boobs > 0>> - "Nice and supple. I wonder how many guys jacked off to your pictures?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "I can see how you got so popular!" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "How much tape did it take to hold this guy down?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "escort">> - <<if $PC.boobs > 0>> - "Nice and soft. How many dicks have been between these babies?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "What kind of whore doesn't know about protection?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "So, did you ever get to use this when you were a prostitute?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "servant">> - <<if $PC.boobs > 0>> - "Nice and supple. Bet your master spent a fortune making these so nice," he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Holding on to your master's final gift are you?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "When your master first undressed you, what did he think of his 'girl'?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<<case "BlackHat">> - <<if $PC.boobs > 0>> - "Nice and supple. What are the odds that I can find these babies on the internet?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "You'd think someone so skilled at breaking security would understand protection themselves. Or did you trade your pussy for information?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Trying to catch a signal with that?" he mocks as he flicks the tip of your stiffening cock. - <</if>> -<</switch>> - Finally he reaches your moistening pussy. "Already wet are we? Glad you know your place," he states as he pulls your clothes off and bends you over. -<br><br> -You can feel the head of his cock teasing your pussy lips; you hope it feels bigger than it really is. As he struggles to force it into you, you regret thinking about it. He must have undergone surgery or something because he fills you completely. You feel weak just from him sticking it in, you can't fathom what will happen once he starts thrusting. You soon find out as he wastes no time starting slow. He violently rams his oversized cock deep into you, threatening to penetrate your cervix with each thrust. He quickens his pace, fucking you like a beast.<<if $PC.preg < 1>><<if random(1,100) > 60>> His hand rises to your lips and forces something into your mouth. "Swallow it." You obey, hoping to just get this over with.<<set $PC.forcedFertDrugs += 3>><</if>> With one final thrust, he forces through your battered cervix and unloads in the depths of your <<if isPlayerFertile($PC)>>fertile <</if>>womb<<else>> With one final thrust, he forces it in as deep as he can into you and blows his seed deep in your aching cunt<</if>>. <<if $PC.preg >= 20 || $PC.belly >= 5000>>"Now your child<<if $PC.pregType > 1>>ren<</if>> will know what a real man's sperm is like!" <</if>>He shoves you to the ground, pussy gaping from the size of his shaft and leaking his huge load all over yourself. By the time you loosen your bindings, he is long gone. -<br><br> -It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Such a thing, happening to you. You can't allow such an indignity to happen again, you think to yourself, as you try to coax his sperm from your abused pussy.<<if isPlayerFertile($PC)>> For some reason your body feels really satisfied, despite not climaxing... Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure he didn't knock you up.<<= knockMeUp($PC, 100, 0, 0, 1)>><</if>> <<else>> -<br><br> -Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on them. + Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on $him. -<<set $contractCost = 1000>> -<<set $slaveCost = slaveCost($activeSlave)>> -<<set $slaveCost -= 1000>> -<br> -//Applying enslavement as punishment will cost <<print cashFormat($contractCost)>>. Doing so and then selling $him immediately will bring in approximately <<print cashFormat($slaveCost)>>.// -<br> -<<set $saleDescription = 1>><<include "Long Slave Description">> + <<set $contractCost = 1000>> + <<set $slaveCost = slaveCost($activeSlave)>> + <<set $slaveCost -= 1000>> + <br> + //Applying enslavement as punishment will cost <<print cashFormat($contractCost)>>. Doing so and then selling $him immediately will bring in approximately <<print cashFormat($slaveCost)>>.// + <br> + <<set $saleDescription = 1>><<include "Long Slave Description">> -<span id="result"> -<<if $cash >= $contractCost>> - <br><<link "Enslave $him">> - <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when $he wakes in the penthouse for basic slave induction. - <<include "New Slave Intro">> - <</replace>> - <</link>> - <br><<link "Sentence $him to a day in the stocks, then enslave $him">> - <<set $activeSlave.health -= 10>> - <<set $activeSlave.behavioralFlaw = "odd">> - <<set $activeSlave.sexualFlaw = "hates penetration">> - <<set $activeSlave.anus = 2>> - <<if $activeSlave.vagina > -1>> - <<set $activeSlave.vagina = 2>> - <<if random(1,100) > 60 && isFertile($activeSlave)>> - <<set $activeSlave.preg = 1>> - <<set $activeSlave.pregSource = -2>> + <span id="result"> + <<if $cash >= $contractCost>> + <br><<link "Enslave $him">> + <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> + <<replace "#result">> + You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when $he wakes in the penthouse for basic slave induction. + <<include "New Slave Intro">> + <</replace>> + <</link>> + <br><<link "Sentence $him to a day in the stocks, then enslave $him">> + <<set $activeSlave.health -= 10>> + <<set $activeSlave.behavioralFlaw = "odd">> + <<set $activeSlave.sexualFlaw = "hates penetration">> + <<set $activeSlave.anus = 2>> + <<if $activeSlave.vagina > -1>> + <<set $activeSlave.vagina = 2>> + <<if random(1,100) > 60 && isFertile($activeSlave)>> + <<set $activeSlave.preg = 1>> + <<set $activeSlave.pregSource = -2>> + <</if>> <</if>> - <</if>> - <<if $activeSlave.counter.publicUse>><<set $activeSlave.counter.publicUse += 47>><<else>><<set $activeSlave.counter.publicUse = 47>><</if>> - <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> - <<replace "#result">> - You declare $his holes fair game for the entire arcology. $He spends a torturous day in the stocks before being hauled in for enslavement, somewhat @@.red;the worse for wear@@ and @@.red;acting oddly@@ due to $his ordeal, bruises all over $his body, cum leaking from $his @@.lime;loosened@@ anus<<if $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ - <<run repX(500, "event")>> - <<set $arcologies[0].prosperity += 2>> - <<include "New Slave Intro">> - <</replace>> - <</link>> - <<if $arcade > 0>> - <br><<link "Enslave $him and sentence $him to a month in the arcade">> - <<= assignJob($activeSlave, "be confined in the arcade")>> - <<set $activeSlave.sentence = 4>> + <<if $activeSlave.counter.publicUse>><<set $activeSlave.counter.publicUse += 47>><<else>><<set $activeSlave.counter.publicUse = 47>><</if>> <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when $he awakes to find $he can't move and a dick is in $his ass. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + You declare $his holes fair game for the entire arcology. $He spends a torturous day in the stocks before being hauled in for enslavement, somewhat @@.red;the worse for wear@@ and @@.red;acting oddly@@ due to $his ordeal, bruises all over $his body, cum leaking from $his @@.lime;loosened@@ anus<<if $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + <<run repX(500, "event")>> + <<set $arcologies[0].prosperity += 2>> + <<include "New Slave Intro">> <</replace>> <</link>> - <</if>> - <<if $dairy > 0>> - <<if $dairyRestraintsSetting > 1>> - <br><<link "Enslave $him and send $him straight to the industrial dairy">> - <<= assignJob($activeSlave, "work in the dairy")>> + <<if $arcade > 0>> + <br><<link "Enslave $him and sentence $him to a month in the arcade">> + <<= assignJob($activeSlave, "be confined in the arcade")>> + <<set $activeSlave.sentence = 4>> <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up <<if $dairyStimulatorsSetting > 1>>in agony as $his anus takes the rectal hydration dildo<<else>>to find $his chest has begun swelling with milk<</if>>. - <<set $activeSlave.boobs += 300>> + You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when $he awakes to find $he can't move and a dick is in $his ass. <<run newSlave($activeSlave)>> /* skip New Slave Intro */ <</replace>> <</link>> <</if>> + <<if $dairy > 0>> + <<if $dairyRestraintsSetting > 1>> + <br><<link "Enslave $him and send $him straight to the industrial dairy">> + <<= assignJob($activeSlave, "work in the dairy")>> + <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> + <<replace "#result">> + You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up <<if $dairyStimulatorsSetting > 1>>in agony as $his anus takes the rectal hydration dildo<<else>>to find $his chest has begun swelling with milk<</if>>. + <<set $activeSlave.boobs += 300>> + <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + <</replace>> + <</link>> + <</if>> + <</if>> + <<if $farmyard > 0>> + <br><<link "Enslave $him and send $him straight to the farmyard">> + <<= assignJob($activeSlave, "work as a farmhand")>> + <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> + <<replace "#result">> + You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in $farmyardName, where $he will spend the rest of $his days working the fields<<if $farmyardShows == 1>> and <<if $seeBestiality == 1>>getting fucked by animals<<else>>putting on shows with animals<</if>><</if>>. + <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + <</replace>> + <</link>> + <</if>> + <<if $seeExtreme > 0>> + <br><<link "Punitively amputate $his limbs, and then enslave $him">> + <<set $activeSlave.health -= 20>> + <<set $activeSlave.amp = 1>> + <<set $activeSlave.heels = 0>> + <<set $activeSlave.behavioralFlaw = "odd">> + <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> + <<replace "#result">> + You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery. You take great pleasure in watching $him struggle as $his limbs are taken, one by one. Of course, @@.red;$his health is affected@@ and the horrible experience has left $him @@.red;acting oddly.@@ After $he has stabilized, it's off to the penthouse for basic slave induction. You'd like to see $him try and touch you again without arms and legs. + <</replace>> + <</link>> + <br><<link "Enslave the criminal and geld $him">> + <<set $activeSlave.health -= 20>> + <<set $activeSlave.balls = 0>> + <<set $activeSlave.devotion -= 25>> + <<set $activeSlave.trust -= 25>> + <<run newSlave($activeSlave)>> + <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> + <<replace "#result">> + You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery, taking the time to roughly fondle $his balls. You take great pleasure in watching $him struggle as $his testicles are removed. Once $he can stand again, it's off to the penthouse for basic slave induction. + <<include "New Slave Intro">> + <</replace>> + <</link>> + <</if>> + <<else>> + //You lack the necessary funds to enslave $him.// <</if>> - <<if $farmyard > 0>> - <br><<link "Enslave $him and send $him straight to the farmyard">> - <<= assignJob($activeSlave, "work as a farmhand")>> - <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in $farmyardName, where $he will spend the rest of $his days working the fields<<if $farmyardShows == 1>> and <<if $seeBestiality == 1>>getting fucked by animals<<else>>putting on shows with animals<</if>><</if>>. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ - <</replace>> - <</link>> - <</if>> - <<if $seeExtreme > 0>> - <br><<link "Punitively amputate $his limbs, and then enslave $him">> - <<set $activeSlave.health -= 20>> - <<set $activeSlave.amp = 1>> - <<set $activeSlave.heels = 0>> - <<set $activeSlave.behavioralFlaw = "odd">> - <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> - <<replace "#result">> - You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery. You take great pleasure in watching $him struggle as $his limbs are taken, one by one. Of course, @@.red;$his health is affected@@ and the horrible experience has left $him @@.red;acting oddly.@@ After $he has stabilized, it's off to the penthouse for basic slave induction. You'd like to see $him try and touch you again without arms and legs. - <</replace>> - <</link>> - <br><<link "Enslave the criminal and geld $him">> - <<set $activeSlave.health -= 20>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.devotion -= 25>> - <<set $activeSlave.trust -= 25>> - <<run newSlave($activeSlave)>> - <<run cashX(forceNeg($contractCost), "slaveTransfer", $activeSlave)>> - <<replace "#result">> - You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery, taking the time to roughly fondle $his balls. You take great pleasure in watching $him struggle as $his testicles are removed. Once $he can stand again, it's off to the penthouse for basic slave induction. - <<include "New Slave Intro">> - <</replace>> - <</link>> - <</if>> -<<else>> - //You lack the necessary funds to enslave $him.// -<</if>> -<br><<link "Publicly flog the criminal">> - <<replace "#result">> - Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public @@.green;approves of this harshness.@@ - <<run repX(500, "event")>> - <</replace>> -<</link>> -</span> + <br><<link "Publicly flog the criminal">> + <<replace "#result">> + Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public @@.green;approves of this harshness.@@ + <<run repX(500, "event")>> + <</replace>> + <</link>> + </span> <</if>> diff --git a/src/pregmod/saPorn.tw b/src/pregmod/saPorn.tw index 059e99f3b75f2564b1128e266ae9e88aa42cc115..05bfd40adffb1559923f757daf2f6647770c99fe 100644 --- a/src/pregmod/saPorn.tw +++ b/src/pregmod/saPorn.tw @@ -95,8 +95,9 @@ With your hacking skills, you manage to tweak search algorithms to display $his content more often. <<elseif $PC.hacking < 0>> With your lack of skill with computers you manage to misidentify $his content, complicating searches. + <<run IncreasePCSkills('hacking', 0.1)>> <</if>> - <<= IncreasePCSkills('hacking', 0.1)>> + <<run IncreasePCSkills('hacking', 0.1)>> /*Paraphilias have the highest take of viewers*/ <<if $slaves[$i].sexualFlaw == "neglectful">> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 64ab29229e4c19377646f55dee4ee3e9146f4457..0f03cc9220dd1712c3c1281f5428d02cb5076c05 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -9878,7 +9878,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<else>> to plan $his pregnancies. <</if>> - They'll happen when they happen, and until then $he'll take it up the butt like a good slut. $He @@.gold;nods and wipes $his eyes@@ even as + They'll happen when they happen, and until then $he'll take it up the butt like a good slut. $He @@.gold;nods and wipes $his eyes@@ even as <<if ($activeSlave.anus == 1)>> $he grimaces involuntarily at your painful use of $his tight butthole. <<elseif ($activeSlave.anus == 2)>> diff --git a/src/uncategorized/brothelReport.tw b/src/uncategorized/brothelReport.tw index d8e0843c6167e6dd2e87cad40cf2019ad73bfdee..6f372e433b9a4934bb8f18f3d9ce6e27d1a866c2 100644 --- a/src/uncategorized/brothelReport.tw +++ b/src/uncategorized/brothelReport.tw @@ -200,7 +200,7 @@ <<else>> <<run saWhore($slaves[$i])>> <</if>> - <br> $He whores $himself because $he doesn't have enough whores to manage to keep $him busy, and makes @@.yellowgreen;<<print cashFormat($Madam.lastWeeksCashIncome)>>@@. $He can charge more for $his time, since many citizens find it erotic to fuck the Madam. + <br> $He whores $himself because $he doesn't have enough whores to manage to keep $him busy, and makes @@.yellowgreen;<<print cashFormat($Madam.lastWeeksCashIncome)>>.@@ $He can charge more for $his time, since many citizens find it erotic to fuck the Madam. <<set _profits += $cash-_oldCash, _oldCash = $cash>> <</if>> <</if>> diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw index 4e84a795b3ca10e7e9aca18c3e6a57bd7a8f9733..d356b58a95ece518d12c6492f77f4b1de11b2378 100644 --- a/src/uncategorized/nextWeek.tw +++ b/src/uncategorized/nextWeek.tw @@ -1,6 +1,8 @@ :: Next Week [nobr] -<<run delete $storedReturn>> +<<if def $storedReturn>> <<run delete $storedReturn>> <</if>> +<<run delete $storedLink>> +<<run delete $storedButton>> <<set $HackingSkillMultiplier = HackingSkillMultiplier()>> <<set $upgradeMultiplierArcology = upgradeMultiplierArcology()>> <<set $upgradeMultiplierMedicine = upgradeMultiplierMedicine()>> @@ -190,7 +192,7 @@ <</if>> <</if>> <<if $slaves[_i].missingLegs == 3>> - <<set $slaves[_i].heels = 0, $slaves[_i].shoes = "none", $slaves[_i].legsAccessory = "none", $slaves[_i].legsTat = 0, $slaves[_i].heightImplant = 0>> + <<set $slaves[_i].heels = 0, $slaves[_i].shoes = "none", $slaves[_i].legAccessory = "none", $slaves[_i].legsTat = 0, $slaves[_i].heightImplant = 0>> <<if (["ankles", "calves", "feet", "left ankle", "left calf", "left foot", "left thigh", "right ankle", "right calf", "right foot", "right thigh", "thighs"]includes($slaves[_i].brandLocation))>> <<set $slaves[_i].brand = 0>> <<set $slaves[_i].brandLocation = 0>> diff --git a/src/uncategorized/nonRandomEvent.tw b/src/uncategorized/nonRandomEvent.tw index 53b1c01c423af4d7ff094d43275c1b6159bbeb91..7d2ed0fe284f90905d77266275c13914ca042083 100644 --- a/src/uncategorized/nonRandomEvent.tw +++ b/src/uncategorized/nonRandomEvent.tw @@ -20,7 +20,7 @@ <<elseif (_effectiveWeek == 11)>> <<set $Event = "assistant">> <<goto "Assistant Events">> -<<elseif (_effectiveWeek == 12) && $PC.vagina > 0 && $raped == -1 && $arcologyUpgrade.drones != 1 && $Bodyguard == 0 && $PC.career != "arcology owner">> +<<elseif (_effectiveWeek == 12) && $raped == -1 && $arcologyUpgrade.drones != 1 && $Bodyguard == 0 && $PC.career != "arcology owner">> <<goto "P raped">> <<elseif (_effectiveWeek == 14) && $badC != 1>> <<set _valid = $slaves.find(function(s) { return s.curatives > 1 || s.inflationType == "curative"; })>> @@ -173,7 +173,7 @@ <<goto "secExpSmilingMan">> <<elseif $rivalOwner == 0 && $smilingManProgress == 3 && $secExp == 1>> <<goto "secExpSmilingMan">> -<<elseif ($rivalOwner == 0) && ($FCNNstation == 0) && ($week > 95) && ($cash > 200000) && ($rep > 7500)>> +<<elseif ($rivalOwner == 0) && ($seeFCNN == 1) && ($FCNNstation == 0) && ($week > 95) && ($cash > 200000) && ($rep > 7500)>> <<goto "SE FCNN Station">> <<else>> <<if random(1,100) > _effectiveWeek+25>> diff --git a/src/uncategorized/options.tw b/src/uncategorized/options.tw index 697477e0adb55e8862fba13e3239b771b3ae1df4..87ff5f61f9ef566ebef0d60a847c8e0e82850c59 100644 --- a/src/uncategorized/options.tw +++ b/src/uncategorized/options.tw @@ -1,23 +1,23 @@ :: Options [nobr] -<<if $storedReturn === undefined>> <<set $storedReturn = "">> <</if>> +<<if ndef $storedLink>> <<set $storedLink = "">> <</if>> +<<if ndef $storedButton>> <<set $storedButton = "">> <</if>> <<set $showEncyclopedia = 0>> <<if lastVisited("attackReport") === 1>> - <<set $storedReturn = "attackReport">> - <<set $nextButton = "Back", $nextLink = "attackReport" || $storedReturn>> + <<set $storedButton = "Back">> + <<set $storedLink = "attackReport">> <<elseif lastVisited("rebellionReport") === 1>> - <<set $storedReturn = "rebellionReport">> - <<set $nextButton = "Back", $nextLink = "rebellionReport" || $storedReturn>> + <<set $storedButton = "Back">> + <<set $storedLink = "rebellionReport">> <<elseif lastVisited("Slave Assignments Report") === 1>> - <<set $storedReturn = "Slave Assignments Report">> - <<set $nextButton = "Back", $nextLink = "Slave Assignments Report" || $storedReturn>> -<<elseif lastVisited("Economics") === 1>> - <<set $storedReturn = "Economics">> - <<set $nextButton = "Back", $nextLink = "Economics" || $storedReturn>> -<<elseif passage() === "Options" && $storedReturn === "">> - <<set $nextButton = "Back to Main", $nextLink = "Main">> + <<set $storedButton = "Back">> + <<set $storedLink = "Slave Assignments Report">> +<<elseif passage() === "Options" && $storedLink === "" && $storedButton === "">> + <<set $storedButton = "Back to Main">> + <<set $storedLink = "Main">> <</if>> +<<set $nextButton = $storedButton, $nextLink = $storedLink>> ''SAVES'' <br> This save was created using FC version $ver build $releaseID. @@ -95,7 +95,7 @@ Image display <</if>><br> Clothing erection bulges <<if $showClothingErection>> - @@.cyan;ENABLED@@. [[Disable|Options][$showClothingErection = 0]] + @@.cyan;ENABLED.@@ [[Disable|Options][$showClothingErection = 0]] <<else>> @@.red;DISABLED.@@ [[Enable|Options][$showClothingErection = 1]] <</if>> diff --git a/src/uncategorized/recETS.tw b/src/uncategorized/recETS.tw index 97a274340dcc6be80293e405a589af47439dbb05..69841a11dcc3aa795f3037bb3630db41b560325b 100644 --- a/src/uncategorized/recETS.tw +++ b/src/uncategorized/recETS.tw @@ -34,8 +34,9 @@ <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> <<set $fixedRace = _races.random()>> <</if>> -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "She sold herself into slavery to escape addiction debts.">> +<<set $activeSlave = GenerateNewSlave("XX")>> +<<set $activeSlave.origin = "$He sold $himself into slavery to escape addiction debts.">> +<<set $activeSlave.career = setup.uneducatedCareers.random()>> <<set $activeSlave.devotion = random(-15,15)>> <<set $activeSlave.trust = random(-15,15)>> <<set $activeSlave.oldDevotion = $activeSlave.devotion>> @@ -744,7 +745,8 @@ <<case "addict mother daughter">> -<<set $activeSlave.origin = "You tricked her mother into selling her into slavery to clear addiction debts.">> +<<set $activeSlave.origin = "You tricked $his mother into selling $him into slavery to clear addiction debts.">> +<<set $activeSlave.career = setup.uneducatedCareers.random()>> <<set $activeSlave.slaveName = $activeSlave.birthName>> <<set $activeSlave.ID = $activeSlave.ID + 1000>> <<set $activeSlave.devotion += 10>> @@ -1799,7 +1801,7 @@ This call is coming from a public kiosk, which is usually an indication that the <<case "incest sister sister">> They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse. <<case "incest twin brother">> - They hug each other tightly as the they slip a hand down the other's pants. They ought to be an interesting addition to your penthouse. + They hug each other tightly as they slip a hand down the other's pants. They ought to be an interesting addition to your penthouse. <<case "incest twin sister">> They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse. <<case "incest twins mixed">> diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw index d8a5ee9159cd21ec47bfb55cd34ca347dbc28584..50bdc8a4c0db51facdf74e0990e167ca78281670 100644 --- a/src/uncategorized/remoteSurgery.tw +++ b/src/uncategorized/remoteSurgery.tw @@ -1483,7 +1483,7 @@ Deal with $his hair: $He is no longer capable of growing hair on $his head. <</if>> <br> -<<if ($activeSlave.eyebrowStyle != "bald")>> +<<if ($activeSlave.eyebrowHStyle != "bald")>> $He has $activeSlave.origHColor eyebrows. [["Surgically remove " + $his + " ability to grow eyebrows"|Surgery Degradation][cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave),$surgeryType = "eyebrow removal"]] <<else>> diff --git a/src/uncategorized/reputation.tw b/src/uncategorized/reputation.tw index 500c6c15b751cd745b99be6ce7e5cd5651add762..da4ea4c2e3beaebe5f7261688efa0034e0ff0b67 100644 --- a/src/uncategorized/reputation.tw +++ b/src/uncategorized/reputation.tw @@ -702,7 +702,7 @@ On formal occasions, you are announced as $PCTitle. <</if>> <<if $FCNNstation == 1>> - Playing host to the Free Cities News Network brings @@.green;approval@@ by those who still consider freedom of the press a virtue. + Playing host to the Free Cities News Network brings @@.green;approval@@ from those who still consider freedom of the press a virtue. <<run repX(500, "policies")>> <</if>> diff --git a/src/uncategorized/resFailure.tw b/src/uncategorized/resFailure.tw index eba52bb6c8d27de68a682c8d07114bf9c40d529d..326b8ec64e6addb2741c36054197d6fe5f1739f9 100644 --- a/src/uncategorized/resFailure.tw +++ b/src/uncategorized/resFailure.tw @@ -372,7 +372,7 @@ <<set $activeSlave.health = random(60,80)>> <<set $activeSlave.devotion = random(60,75)>> <<set $activeSlave.trust = random(60,75)>> - <<set $activeSlave.intelligenceImplant = 30; + <<set $activeSlave.intelligenceImplant = 30>> <<if $NUL.schoolUpgrade == 1>> <<set $activeSlave.intelligence = random(50, 70)>> <<set $activeSlave.skill.whoring = random(70, 80)>> @@ -385,7 +385,7 @@ <<if $NUL.schoolUpgrade == 2>> <<set $activeSlave.skill.anal = random(60, 80)>> <<set $activeSlave.skill.oral = random(70, 90)>> - <<set $activeSlave.anus = random(1, 3); + <<set $activeSlave.anus = random(1, 3)>> <<else>> <<set $activeSlave.skill.anal = random(10, 30)>> <<set $activeSlave.skill.oral = random(20, 40)>> @@ -402,10 +402,10 @@ <<set $activeSlave.balls = 0>> <<set $activeSlave.preg = 0>> <<set $activeSlave.eyebrowHStyle = "bald">> - <<set $activeSlave.armpitHStyle = "bald">> + <<set $activeSlave.underArmHStyle = "bald">> <<set $activeSlave.pubicHStyle = "bald">> <<set $activeSlave.hStyle = "bald">> - <<set $activeSlave.customTat = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder.">> + <<set $activeSlave.custom.tattoo = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder.">> <<run newSlave($activeSlave)>> /* skip New Slave Intro */ <</for>> <<elseif $RESFailure == "TGA">> diff --git a/src/uncategorized/saLiveWithHG.tw b/src/uncategorized/saLiveWithHG.tw index 3ca0fd491f896d4d3e9088a4a4c119eab8f3784d..aea2b0d5ff6acdabbeb29f1078a2831c6e094ac9 100644 --- a/src/uncategorized/saLiveWithHG.tw +++ b/src/uncategorized/saLiveWithHG.tw @@ -870,12 +870,9 @@ <<elseif ($HeadGirl.fetishKnown == 1) && ($HeadGirl.fetish == "cumslut") && $slaves[$i].balls < 10 && $slaves[$i].balls > 0 && $slaves[$i].dick > 0>> $HeadGirl.slaveName gives $slaves[$i].slaveName testicle injections, since _he2 wants $slaves[$i].slaveName shooting bigger loads. <<set $slaves[$i].drugs = "testicle enhancement">> - <<elseif ($HeadGirl.fetishKnown == 1) && ($HeadGirl.fetish == "masochist") && $slaves[$i].height < Math.clamp((Height.mean($slaves[$i]) * 1.25),0,274)>> + <<elseif ($HeadGirl.fetishKnown == 1) && ($HeadGirl.fetish == "masochist" || $HeadGirl.fetish == "submissive") && $slaves[$i].geneticQuirks.dwarfism == 2 && $slaves[$i].geneticQuirks.gigantism != 2 && $slaves[$i].height < Math.clamp((Height.mean($slaves[$i]) * 1.25),0,274)>> $HeadGirl.slaveName has a subconscious need to be hurt by the biggest, strongest $girl possible, so $he gives $slaves[$i].slaveName injections of growth stimulants to make $him grow taller. <<set $slaves[$i].drugs = "growth stimulants">> - <<elseif ($HeadGirl.fetishKnown == 1) && ($HeadGirl.fetish == "submissive") && $slaves[$i].height < Math.clamp((Height.mean($slaves[$i]) * 1.25),0,274)>> - $HeadGirl.slaveName has a subconscious need to be dominated by the biggest, strongest $girl possible, so $he gives $slaves[$i].slaveName injections of growth stimulants to make $him grow taller. - <<set $slaves[$i].drugs = "growth stimulants">> <<elseif ($HeadGirl.fetishKnown == 1) && ($HeadGirl.fetish == "boobs") && ($slaves[$i].boobs < 8000)>> $HeadGirl.slaveName gives $slaves[$i].slaveName <<if $arcologies[0].FSAssetExpansionistResearch == 1>>hyper <</if>> tit injections, since as far as _he2's concerned there's no such thing as too much boob. <<if $arcologies[0].FSAssetExpansionistResearch == 1>> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index bd587df7dac934c87e83b164bf1adcbbef563856..b17f823c62a3d07dcd78162c29e8cef6b10d68ff 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -1068,7 +1068,7 @@ <</if>> <</if>> <<if $growthStim == 1>> - <<if ($activeSlave.height < 274 || ($activeSlave.height < 160 && $activeSlave.geneticQruirks.dwarfism == 2 && $activeSlave.geneticQruirks.gigantism != 2)) && $activeSlave.height < Math.clamp((Height.mean($activeSlave) * 1.25),0,274)>> + <<if ($activeSlave.height < 274 || ($activeSlave.height < 160 && $activeSlave.geneticQuirks.dwarfism == 2 && $activeSlave.geneticQuirks.gigantism != 2)) && $activeSlave.height < Math.clamp((Height.mean($activeSlave) * 1.25),0,274)>> | <<link "Growth stimulants">><<set $activeSlave.drugs = "growth stimulants">><<SlaveInteractDrugs>><</link>> <<else>> | Growth stimulants diff --git a/src/uncategorized/storyCaption.tw b/src/uncategorized/storyCaption.tw index ebdc8e7d06eeaedb29bc9c49f009dea27afaceb8..46ef284601db7b682d80ea91e35c7b7a4f175662 100644 --- a/src/uncategorized/storyCaption.tw +++ b/src/uncategorized/storyCaption.tw @@ -72,12 +72,6 @@ <</if>> <br><br> -<<if $newModelUI == 0>> - <<if _Pass == "Main">> - <span id="manageArcology"><<link "Manage Arcology">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Arcology">><</link>></span> @@.cyan;[C]@@ - <</if>> - <br> -<</if>> <<set $cash = Math.trunc($cash)>> <span id="cash"> <<if $cash > 0>> @@ -458,6 +452,18 @@ <</if>> <<if (_Pass == "Main")>> <<if $newModelUI == 0>> + <br><span id="policyButton"><<link [[Policies]]>><<set $nextButton = "Back", $nextLink = "Manage Corporation">><</link>></span> @@.cyan;[Y]@@ + <br><span id="URButton"><<link [[Universal Rules]]>><</link>></span> @@.cyan;[V]@@ + <<if $FSAnnounced>> + <br><span id="FSButton"><<link [[Future Societies|Future Society]]>><<set $nextButton = "Back", $nextLink = "Main">><</link>></span> @@.cyan;[F]@@ <<if ($FSCredits > 0) || ($FSReminder)>>@@.yellow;[!]@@<</if>> + <</if>> + <br><span id="PAOButton"><<link [[Personal Assistant|Personal assistant options]]>><</link>></span> @@.cyan;[T]@@<br> + + <<if $corpAnnounced == 1>><br><span id="manageCorporation"><<link "Manage Corporation">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Corporation">><</link>><<if ($corpSpecToken > 0) && ($corpSpecTimer == 0)>>@@.yellow;[!]@@<</if>></span><</if>> + <br><span id="manageArcology"><<link "Manage Arcology">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Arcology">><</link>></span> @@.cyan;[C]@@ + <br><span id="managePenthouse"><<link "Manage Penthouse">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Penthouse">><</link>></span> @@.cyan;[P]@@ + <br><span id="managePerson"><<link "Manage Personal Affairs">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Personal Affairs">><</link>></span> @@.cyan;[X]@@<br> + <<if ($HGSuite)>> <br> <<link "$HGSuiteNameCaps""Head Girl Suite">><</link>> <<if $abbreviateSidebar == 2>> @@ -587,11 +593,7 @@ <</if>> <br> <</if>> - - <<if $SF.Toggle && $SF.Active >= 1>> - <br><span id="SFMButton"> <<link "$SF.Caps's firebase""Firebase">><</link>> </span> @@.cyan;[Z]@@ - <</if>> - <<else>> + <<else>> /* $newModelUI === 1 */ <br><span id="policyButton"><<link [[Policies]]>><<set $nextButton = "Back", $nextLink = "Manage Corporation">><</link>></span> @@.cyan;[Y]@@ <br><span id="URButton"><<link [[Universal Rules]]>><</link>></span> @@.cyan;[V]@@ <<if $FSAnnounced>> @@ -694,8 +696,8 @@ <br> <</if>> -<<if $nextButton !== "Continue" && _Pass !== "Options" || ["Economics","Slave Assignments Report","attackReport","rebellionReport"].includes(passage())>> - <br><br> +<<if $nextButton !== "Continue" && _Pass !== "Options" || ["attackReport","rebellionReport","Slave Assignments Report"].includes(passage())>> + <<if ["attackReport","rebellionReport","Slave Assignments Report","Main"].includes(passage())>> <br> <</if>> <br> <span id="optionsButton"> <<link "Game Options">> <<set $nextButton = "Back", $nextLink = _Pass>> diff --git a/src/uncategorized/surgeryDegradation.tw b/src/uncategorized/surgeryDegradation.tw index 77d2a601bdf9c67c0bfc9db509ee29b65f705dd7..83b94533fcbb7b360bca5e8a8610a99e1276cf24 100644 --- a/src/uncategorized/surgeryDegradation.tw +++ b/src/uncategorized/surgeryDegradation.tw @@ -136,9 +136,9 @@ As the remote surgery's long recovery cycle completes, <<run SetBellySize($activeSlave)>> your new Fuckdoll <<if ($activeSlave.amp != 1)>>stumbles<<else>>is carried<</if>> out of the surgery room. The only <<if $activeSlave.vagina > -1>>areas of skin visible are those around its vulva and anus<<else>>area of skin visible is that around its anus<</if>><<if $activeSlave.lips > 95>>, though its lips are also visible as its facepussy makes the standard Fuckdoll mouth insert unnecessary<</if>>. You can see it starting to struggle against the constricting material of the Fuckdoll suit as the sedation wears off. Other than the tiny area of exposed skin and the slight movement, there's no indication that the sex doll in front of you is alive at all. <<elseif $surgeryType == "fuckdollExtraction">> - $activeSlave.slaveName <<if ($activeSlave.amp != 1)>>walks<<else>>is carried<</if>> out of the surgery room. + $activeSlave.slaveName <<if $activeSlave.amp == 1>>is carried<<elseif canWalk($activeSlave)>>walks<<else>>is escorted<</if>> out of the surgery room. <<else>> - $activeSlave.slaveName <<if ($activeSlave.amp != 1)>>walks<<else>>is carried<</if>> out of the surgery room<<if canSee($activeSlave)>> and catches sight of $himself in the floor-length mirror outside the door<<else>> and is detailed the modifications done to $his body, assuming $he hasn't already realized them<</if>>. + $activeSlave.slaveName <<if $activeSlave.amp == 1>>is carried<<elseif canWalk($activeSlave)>>walks<<else>>is escorted<</if>> out of the surgery room<<if canSee($activeSlave)>> and catches sight of $himself in the floor-length mirror outside the door<<else>> and is detailed the modifications done to $his body, assuming $he hasn't already realized them<</if>>. <</if>> <<switch $surgeryType>> @@ -2511,7 +2511,7 @@ As the remote surgery's long recovery cycle completes, <<case "eyebrow removal">> <<set $activeSlave.eyebrowHStyle = "bald">> - When $he <<if $activeSlave.amp == 1>>is carried<<else>>walks<</if>> out of the surgery $he feels the breeze on $his face and realizes that $his eyebrows are gone, permanently. + When $he <<if $activeSlave.amp == 1>>is carried<<elseif canWalk($activeSlave)>>walks<<else>>is escorted<</if>> out of the surgery $he feels the breeze on $his face and realizes that $his eyebrows are gone, permanently. <<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0>> <br> <<if $activeSlave.devotion > 50>> @@ -2530,7 +2530,7 @@ As the remote surgery's long recovery cycle completes, <<case "hair removal">> <<set $activeSlave.hStyle = "bald">> <<set $activeSlave.eyebrowHStyle = "bald">> - When $he <<if $activeSlave.amp == 1>>is carried<<else>>walks<</if>> out of the surgery $he immediately notices the chill on $his head and realizes that $he is bald. + When $he <<if $activeSlave.amp == 1>>is carried<<elseif canWalk($activeSlave)>>walks<<else>>is escorted<</if>> out of the surgery $he immediately notices the chill on $his head and realizes that $he is bald. <<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0>> <br> <<if $activeSlave.devotion > 50>> @@ -2666,7 +2666,7 @@ As the remote surgery's long recovery cycle completes, <<else>>anxious about what you did to $him, dreading the news. <</if>> <<else>> - Over the course of the treatment, $he begins to feel the initial effects and on inspection, when $he <<if $activeSlave.amp == 1>>is carried<<else>>walks<</if>> out of the surgery room, $he feels somehow smaller and changed in <<if _numberChanges == 1>>at least one way<<elseif _numberChanges == 2>>two ways<<else>>several ways<</if>>.<br><br> + Over the course of the treatment, $he begins to feel the initial effects and on inspection, when $he <<if $activeSlave.amp == 1>>is carried<<elseif canWalk($activeSlave)>>walks<<else>>is escorted<</if>> out of the surgery room, $he feels somehow smaller and changed in <<if _numberChanges == 1>>at least one way<<elseif _numberChanges == 2>>two ways<<else>>several ways<</if>>.<br><br> <<if _hair != ''>>_hair<</if>> <<if _genitalChanges.length > 0>> $He can _sense that $his junk is different now, it seems $his diff --git a/src/utility/miscWidgets.tw b/src/utility/miscWidgets.tw index d6741490e41e7b379921c65d03cc43bb61623fb0..2feac3836f0110f94fda9bce0cc1af5022eb4810 100644 --- a/src/utility/miscWidgets.tw +++ b/src/utility/miscWidgets.tw @@ -193,7 +193,7 @@ <</if>> <</if>> <<if $growthStim == 1>> - <<if ($activeSlave.height < 274 || ($activeSlave.height < 160 && $activeSlave.geneticQruirks.dwarfism == 2 && $activeSlave.geneticQruirks.gigantism != 2)) && $activeSlave.height < Math.clamp((Height.mean($activeSlave) * 1.25),0,274)>> + <<if ($activeSlave.height < 274 || ($activeSlave.height < 160 && $activeSlave.geneticQuirks.dwarfism == 2 && $activeSlave.geneticQuirks.gigantism != 2)) && $activeSlave.height < Math.clamp((Height.mean($activeSlave) * 1.25),0,274)>> | <<link "Growth Stimulants">><<set $activeSlave.drugs = "growth stimulants">><<SlaveInteractDrugs>><</link>> <<else>> | Growth Stimulants