diff --git a/devNotes/VersionChangeLog-Premod+LoliMod.txt b/devNotes/VersionChangeLog-Premod+LoliMod.txt index 0e74c4bd45ab5e664f358282b40a2d8bcd17dfe8..2e2de81ad3ebfd43b8b8fc4d3808c650c100cc13 100644 --- a/devNotes/VersionChangeLog-Premod+LoliMod.txt +++ b/devNotes/VersionChangeLog-Premod+LoliMod.txt @@ -2,6 +2,13 @@ Pregmod 0.10.7.1-2.1.x +02/08/2019 + + 6 + -fixes + -cleaning + -adjustments to secEx balances + 02/06/2019 5 diff --git a/devTools/PreCompile.sh b/devTools/PreCompile.sh index c41e7a442c21999a5147fceeeea53505db3212ba..b6dad7de5c3b501b4b051c7134df2e9aed45cd7e 100755 --- a/devTools/PreCompile.sh +++ b/devTools/PreCompile.sh @@ -1,8 +1,8 @@ -#!/bin/sh -x='bin/*.*' V=00 #Additional packages required: MEGAcmd,minify,git. U=$1 P=$2 scrtDir=$3 remtDir=$4 locDir=$5 repo=$6 -echo "Fresh clone? 0:y 1:n 2:na" && read Opt;clear;mega-login $U $P >/dev/null -while true;do ls $5 >/dev/null 2>&1 && if [[ $? == 0 ]];then cd $5 >/dev/null 2>&1;fi - if [[ $Opt == 0 ]];then mkdir $5 && git clone -q --no-tags --depth 1 $6 $5 && cd $5 && if [ `git log -1|grep commit|cut -c 8-13` != $V ];then sed -Ei "s/V=$V/V=$(git log -1|grep commit|cut -c 8-13)/" $3/$0 && gen=1;fi - elif [[ $Opt > 0||$gen < 1 ]];then git fetch -q && if [ `git rev-list HEAD...origin/pregmod-master --count` -gt 0 ];then git reset -q --hard $V && git pull -q && sed -Ei "s/V=$V/V=$(git log -1|grep commit|cut -c 8-13)/" $3/$0 && gen=1;fi ;fi #sources: stackoverflow.com/a/17192101,stackoverflow.com/a/3675181. - if [[ $Opt > 1||$gen > 0 ]];then rm $x 2>/dev/null;minify -rao $5 $5 && ./compile --insane 1>/dev/null && minify -o $x $x && mv $x bin/"FC-pregmod-$(git log -1 --format='%cd' --date='format:%d-%m-%Y-%H-%M')-$(git log -1|grep commit|cut -c 8-13)".html && mega-put -c $x $4 && if [[ `mega-ls GitFC/|wc -l` -gt 10 && $y < 1 ]];then mega-ls $4|tail -n +11|while read link;do mega-rm $4$link && y=1;done;fi; fi +#!/bin/sh +x=bin/* #Packages required: MEGAcmd,minify,git. U=$1 P=$2 remtDir=$3 locDir=$4 repo=$5 +echo 'New clone? 0:y 1:n 2:na';read Opt;clear;mega-login $U $P >/dev/null +while true;do cd $4 2>/dev/null && if [ $? -eq 0 ];then cd $4;fi + if [ $Opt -eq 0 ];then A=[$(mega-ls $3/|cut -c 29-|sed s/.html//|paste -sd,"")];mkdir -p $4 && git clone -q --no-tags --depth 1 $5 $4 && cd $4 && V=$(git log -1|grep comm|cut -c 8-11);if [[ ! " ${A[@]} " =~ " ${V} " ]];then gen=1;fi #arraryCheck:stackoverflow.com/a/15394738 + elif [[ $Opt > 0||$gen < 1 ]];then git fetch -q;if [ `git rev-list HEAD...origin/pregmod-master --count` -gt 0 ];then git reset -q --hard HEAD && git pull -q && gen=1;fi ;fi #gitCheck:stackoverflow.com/a/17192101 + if [[ $Opt > 1||$gen > 0 ]];then rm $x 2>/dev/null;minify -rao $4 $4 && ./compile --insane >/dev/null && mv $x bin/FC-pregmod-$(git log -1 --format='%cd' --date='format:%d-%m-%Y-%H-%M')-$(git log -1|grep comm|cut -c 8-11).html && mega-put -c $x $3 && if [ `mega-ls $3|wc -l` -gt 10 ];then mega-rm $3$(mega-ls $3|sort -r|tail -n +11);fi ; fi gen=0;Opt=-1;sleep 15m;done \ No newline at end of file diff --git a/devTools/sugarcube.d.ts b/devTools/sugarcube.d.ts index e24730b925d5e1512cd86b7d6cba86169c7ed0c5..644ea40581dde3220c8516d4e4653c353bdfd9a8 100644 --- a/devTools/sugarcube.d.ts +++ b/devTools/sugarcube.d.ts @@ -1310,6 +1310,7 @@ declare namespace SugarCubeLib { declare interface ISugarCube { Config: Config; Macro: Macro; + Save: Save; State: State; Story: Story; /** diff --git a/src/002-config/fc-js-init.js b/src/002-config/fc-js-init.js index ec07dba98be3edcd26bfbcce88e9f63aeb14728a..3966b6a6838ea330e47c7d820179af8e68340f75 100644 --- a/src/002-config/fc-js-init.js +++ b/src/002-config/fc-js-init.js @@ -5,6 +5,7 @@ */ window.App = { }; // the same declaration for code parsers that don't line the line above -var App = App || {}; +var App = window.App || {}; +App.Debug = {}; App.Entity = {}; diff --git a/src/SecExp/attackGenerator.tw b/src/SecExp/attackGenerator.tw index 84a1b9eed1d5c77d57dd34612f00215d88529173..94776671c3fc8efec2a1574b488fc59892aa240b 100644 --- a/src/SecExp/attackGenerator.tw +++ b/src/SecExp/attackGenerator.tw @@ -128,95 +128,50 @@ <<set $battleTerrain = "error">> <</if>> - <<if $attackType == "raiders">> - <<set $attackTroops = random(40,80)>> - <<if $week < 30>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (2*(4+($week/30))) ))>> - <<elseif $week < 60>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30))) ))>> - <<else>> - <<set $attackTroops *= Math.ceil(random( (3*(2+($week/40))) , (5*(4+($week/30))) ))>> - <</if>> - <<if $week < 60>> - <<set $attackEquip = Math.ceil(random( (0, (1*(4+($week/25))>> - <<elseif $week < 90>> - <<set $attackEquip = Math.ceil(random( (0, (2*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackEquip = Math.ceil(random( (0, (3*(4+($week/30))) ))>> - <<else>> - <<set $attackEquip = Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <</if>> - <<elseif $attackType == "free city">> - <<set $attackTroops = random(20,40)>> - <<if $week < 30>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (2*(4+($week/30))) ))>> - <<elseif $week < 60>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (3*(4+($week/30)))) )>> - <<elseif $week < 120>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30)))) )>> - <<else>> - <<set $attackTroops *= Math.ceil(random( (3*(2+($week/40))) , (5*(4+($week/30))) ))>> - <</if>> - <<if $week < 60>> - <<set $attackEquip = Math.ceil(random( (0, (1*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackEquip = Math.ceil(random( (0, (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackEquip = Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<else>> - <<set $attackEquip = Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30))) ))>> - <</if>> - <<elseif $attackType == "old world">> - <<set $attackTroops = random(25,50)>> - <<if $week < 30>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (2*(4+($week/30))) ))>> - <<elseif $week < 60>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30))) ))>> - <<else>> - <<set $attackTroops *= Math.ceil(random( (3*(2+($week/40))) , (5*(4+($week/30))) ))>> - <</if>> - <<if $week < 60>> - <<set $attackEquip = Math.ceil(random( (0, (1*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackEquip = Math.ceil(random( (0, (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackEquip = Math.ceil(random( (1,3*(4+($week/30))) ))>> - <<else>> - <<set $attackEquip = Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30))) ))>> - <</if>> + <<set _L0=3,_L1=45>> + <<if $attackType == "raiders">> <<set $attackTroops = random(40,80)>> + <<elseif $attackType == "free city">> <<set $attackTroops = random(20,40)>> + <<elseif $attackType == "old world">> <<set $attackTroops = random(25,50)>> <<elseif $attackType == "freedom fighters">> - <<set $attackTroops = random(30,60)>> - <<if $week < 30>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (2*(4+($week/30))) ))>> - <<elseif $week < 60>> - <<set $attackTroops *= Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackTroops *= Math.ceil(random( (2*(2+($week/40))) , (4*(4+($week/30))) ))>> - <<else>> - <<set $attackTroops *= Math.ceil(random( (3*(2+($week/40))) , (5*(4+($week/30))) ))>> - <</if>> - <<if $week < 60>> - <<set $attackEquip = Math.ceil(random( (0, (1*(4+($week/30))) ))>> - <<elseif $week < 90>> - <<set $attackEquip = Math.ceil(random( (0, (3*(4+($week/30))) ))>> - <<elseif $week < 120>> - <<set $attackEquip = Math.ceil(random( (1*(2+($week/40))) , (3*(4+($week/30))) ))>> - <<else>> - <<set $attackEquip = Math.ceil(random( (2*(2+($week/40))), (4*(4+($week/30))) ))>> + <<set $attackTroops = random(30,60),_L0=1,_L1=60>> + <</if>> + <<if $week < 30>> + <<set $attackTroops *= Math.ceil(random( (1*(1.15+($week/203))), (2*(1+($week/149))) ))>> + <<elseif $week < 60>> + <<set $attackTroops *= Math.ceil(random( (1*(1.25+($week/135))), (3*(1.5+($week/99))) ))>> + <<elseif $week < 90>> + <<set $attackTroops *= Math.ceil(random( (2*(1.35+($week/90))), (3*(2+($week/66))) ))>> + <<elseif $week < 120>> + <<set $attackTroops *= Math.ceil(random( (2*(1.5+($week/60))), (4*(3+($week/45))) ))>> + <<else>> + <<set $attackTroops *= Math.ceil(random( (3*(2+($week/40))), (5*(4+($week/30))) ))>> + <</if>> + <<if $week < 60>> + <<set $attackEquip = Math.ceil(random( (0, (1*(1.5+($week/99))) ))>> + <<elseif $week < 90>> + <<set $attackEquip = Math.ceil(random( (0, (3*(2+($week/66))) ))>> + <<elseif $week < 120>> + <<set $attackEquip = Math.ceil(random( (0, (_L0*(_L0+($week/_L1))) ))>> + <<else>> + <<set $attackEquip = Math.ceil(random( (2*(2+($week/40))), (4*(4+($week/30))) ))>> + <</if>> + + /* major battles have a 50% chance of firing after week 120 */ + <<if $majorBattlesEnabled == 1>> + <<if ($week >= 120 && $attackType != "none") || ($forceMajorBattle == 1 && $foughtThisWeek == 0)>> + <<if random(1,100) >= 50 || $forceMajorBattle == 1>> + <<set $majorBattle = 1>> + <<if $SF.Toggle && $SF.Active >= 1>> + <<set $attackTroops = Math.trunc($attackTroops * random(4,6) * $majorBattleMult)>> + <<set $attackEquip = either(3,4)>> + <<else>> + <<set $attackTroops = Math.trunc($attackTroops * random(2,3) * $majorBattleMult)>> + <<set $attackEquip = either(2,3,4)>> + <</if>> + <</if>> <</if>> <</if>> + <<set $estimatedMen = Math.round($attackTroops * (1 + either(-1,1) * (random(3,4) - $recon) * 0.1))>> <<if $recon == 3>> <<set $expectedEquip = $attackEquip + random(-1,1)>> @@ -227,30 +182,4 @@ <<else>> <<set $expectedEquip = $attackEquip + random(-2,3)>> <</if>> -<</if>> - -/* major battles have a 50% chance of firing after week 120 */ -<<if $majorBattlesEnabled == 1>> - <<if ($week >= 120 && $attackType != "none") || ($forceMajorBattle == 1 && $foughtThisWeek == 0)>> - <<if random(1,100) >= 50 || $forceMajorBattle == 1>> - <<set $majorBattle = 1>> - <<if $SF.Toggle && $SF.Active >= 1>> - <<set $attackTroops = Math.trunc($attackTroops * random(4,6) * $majorBattleMult)>> - <<set $attackEquip = either(3,4)>> - <<else>> - <<set $attackTroops = Math.trunc($attackTroops * random(2,3) * $majorBattleMult)>> - <<set $attackEquip = either(2,3,4)>> - <</if>> - <<set $estimatedMen = Math.round($attackTroops * (1 + either(-1,1) * (random(3,4) - $recon) * 0.1))>> - <<if $recon == 3>> - <<set $expectedEquip = $attackEquip + random(-1,1)>> - <<elseif $recon == 2>> - <<set $expectedEquip = $attackEquip + random(-1,2)>> - <<elseif $recon == 1>> - <<set $expectedEquip = $attackEquip + random(-2,2)>> - <<else>> - <<set $expectedEquip = $attackEquip + random(-2,3)>> - <</if>> - <</if>> - <</if>> <</if>> \ No newline at end of file diff --git a/src/SecExp/rebellionGenerator.tw b/src/SecExp/rebellionGenerator.tw index 11374f05a7e22c1abfe8a314c08d89cbfcf28bf7..66255ca0f8c10134ed103d4e6c099426b5d6a944 100644 --- a/src/SecExp/rebellionGenerator.tw +++ b/src/SecExp/rebellionGenerator.tw @@ -235,15 +235,15 @@ <<set _weekMod = 0.50>> <<if $week <= 30>> - <<set _weekMod = 0.75 * math.round(1+$week/10)>> + <<set _weekMod = 0.75 * Math.round(1+$week/10)>> <<elseif $week <= 60>> - <<set _weekMod = 1 * math.round(1+$week/10)>> + <<set _weekMod = 1 * Math.round(1+$week/10)>> <<elseif $week <= 90>> - <<set _weekMod = 1.25 * math.round(1+$week/10)>> + <<set _weekMod = 1.25 * Math.round(1+$week/10)>> <<elseif $week <= 120>> - <<set _weekMod = 1.50 * math.round(1+$week/10)>> + <<set _weekMod = 1.50 * Math.round(1+$week/10)>> <<else>> - <<set _weekMod = 1.75 * math.round(1+$week/10)>> + <<set _weekMod = 1.75 * Math.round(1+$week/10)>> <</if>> /* resetting ID list */ diff --git a/src/SecExp/unitsRebellionReport.tw b/src/SecExp/unitsRebellionReport.tw index fb3230c27ba8515cc145178f6f9c0b844e77ba98..62e03082e5d10bb2642a73e572a3e844e04d83fb 100644 --- a/src/SecExp/unitsRebellionReport.tw +++ b/src/SecExp/unitsRebellionReport.tw @@ -118,7 +118,7 @@ <br><<link "Dissolve the units">> <<removeUnits _slaveRebelledID>> <<set $menials += _slaveManpower>> - <<for _i = 0; _i < $militiaUnits.length; _i++>> + <<for _i = 0; _i < $slaveUnits.length; _i++>> <<if $slaveUnits[_i].active == 1>> <<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty - random(10,40),0,100)>> <</if>> @@ -171,7 +171,7 @@ <br><<link "Dissolve the units">> <<removeUnits _mercRebelledID>> <<set $mercFreeManpower += _mercManpower>> - <<for _i = 0; _i < $militiaUnits.length; _i++>> + <<for _i = 0; _i < $mercUnits.length; _i++>> <<if $mercUnits[_i].active == 1>> <<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty - random(10,40),0,100)>> <</if>> diff --git a/src/SpecialForce/CheatEdit.tw b/src/SpecialForce/CheatEdit.tw index d580017421444f1c4d2ca660b34504c553beb23f..bace689fa7b69c1bbddd11f6a49de8aad48b44ba 100644 --- a/src/SpecialForce/CheatEdit.tw +++ b/src/SpecialForce/CheatEdit.tw @@ -1,7 +1,6 @@ :: CheatEdit [nobr] <<set $nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", $returnTo = "Firebase">> -<<= Count()>>__Upgrades__: $SF.Size/_max -<<if $SF.Size >= 30>><<set _T1 = 1>><<else>><<set _T1 = 0>><</if>> +<<= Count()>>__Upgrades__: $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)>>%) <br><br>''Firebase:'' <<textbox "$SF.Squad.Firebase" $SF.Squad.Firebase "CheatEdit">>/_FU <br>''Armory:'' <<textbox "$SF.Squad.Armoury" $SF.Squad.Armoury "CheatEdit">>/_AU <br>''Drug Lab:'' <<textbox "$SF.Squad.Drugs" $SF.Squad.Drugs "CheatEdit">>/_DrugsU diff --git a/src/SpecialForce/Firebase.tw b/src/SpecialForce/Firebase.tw index de2b09e8e0fc101ec0c81d810eea906aa6042e46..3666ca8814e43bb642c6cb2468abb0154dce62a1 100644 --- a/src/SpecialForce/Firebase.tw +++ b/src/SpecialForce/Firebase.tw @@ -39,14 +39,14 @@ <<if ((Math.trunc($week/24) === ($week/24)) && $SF.MercCon.CanAttend === -1)>> <br><br>Her expression changes as something jogs her memory. "Before we begin <<if $SF.Colonel.Core == "brazen">><<= properTitle()>><<else>>boss<</if>>, that biannual merc meetup has come around again. You've already gave me leave to attend, but I just wanted to be sure I'm still clear to go." <br>[[Grant leave.|Firebase][$SF.MercCon.CanAttend = 1]] - <br>[[Request she remain on site.|Firebase][$SF.MercCon.CanAttend = -1]]<br> + <br>[[Request she remain on site.|Firebase][$SF.MercCon.CanAttend = -1]] <</if>> - <br>While at the recent merc meetup, The Colonel made @@.yellowgreen;<<print cashFormat(Math.ceil($SF.MercCon.Income))>>@@ selling generic schematics to her friends, <<print commaNum($SF.MercCon.Menials)>> menial slaves were won in a poker game, and <<print commaNum($SF.MercCon.TotalMercs)>> mercenaries were persuaded to join $SF.Lower. + <br><br>While at the recent merc meetup, The Colonel made @@.yellowgreen;<<print cashFormat(Math.ceil($SF.MercCon.Income))>>@@ selling generic schematics to her friends, <<print commaNum($SF.MercCon.Menials)>> menial slaves were won in a poker game, and <<print commaNum($SF.MercCon.TotalMercs)>> mercenaries were persuaded to join $SF.Lower. <br>Total earnings thus far: @@.yellowgreen;<<print cashFormat(Math.ceil($SF.MercCon.Revenue))>>@@ in income, <<print commaNum($SF.MercCon.TotalMenials)>> menial slaves and <<print commaNum($SF.MercCon.Mercs)>> mercenaries joined across $SF.MercCon.History meetups. <</if>> - <<if $SF.UC.Lock < 1>> - <br><<switch $SF.UC.Assign>> + <<if $SF.UC.Lock < 1>> <br> + <<switch $SF.UC.Assign>> <<case 0>> <br>No soldiers are working undercover. [[Full time assignment|Firebase][$SF.UC.Lock = 1]] <br>[[Reassign soldiers|Firebase][$SF.UC.Assign = -1]] @@ -68,7 +68,7 @@ <<if $SF.Squad.Firebase > 5 && $secExp > 0 && $SFSupportLevel >= 4 && $maxUnits === 16 && $readiness <= 10>> <br><br>[[Provide the security force with their own section.|Firebase][$maxUnits += 4,$readiness = 10,cashX(forceNeg(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env)), "capEx")]] - @@.yellowgreen;<<print cashFormat(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@ + @@.red;<<print cashFormat(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@ <</if>> <br>[[Tour the firebase|Firebase][$Tour = 1]] <<else>> <<= FlavourText()>> <br>[[Return to Operations|Firebase][$Tour=0]] <</if>> \ No newline at end of file diff --git a/src/SpecialForce/NamingColonel.tw b/src/SpecialForce/NamingColonel.tw index 33867ce92e938899535da96de4e182c284beef56..da38d5d19890e63fe3d4bfc958bb00daef8b508e 100644 --- a/src/SpecialForce/NamingColonel.tw +++ b/src/SpecialForce/NamingColonel.tw @@ -1,9 +1,9 @@ :: Security Force Naming-Colonel [nobr] -<<set $nextButton = " ">> <<if ndef $Progresss>> <<set $Progress = -1>> <</if>> -<<if $Progresss < 0>> +<<set $nextButton = " ">> +<<if $SF.IntroProgress < 0>> You instruct $assistantName to announce to the arcology's citizenry that you will be making an important announcement in the near future regarding the security situation. Given the damage still present from the Daughters' attack, everyone will be tuning in. You also instruct your assistant to begin quietly investigating potential leadership figures for the force itself. It's been a short while since you told your citizens that you were going to talk to them about their security, and by all accounts, they've turned out in force to watch your address over the arcology's internal communications system. You wake up early, relieve your frustrations on a few slaves woken out of deep sleep, and take position behind your desk. You also call over a slave and push her under your desk. The unspoken instruction is clear, and she begins enthusiastically - <<if $PC.dick == 1>> + <<if $PC.dick > 0>> sucking your cock, taking it as deep as she can without gagging. <<else>> eating you out, pressing her face into your pussy and forcing her tongue deep inside you. @@ -14,23 +14,21 @@ <br><br>As you speak, you carefully monitor the citizens' opinions as indicated on their communication devices. It is uniformly positive — they know whom they have to thank for their continued survival and dominance. You also monitor your arousal given the ministrations of your slave. A few small movements on your part communicate to your citizens what is happening without being too obvious. Free Cities business etiquette respects business conducted while being subtly serviced (and your doing so during such a public and important broadcast signals how seriously you are taking it), but a climax would be seen as a serious lack of discipline. <br><br>You finally wrap up your speech, declaring yourself Marshal of the newly-formed <<textbox "$SF.Lower" $SF.Lower "Security Force Naming-Colonel">> <br><br>You close the link to the communication system and read a message from your assistant that appeared during the last moments of your address. In consultation with major figures in the mercenary community, a suitable candidate for day-to-day command of the new unit has been found. Your instructions were to keep you in the dark about them so as to avoid prejudgment. They are waiting outside your office. - <br><br>[[Invite them inside|Security Force Naming-Colonel][$Progresss = 1]] -<<elseif $Progresss < 2>> <<= SFNameCapsCheck()>> + <br><br>[[Invite them inside|Security Force Naming-Colonel][$SF.IntroProgress = 1]] +<<elseif $SF.IntroProgress < 2>> <<= SFNameCapsCheck()>> The figure that enters is not what you were expecting, given your previous experiences with the mercenary groups that work with the arcology owners of the Free Cities. Most mercenaries you've worked with have been grizzled stout men, veterans of the Old World militaries that finally had too much and went private. Instead, a woman walks in. - <<if $SF.Colonel.Core == "">> + <<if $SF.Colonel.Core === "">> She strikes you as someone who is likely to be: <br><br>[[Kind|Security Force Naming-Colonel][$SF.Colonel.Core = "kind"]] <br>[[Cruel and psychopathic|Security Force Naming-Colonel][$SF.Colonel.Core = "cruel"]] <br>[[A brazen warmonger|Security Force Naming-Colonel][$SF.Colonel.Core = "brazen"]] <br>[[Jaded|Security Force Naming-Colonel][$SF.Colonel.Core = "jaded"]] <br>[[Shell-shocked|Security Force Naming-Colonel][$SF.Colonel.Core = "shell shocked"]] - <</if>> - <<if $SF.Colonel.Core !== "">> + <<else>> She is likely to be ''$SF.Colonel.Core''. <br><br>She strides in, stopping in front of your desk, <<switch $SF.Colonel.Core>> - <<case "kind">> - pulling off a laid-back salute with an easy grin. + <<case "kind">> pulling off a laid-back salute with an easy grin. <<case "cruel">> her eyes flashing a hard glare in an instant before quickly softening into those of someone who wants something you have. <<case "brazen">> @@ -40,21 +38,13 @@ <</switch>> She is very tall and wearing the pants, boots, gloves, and the tank top undershirt of a standard female combat uniform. Her bare arms and upper body are corded with muscle, and through the tank top's thin fabric you can see both the shape of her muscled abdomen and the curves of her small but perky breasts, complete with what your experience tells you are barbell nipple piercings. Her eyes are alive with intelligence, and you can see her scanning your office, clearly impressed by its opulence. Her hair is shaved close to the scalp, and her ears and nose are heavily pierced. You can make out three long, ugly scars running over top of the mottled tissue of a previous, severe burn along one side of her face, as well as numerous smaller scars and burns on her bare arms. She's been disarmed prior to meeting you; the pistol holster on her hip lies empty, as do at least three knife holsters about her person. <br><br>Returning your gaze to her face, she crosses her arms underneath her chest, pressing her breasts up and forward. You have her measure. Given the generally patriarchal nature of both the mercenary community, and the same nature combined with the heavily sexualized lifestyle of the Free Cities, she's decided to embrace her position rather than fight it. - <br><br>"So," she begins, "you're the boss." You invite her to sit down. "No thanks, boss. Besides," + <br><br>"So," she begins, "you're the boss." You invite her to sit down. "No thanks, boss. Besides," She <<switch $SF.Colonel.Core>> - <<case "kind">> - she playfully - <<case "shell shocked">> - she uncomfortably - <<default>> - she + <<case "kind">> playfully + <<case "shell shocked">> uncomfortably <</switch>> indicates the slave under your desk, "you look a little occupied." She nods at the camera across from you. "Saw the speech. Very nice. I'd heard you crazy bastards do business while getting - <<if $PC.dick == 1>> - sucked off, - <<else>> - eaten out, - <</if>> + <<if $PC.dick > 0>> sucked off, <<else>> eaten out, <</if>> but I've never seen anyone actually do it. Hell, most of you people don't want to have to have too much to do with a merc like me. I usually get my instructions remotely." <<switch $SF.Colonel.Core>> <<case "jaded" "brazen">> @@ -75,12 +65,12 @@ <</switch>> "Joined with another big outfit, became the number two, then shit went bad and I had to run. Been a solo fighter and slaver ever since. I know my work, and I know I can make this work." - <br><br>You feel your climax approaching and hold up a finger. The merc pauses while you - <<if $PC.dick == 1>> - grab the slave's head, forcing your cock roughly down her throat while you cum. She swallows as much as she can before pulling away, coughing. + <br><br>You feel your climax approaching and hold up a finger. The merc pauses while you grab the slave's head + <<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>> - grip the slave's head tightly with your thighs, pressing her face tightly against your pussy as you cum. When you release her, she pulls away, coughing. - <</if>> + 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> <<if $SF.Colonel.Core === "shell shocked">> @@ -116,9 +106,9 @@ A glint runs through her eyes. "Sounds like a good fucking time." <br><br>You quickly decide she'll do. You tap a few commands on your desk's console, assigning her personal quarters on the arcology's higher levels and transferring her first stipend to her new account. You also ask her what title she wants. <br><br>"Title?" Another short laugh. "I guess I do need one, given that I'm all official and shit now." She thinks for a moment. "I was a major before I went freelance, and I think I'd like a promotion. Colonel sounds good." You make a note of this in her file. "You people don't seal contracts with a fuck do you?" Reassuring her you don't, she laughs again. "Good. I make it a point never to fuck the boss. It's bad for business." She turns around. "Well, I guess I'd better get to it. Your helper-thing assigned me space on the lower levels for the firebase. I brought a few squads of guys I know from the old days to start, but we'll grow fast once I put the word out, I guarantee it." - <br><br>[[Let her leave|Security Force Naming-Colonel][$Progresss = 2]] + <br><br>[[Let her leave|Security Force Naming-Colonel][$SF.IntroProgress = 2]] <</if>> -<<elseif $Progresss < 3>> <<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">> <<unset $Progresss>> +<<elseif $SF.IntroProgress < 3>> <<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">> She turns and leaves, and you chase the slave out after her. A few minutes later, a soft chime announces the arrival of a message. It's from the Colonel. <br><br>//Hey boss, just wanted to mention something else. In your speech you said that you were going to be paying for $SF.Lower. In my mind that means it's yours, no matter what anyone else here might think. I do what you tell me to do. I make sure the troops behave as you want them to behave. I've worked for some 'nice guys' in the past, and I can do that job if you want. It's boring, but sustainable, and I'll have the $SF.Lower turning a profit and supporting the arcology in good order. But if you let me <<if $SF.Colonel.Core === "cruel">>off the leash<<else>>do what I do<</if>> and throw any Old World complaints in the trash where they belong, I promise you'll have money pouring into your coffers, even accounting for the good amounts me and my boys will pocket along the way. You'll have an empire in short order. <<if $mercenaries > 1>> diff --git a/src/SpecialForce/Proposal.tw b/src/SpecialForce/Proposal.tw index 10a9998b37807d419372804b3cd6c3ee91863b7f..979ff678f950124a94f35f11d81fbc20f67a1e2d 100644 --- a/src/SpecialForce/Proposal.tw +++ b/src/SpecialForce/Proposal.tw @@ -9,6 +9,6 @@ The Free Cities were founded on the principles of unrestrained anarcho-capitalis <<set _price = 20000>> <<if $PC.warfare >= 100>> <<set _price *= .5>> <<elseif $PC.warfare >= 50||$PC.career === "arcology owner">> <<set _price *= .75>> <</if>> <br><<link "Prepare for an announcement.""Security Force Naming-Colonel">> <<replace "#result">> - <<= SFInit()>> <<set $SF.Active = 1>><<run cashX(forceNeg(_price), "specialForces")>> + <<= SFInit()>> <<set $SF.Active = 1,$SF.IntroProgress = -1>> <<run cashX(forceNeg(_price), "specialForces")>> <</replace>> <</link>><br>//Initial costs are @@.yellowgreen;<<print cashFormat(_price)>>@@ and upon establishment the force will have significant support costs until it is self-sufficient.// <br><<link "The current measures are enough.""RIE Eligibility Check">> <<replace "#result">> <<set $SF.Active = 0>> <</replace>> <</link>> </span> \ No newline at end of file diff --git a/src/SpecialForce/SpecialForce.js b/src/SpecialForce/SpecialForce.js index 337a2eb1d9548cde226232d8c9ca95020d6e8fc0..546df2b6ae1c2e30d720208e9d4ba268794a5d93 100644 --- a/src/SpecialForce/SpecialForce.js +++ b/src/SpecialForce/SpecialForce.js @@ -1,44 +1,7 @@ //V=SugarCube.State.variables, T=SugarCube.State.temporary; -window.SFNameCapsCheck = function() { - const V=State.variables; - if (V.SF.Lower != "the special force") V.SF.Caps=V.SF.Lower.replace("the ", "The "); -}; - -window.SFC = function() { - const V=State.variables; - if (V.SF.MercCon.CanAttend === -1) {return `The Colonel`;} - else { - if (V.SF.Facility.LCActive > 0) {return `Lieutenant Colonel ${SlaveFullName(V.SF.Facility.LC)}`;} - else {return `a designated soldier`;}} -}; - -window.SFCR = function() { - const V=State.variables, C=V.SF.Colonel; - if (C.Status <= 19) {return `boss`;} - else if (C.Status <= 39) {return `friend`;} - else {return `fuckbuddy`;} -}; - -window.TroopDec = function() { - const V=State.variables, common=`the ${commaNum(V.SF.Squad.Troops)} members of ${V.SF.Lower}`, S=V.SF.Squad; - if (S.Troops < 100) {return `sparsely occupied, ${common} residing within them concentrating together in a corner. The hundreds of empty beds and lockers visibly herald the future`;} - else if (S.Troops < 400) {return `lightly occupied, with ${common} starting to spread out across them`;} - else if (S.Troops < 800) {return `moderately occupied, though ${common} residing within have a considerable amount of extra room`;} - else if (S.Troops < 1500) {return `well-occupied, and ${common} residing within have started to form small cliques based on section and row`;} - else {return `near capacity, and ${common} often barter their personal loot, whether it be monetary or human, for the choicest bunks`;} -}; - -window.SFUpgradeCost = function(cost,unit) { - const V=State.variables,T=State.temporary,S=V.SF.Squad; var value=0; - //return Math.ceil(cost*T.Env*(1.15+(V.SF.Size/10))*(1.15+(unit/100))*HSM()); - value=cost*T.Env*(1.15+(V.SF.Size/10))*(1.15+(unit/100)); - if ([S.Sub,S.AircraftCarrier,S.MissileSilo,S.GiantRobot,S.Satellite.lv,S.GunS,S.SpacePlane,S.Drones].includes(unit)) value *= V.HackingSkillMultiplier; - return Math.ceil(value); -}; - window.Count = function() { const V=State.variables, T=State.temporary, C=Math.clamp, S=V.SF.Squad, E=V.economy; - T.SFF=V.SF.Facility.Active; + T.SFF=V.SF.Facility.Active; T.T1=0; T.SFFU=1; T.SFF=C(T.SFF, 0, T.SFFU); T.FU=10; S.Firebase=C(S.Firebase, 0, T.FU); T.AU=10; S.Armoury=C(S.Armoury, 0, T.AU); @@ -66,362 +29,14 @@ window.Count = function() { T.max += T.LBU; T.Base += T.LB; } else { T.NY=S.AircraftCarrier + S.Sub + S.HAT; T.Base += T.NY; - T.NYU=T.ACU + T.SubU + T.HATU; T.max += T.NYU; - } V.SF.Size=T.Base; V.SF.Size=C(V.SF.Size, 0, T.max); - if (E > 100) {T.Env=4;} - else if (E > 67) {T.Env=3;} - else {T.Env=2;} - T.SFSubsidy=5000*(1+((V.SF.Squad.Troops/100)+(V.SF.Size/100))); + T.NYU=T.ACU + T.SubU + T.HATU; T.max += T.NYU; + } V.SF.Size=T.Base; V.SF.Size=C(V.SF.Size, 0, T.max); + if (E > 100) {T.Env=4;} else if (E > 67) {T.Env=3;} else {T.Env=2;} + if (V.SF.Size >= 30) T.T1=1; T.SFSubsidy=5000*(1+((V.SF.Squad.Troops/100)+(V.SF.Size/100))); SFNameCapsCheck(); -}; - -window.Firebase = function() { - const V=State.variables, S=V.SF.Squad; - var appear=`is currently constructed in a haphazard fashion.`; var barracks=`Soldiers' cots are mixed in with weapons crates and ammunition.`; var slave=`Cages for processing slaves lie off to one side,`; var common=`and in the center is a common area with tables for soldiers to gather around for meals or rowdy conversations.`; var garage=``; var drone=``; var hangar=``; var launch=``; var artillery=``; var comms=``; var training=``; - - if (S.Firebase >= 1) {appear=`has had some organization put into it.`; barracks=`The majority of weapons, armor, and ammunition have been separated from the soldiers' cots into their own armory.`; garage=`A section near the outer wall of the arcology has been converted to a garage with an adjoining vehicle maintenance bay`; drone=`.`; - if (V.terrain === "oceanic") garage += ` for inter-arcology travel`;} - if (S.Firebase >= 2) barracks=`A barracks has been constructed near the armory, allowing soldiers a quieter place to sleep and store their personal spoils.`; drone=`; as well as a facility for the storage, maintenance, and deployment of armed combat drones.`; - if (S.Firebase >= 3) appear=`has become more permanent.`; barracks=`A command center has been constructed near the barracks and armory, allowing for additional support personnel.`; - if (S.Firebase >= 4) hangar=`Hangar space for storing and repairing aircraft has been converted from unused space on the other side of the garage.`; - if (S.Firebase >= 5) { - appear=`is nearing the appearance of a military base.`; launch=`The rest of the firebase has been designated for special projects.`; artillery=`Artillery batteries are set around the base of the arcology.`; - if (V.terrain === "oceanic" || V.terrain === "marine") launch += ` A Naval Yard has been constructed in the waters near the arcology.`;} - if (S.Firebase >= 6) common=`and in the center is a common area for recreation, including a small movie theater and a mess hall.`; - if (S.Firebase >= 7) {slave=`A slave detention facility has been sectioned off to one side`; - if (V.SF.Depravity > 1.5) slave += ` emanating the sounds of rape and torture`; - slave += `;`;} - if (S.Firebase >= 8) appear=`has become a fully fledged military base.`; comms=`A Free City-wide communication network for ${V.SF.Lower} has been constructed to facilitate faster responses and efficient monitoring of the surrounding area.`; - if (S.Firebase >= 9) training=`A high-tech killhouse has been constructed to aid in soldier training.`; - if (S.Firebase >= 10) artillery=`Railgun artillery batteries are set around the base of the arcology, capable of accurately destroying enemies an absurd distance away.`; - - return `The firebase ${appear} ${barracks} ${comms} ${training} ${slave} ${common} ${garage}${drone} ${hangar} ${launch} ${artillery}`; -}; - -window.Armoury = function() { - const V=State.variables, S=V.SF.Squad; - var weapons=`The weapons are mostly worn rifles that have already seen years of service before ${V.SF.Lower} acquired them.`; var armor=`The body armor is enough to stop smaller calibers, but nothing serious.`; var comms=``; var helmets=``; var ammo=``; var uniforms=``; var special=``; var exo=``; - - if (S.Armoury >= 1) comms=`Radios have been wired into the soldiers helmets`; helmets=`.`; - if (S.Armoury >= 2) helmets=` and a HUD has been integrated into the soldier's eyewear.`; - if (S.Armoury >= 3) ammo=`Tactical vests have been provided, allowing soldiers to carry additional ammo.`; - if (S.Armoury >= 4) armor=`The body armor is a newer variant, able to stop small arms fire and protect against shrapnel.`; - if (S.Armoury >= 5) weapons=`The weapons are modern rifles and sidearms, putting ${V.SF.Lower} on par with rival mercenary outfits.`; - if (S.Armoury >= 6) uniforms=`New uniforms have been distributed that are more comfortable and made of breatheable fabric to keep soldiers from overheating.`; - if (S.Armoury >= 7) special=`Specialized weaponry is available for various roles, allowing more flexibility in planning.`; - if (S.Armoury >= 8) helmets=`and a HUD and camera display have been integrated into soldiers' eyewear, enabling accurate aim around corners or from behind cover`; - if (S.Armoury >= 9) exo=`An exosuit has been developed to reduce the amount of weight soldiers carry, increase lifting strength, and move faster in combat.`; - if (S.Armoury >= 10) weapons=`Cutting-edge weaponry is available to ${V.SF.Lower}, far outpacing the ability of rival mercenary outfits.`; - - return `The armory holds soldiers' weapons and gear while not in training or combat. ${weapons} ${special} ${armor} ${comms}${helmets} ${ammo} ${uniforms} ${exo}`; -}; - -window.Drugs = function() { - const V=State.variables, S=V.SF.Squad; - var amphet=``; var phen=``; var steroid=``; var downer=``; var concen=``; var stimpack=``; var stabilizer=``; - - if (S.Drugs >= 1) amphet=`Amphetamines have been added to the cocktail at a low dosage to act as a stimulant, physical performance enhancer, cognition control enhancer. Some side-effects exist.`; - if (S.Drugs >= 2) phen=`Phencyclidine has been added to the cocktail at a low dosage as a dissociative psychotropic for soldiers in battle to introduce feelings of detachment, strength and invincibility, and aggression. Some side-effects reduce the tolerable dosage before soldiers go on uncontrollable violent outbreaks.`; - if (S.Drugs >= 3) steroid=`Testosterone is being produced for soldiers in training as a natural muscle growth stimulant and to invoke aggression.`; - if (S.Drugs >= 4) downer=`Zaleplon is being produced as a downer to counteract the battle cocktail and encourage rest before combat.`; - if (S.Drugs >= 5) concen=`Methylphenidate has been added to the cocktail as a stimulant and to improve soldier concentration.`; - if (S.Drugs >= 6) phen=`A phencyclidine-based drug has been added to the cocktail as a dissociative psychotropic for soldiers in battle to introduce controllable feelings of detachment, strength and invincibility, and aggression.`; - if (S.Drugs >= 7) steroid=`Low levels of anabolic steroids are being produced for soldiers in training to stimulate muscle growth and invoke aggression.`; - if (S.Drugs >= 8) amphet=`Diphenylmethylsulfinylacetamide has been added to the cocktail to counteract the effects of sleep deprivation and promote alertness.`; - if (S.Drugs >= 9) stimpack=`A stimpack of the battle cocktail is being given to soldiers in battle to take if the original dose wears off before the battle is over.`; - if (S.Drugs >= 10) stabilizer=`A stabilizer has been added to the battle cocktail that helps tie effects together while reducing side-effects, leading to an effectively safe supersoldier drug.`; - - return `A drug lab has been established to increase the effectiveness of ${V.SF.Lower}'s soldiers. Many of these chemicals are mixed into a single 'battle cocktail' to be taken before combat. ${amphet} ${phen} ${concen} ${steroid} ${downer} ${stimpack} ${stabilizer}`; -}; - -window.LUAV = function() { - const V=State.variables, S=V.SF.Squad; - var a=`have been recommissioned for use by ${V.SF.Lower}`; var b=`.`; var c=``; var d=``; var e=``; var f=``; var g=``; var h=``; var i=``; var j=``; var k=``; - - if (S.Drones >= 2) a=`equipped with missiles are resting on one side of the drone bay`; b=`; as well as destroying the occasional target.`; - if (S.Drones >= 3) c=`A fleet of`; d=`large delivery quadcopters have been converted for military service to support ground forces as combat drones.`; - if (S.Drones >= 4) d=`combat drones take up the rest of the space in the drone bay. They have a`; e=`small automatic rifle`; f=`mounted to the underside.`; - if (S.Drones >= 5) g=`Armor has been added to protect vulnerable components from small arms fire.`; - if (S.Drones >= 6) h=`The fleet's batteries have been replaced with higher capacity models, increasing the functional time spent in combat.`; - if (S.Drones >= 7) i=`The propellers and motors have been upgraded, increasing maneuverability and speed.`; - if (S.Drones >= 8) j=`The drone control signal has been boosted and encrypted, giving the drones a greater range and protecting against electronic warfare.`; - if (S.Drones >= 9) e=`light machine gun`; - if (S.Drones >= 10) k=`A drone-to-drone network has been installed, allowing drones to swarm, maneuver, and attack targets autonomously.`; - - return `Surveillance drones ${a}. During combat, they supply aerial intel to commanders and act as the communications network for ground forces${b} ${c} ${d} ${e} ${f} ${g} ${h} ${i} ${j} ${k}`; -}; - -window.AV = function() { - const V=State.variables, S=V.SF.Squad; - var b=`has been recommissioned for use by ${V.SF.Lower}. They`; var c=`; var mechanics are methodically checking the recent purchases for battle-readiness`; var MG=`120 mm main gun is enough to handle the majority of opponents around the Free Cities.`; var engine=``; var armor=``; var armor2=``; var ammo=``; var mg=``; var fireC0=``; var fireC1=``; var fireC2=``; var fireC3=``; var turret=``; - - if (S.AV >= 2) engine=`The engine has been overhauled, allowing much faster maneuvering around the battlefield.`; b=``; c=``; - if (S.AV >= 3) armor=`A composite ceramic armor has replaced the original, offering much greater protection from attacks.`; - if (S.AV >= 4) ammo=`The tanks have been outfitted with additional types of ammo for situational use.`; - if (S.AV >= 5) mg=`A remote-controlled .50 cal machine gun has been mounted on the turret to handle infantry and low-flying aircraft.`; - if (S.AV >= 6) fireC0=`A fire-control system`; fireC3=`been installed, guaranteeing`; fireC2=`has`; fireC1=`accurate fire.`; - if (S.AV >= 7) fireC2=`and an autoloader have`; fireC1=`rapid, accurate fire while separating the crew from the stored ammunition in the event the ammo cooks off.`; - if (S.AV >= 8) armor2=`A reactive armor system has been added, giving the tank an additional, if temporary, layer of protection.`; - if (S.AV >= 9) turret=`The turret has been massively redesigned, lowering the tank profile and increasing the efficiency of the mechanisms within.`; - if (S.AV >= 10) MG=`140 mm main gun can quash anything even the greatest Old World nations could muster.`; - - return `A fleet of main battle tanks ${b} are parked in the garage${c}. ${turret} The ${MG} ${ammo} ${mg} ${fireC0} ${fireC2} ${fireC3} ${fireC1} ${engine} ${armor} ${armor2}`; -}; - -window.TV = function() { - const V=State.variables, S=V.SF.Squad; - var B=`has been recommissioned for use by ${V.SF.Lower}. They`; var C=`; var mechanics are giving the new purchases a final tuneup`; var squad=`a squad`; var G1=`20`; var G2=`in a firefight`; var e0=`The engine has been`; var engine=``; var armor=``; var tires=``; var m1=``; var m2=``; var pod1=``; var pod2=``; - - if (S.TV >= 2) engine=`${e0} overhauled, allowing for higher mobility.`; C=``; B=``; - if (S.TV >= 3) armor=`Composite armor has been bolted to the exterior, increasing the survivability of an explosive attack for the crew and passengers.`; - if (S.TV >= 4) tires=`The tires have been replaced with a much more durable version that can support a heavier vehicle.`; - if (S.TV >= 5) m1=`An automatic missile defense system has been installed,`; m2=`targeting any guided missiles with laser dazzlers and deploying a smokescreen.`; - if (S.TV >= 6) pod1=`An anti-tank missile pod`; pod2=`has been installed on the side of the turret.`; - if (S.TV >= 7) G1=`25`; G2=`by attacking enemies through cover and destroying light armor`; - if (S.TV >= 8) pod2=`and an anti-aircraft missile pod have been installed on either side of the turret.`; - if (S.TV >= 9) squad=`two squads`; armor=``; m2=`destroying any incoming missiles with a high-powered laser. Some of the now redundant composite armor has been removed, and the reclaimed space allows for more passengers.`; - if (S.TV >= 10) engine=`${e0} replaced with the newest model, allowing the vehicle to get in and out of the conflict extremely quickly.`; - - return `A fleet of infantry fighting vehicles ${B} are parked in the garage${C}. The IFVs can carry ${squad} of 6 to a firezone. The ${G1} mm autocannon supports infantry ${G2}. ${pod1} ${pod2} ${engine} ${armor} ${tires} ${m1} ${m2}`; -}; - -window.PGT = function() { - const V=State.variables, S=V.SF.Squad; - var b=`has been sold to ${V.SF.Lower} through back channels to support a failing Old World nation. The tank is so large it cannot fit inside the garage, and has`; var c=``; var engines=`. Two engines power the left and right sides of the tank separately, leaving it underpowered and slow`; var gun0=``; var gun1=``; var gun2=`an undersized main gun and makeshift firing system from a standard battle tank`; var armor1=``; var armor0=``; var cannon=``; var laser=``; var PGTframe=``; - - if (S.PGT >= 2) c=`rests in`; b=``; engines=` and powered by their own engine, allowing the tank to travel with an unsettling speed for its massive bulk`; - if (S.PGT >= 3) gun0=`a railgun capable of`; gun1=`firing steel slugs`; gun2=`through one tank and into another`; - if (S.PGT >= 4) armor0=`reinforced, increasing survivability for the crew inside.`; armor1=`The armor has been`; - if (S.PGT >= 5) cannon=`A coaxial 30mm autocannon has been installed in the turret, along with automated .50 cal machine guns mounted over the front treads.`; - if (S.PGT >= 6) laser=`Laser anti-missile countermeasures have been installed, destroying any subsonic ordinance fired at the Goliath.`; - if (S.PGT >= 7) PGTframe=`The frame has been reinforced, allowing the Goliath to carry more armor and guns.`; - if (S.PGT >= 8) armor0=`redesigned with sloping and state-of-the-art materials, allowing the Goliath to shrug off even the most advanced armor-piercing tank rounds.`; - if (S.PGT >= 9) gun1=`firing guided projectiles`; - if (S.PGT >= 10) gun0=`a twin-barreled railgun capable of rapidly`; - - return `A prototype Goliath tank ${b}${c} its own garage housing built outside the arcology. The massive bulk is spread out over 8 tracks, two for each corner of the tank${engines}. The turret is equipped with ${gun0} ${gun1} ${gun2}. ${cannon} ${armor1} ${armor0} ${laser} ${PGTframe}`; -}; - -window.AA = function() { - const V=State.variables, S=V.SF.Squad; - var W1=`only armed`; var W2=`;`; var W3=`a poor weapon against flying targets, but enough to handle ground forces`; var group=`A small group of attack VTOL have been recommissioned for use by ${V.SF.Lower}, enough to make up a squadron`; var engines=``; var TAI=``; var lock=``; var support=``; var stealth=``; var scramble=``; var PAI=``; - - if (S.AA >= 2) W1=`armed`; W2=` and air-to-air missiles,`; W3=`a combination that can defend the arcology from enemy aircraft, as well as`; support=` support ground troops`; - if (S.AA >= 3) engines=`The engines have been tuned, allowing faster flight with greater acceleration.`; - if (S.AA >= 4) TAI=`An advanced targeting AI has been installed to handle all control of weapons, allowing much more efficient use of ammunition and anti-countermeasure targeting.`; - if (S.AA >= 5) lock=`Installed multispectrum countermeasures protect against all types of missile locks.`; - if (S.AA >= 6) group=`A respectable number of attack VTOL protect your arcology, split into a few squadrons`; - if (S.AA >= 7) support=` attack ground targets`; W2=`; rocket pods, and air-to-air missiles,`; - if (S.AA >= 8) stealth=`The old skin has been replaced with a radar-absorbent material, making the aircraft difficult to pick up on radar.`; - if (S.AA >= 9) scramble=`The VTOLs can scramble to react to any threat in under three minutes.`; - if (S.AA >= 10) PAI=`A piloting AI has been installed, allowing the VTOLs to perform impossible maneuvers that cannot be done by a human pilot. This removes the need for a human in the aircraft altogether.`; - - return `${group}. Several of the landing pads around $arcologies[0].name host groups of four fighters, ready to defend the arcology. ${scramble} The attack VTOL are currently ${W1} with a Gatling cannon${W2} ${W3}${support}. ${TAI} ${PAI} ${engines} ${lock} ${stealth}`; -}; - -window.TA = function() { - const V=State.variables, S=V.SF.Squad; - var Num=`number`; var type=`tiltrotor`; var capacity=`small platoon or 15`; var engines=``; var engines2=``; var Radar=``; var Armor=``; var landing=``; var miniguns=``; var counter=``; - - if (S.TA >= 2) engines=`The tiltrotor engines have been replaced with a more powerful engine, allowing faster travel times.`; - if (S.TA >= 3) counter=`Multispectrum countermeasures have been added to protect against guided missiles.`; - if (S.TA >= 4) miniguns=`Mounted miniguns have been installed to cover soldiers disembarking in dangerous areas.`; - if (S.TA >= 5) Num=`large number`; - if (S.TA >= 6) landing=`The landing equipment has been overhauled, protecting personnel and cargo in the event of a hard landing or crash.`; - if (S.TA >= 7) Armor=`Armor has been added to protect passengers from small arms fire from below.`; - if (S.TA >= 8) capacity=`large platoon or 20`; engines2=`Further tweaks to the engine allow for greater lifting capacity.`; - if (S.TA >= 9) Radar=`Radar-absorbent materials have replaced the old skin, making it difficult to pick up the VTOL on radar.`; - if (S.TA >= 10) type=`tiltjet`; engines2=``; engines=`The tiltrotors have been replaced with tiltjets, allowing for much greater airspeed and acceleration.`; - - return `A ${Num} of transport ${type} VTOL have been recommissioned for use by ${V.SF.Lower}. The VTOLs are resting on large pads near the base to load either a ${capacity} tons of material. ${engines} ${engines2} ${Armor} ${landing} ${counter} ${Radar} ${miniguns}`; -}; - -window.SP = function() { - const V=State.variables, S=V.SF.Squad; - var engine=`ramjet engines in the atmosphere that can reach Mach 10`; var b=`has been purchased from an insolvent Old World nation. It `; var shield=``; var camera=``; var efficiency=``; var camera2=``; var drag=``; var crew=``; var engine2=``; var skin=``; - - if (S.SpacePlane >= 2) b=``; shield=`The current heat shielding has been upgraded, reducing the likelihood of heat damage during reentry.`; - if (S.SpacePlane >= 3) engine2=` and liquid rocket engines in orbit that can reach an equivalent Mach 18`; - if (S.SpacePlane >= 4) camera=`A state-of-the-art camera has been installed in the underbelly that takes incredibly high resolution photos, but requires the frictionless environment of space to focus.`; - if (S.SpacePlane >= 5) efficiency=`Tweaks to the engines have increased fuel efficiency to the point where midflight refueling is no longer necessary.`; - if (S.SpacePlane >= 6) camera2=`The camera sensor is capable of taking IR shots.`; - if (S.SpacePlane >= 7) drag=`Miraculous advances in aerodynamics and materials allow frictionless flight, even while in the atmosphere.`; - if (S.SpacePlane >= 8) crew=`Increased the crew comfort and life support systems to increase operational time.`; - if (S.SpacePlane >= 9) skin=`Replaced the underbelly skin with a chameleon kit, matching the color to the sky above it.`; - if (S.SpacePlane >= 10) engine=`experimental scramjet engines in the atmosphere that can reach Mach 15`; engine2=` and liquid rocket engines in orbit that can reach an equivalent Mach 25`; - - return `A prototype spaceplane ${b} rests in the hangar, its black fuselage gleaming. The craft is powered by ${engine}${engine2}. ${efficiency} ${shield} ${camera} ${camera2} ${drag} ${crew} ${skin}`; -}; - -window.GunS = function() { - const V=State.variables, S=V.SF.Squad; - var a=`has been recommissioned for use by ${V.SF.Lower}. Currently, it `; var b=``; var c=``; var d=``; var e=`Miniguns and Gatling cannons line`; var f=`; var though the distance to ground targets renders the smaller calibers somewhat less useful`; var g=``; var h=``; var i=``; var j=``; var k=``; - - if (S.GunS >= 2) b=`Infrared sensors have been added for the gunners to better pick targets.`; a=``; - if (S.GunS >= 3) c=`The underside of the aircraft has been better armored against small-arms fire`; h=`.`; - if (S.GunS >= 4) d=`Larger fuel tanks have been installed in the wings and fuselage, allowing the gunship to provide aerial support for longer periods before refueling.`; - if (S.GunS >= 5) e=`25 mm Gatling cannons`; f=`; allowing the gunship to eliminate infantry`; j=` and light vehicles from above`; k=` and a 40 mm autocannon are mounted on`; - if (S.GunS >= 6) g=`The engines have been replaced, allowing both faster travel to a target, and slower travel around a target.`; - if (S.GunS >= 7) h=`; and multi-spectrum countermeasures have been installed to protect against guided missiles.`; - if (S.GunS >= 8) b=`Upgraded multi-spectrum sensors can clearly depict targets even with IR shielding.`; - if (S.GunS >= 9) i=`The ammunition storage has been increased, only slightly depriving loaders of a place to sit.`; - if (S.GunS >= 10) j=`; both light and heavy vehicles, and most enemy cover from above`; k=`; a 40 mm autocannon, and a 105 mm howitzer are mounted on`; - - return `A large gunship ${a} is being refueled in the hangar. ${e}${k} the port side of the fuselage${f}${j}. ${b} ${i} ${g} ${c}${h} ${d}`; -}; - -window.Sat = function() { - const V=State.variables, S=V.SF.Squad; - var loc=`An unused science satellite has been purchased from an Old World nation. While currently useless, it holds potential to be a powerful tool.`; var gyro=``; var telemetry=``; var thrusters=``; var solar=``; var surviv=``; var laser=``; var heat=``; var reactor=``; var lens=``; var kin=``; - - if (S.Satellite.lv >= 2) { - if (V.SF.Squad.Satellite.InOrbit < 1) {loc=`The satellite is being worked on in the Launch Bay.`;} else {loc=`The satellite is in geosynchronous orbit, far above the arcology.`;} - gyro=`A suite of sensors have been installed to ensure the satellite can detect attitude and orbital altitude.`;} - if (S.Satellite.lv >= 3) telemetry=`Telemetry systems have been installed to communicate with the satellite in orbit, with strong encryption measures.`; - if (S.Satellite.lv >= 4) thrusters=`Thrusters have been installed to control satellite attitude and orbit.`; - if (S.Satellite.lv >= 5) solar=`A massive folding solar panel array, combined with the latest in battery technology allow the satellite to store an enormous amount of energy relatively quickly.`; surviv=`Enough of the satellite has been finished that it can expect to survive for a significant period of time in space.`; - if (S.Satellite.lv >= 6) laser=`A laser cannon has been mounted facing the earth, capable of cutting through steel in seconds`; heat=` while generating a large amount of heat.`; - if (S.Satellite.lv >= 7) heat=`. The installed heatsink allows the laser cannon to fire more frequently without damaging the satellite.`; - if (S.Satellite.lv >= 8) reactor=`A small, efficient nuclear reactor has been installed to continue generating energy while in the Earth's shadow.`; - if (S.Satellite.lv >= 9) lens=`A higher quality and adjustable lens has been installed on the laser, allowing scalpel precision on armor or wide-area blasts on unarmored targets.`; - if (S.Satellite.lv >= 10) kin=`A magazine of directable tungsten rods have been mounted to the exterior of the satellite, allowing for kinetic bombardment roughly equal to a series of nuclear blasts.`; - - return `${loc} ${gyro} ${thrusters} ${telemetry} ${solar} ${reactor} ${surviv} ${laser}${heat} ${lens} ${kin}`; -}; - -window.GR = function() { - const V=State.variables, S=V.SF.Squad; - var loc=`has been purchased from a crumbling Old World nation. It`; var power=`Large batteries mounted in oversized shoulders power the robot for up to ten minutes of use, though they make for large targets.`; var knife=`simply a 8.5 meter long knife, though additional weapons are under development.`; var armor=``; var actuator=``; var cannon=``; var heatsink=``; var ammo=``; var missile=``; - - if (S.GiantRobot >= 2) loc=``; armor=`Armor plating has been mounted over the majority of the robot.`; - if (S.GiantRobot >= 3) power=`The robot is now powered by an umbilical cable system instead of bulky and short-lived batteries.`; - if (S.GiantRobot >= 4) knife=`a 25 meter plasma sword. The cutting edge uses plasma to melt and cut through targets, reducing the strain on the sword.`; - if (S.GiantRobot >= 5) actuator=`The limb actuators have been replaced with a faster and more powerful variant, granting the robot the same.`; - if (S.GiantRobot >= 6) cannon=`A custom 45 mm Gatling cannon rifle has been developed for ranged use`; ammo=`; though it lacks enough ammo storage for a main weapon.`; - if (S.GiantRobot >= 7) heatsink=`Large heatsinks have been installed out of the back to solve a massive overheating problem. These heatsinks resemble wings, and tend to glow red with heat when in heavy use.`; - if (S.GiantRobot >= 8) armor=``; actuator=`Final actuator tweaks have allowed for the addition of exceptionally thick armor without any loss in speed or power.`; - if (S.GiantRobot >= 9) ammo=`; with spare ammunition drums kept along the robot's waist.`; - if (S.GiantRobot >= 10) missile=`Missile pods have been mounted on the shoulders.`; - - return `A prototype giant robot ${loc} rests in a gantry along the side of the arcology. The robot is as tall as a medium-sized office building, focusing on speed over other factors. ${power} ${armor} ${actuator} ${heatsink} The main armament is ${knife} ${cannon}${ammo} ${missile}`; -}; - -window.ms = function() { - const V=State.variables, S=V.SF.Squad; - var a=`A cruise missile launch site has been constructed near the base of`; var b=`outdated, something quickly rigged together to give the launch site something to fire in the case of an attack`; var c=``; var d=``; var e=``; var f=``; var g=``; var h=``; - - if (S.MissileSilo >= 2) b=`a modern missile`; c=`; tipped with a conventional warhead`; - if (S.MissileSilo >= 3) d=`The launch systems have been overhauled, allowing a launch within seconds of an attack order being given.`; - if (S.MissileSilo >= 4) e=`The missile engines have been tweaked, giving them a greater range.`; - if (S.MissileSilo >= 5) f=`A passive radar has been installed, allowing the missile to follow moving targets.`; - if (S.MissileSilo >= 6) a=`Several cruise missile launch sites have been constructed around`; - if (S.MissileSilo >= 7) e=`The engine has been replaced, giving the missiles greater range and supersonic speeds.`; - if (S.MissileSilo >= 8) g=`The ability to pick new targets should the original be lost has been added.`; - if (S.MissileSilo >= 9) h=`The missile now uses its remaining fuel to create a thermobaric explosion, massively increasing explosive power.`; - if (S.MissileSilo >= 10) c=` that can be tipped with either a conventional or nuclear warhead`; - - return `${a} the arcology. The current missile armament is ${b}${c}. ${d} ${e} ${f} ${g} ${h}`; -}; - -window.AC = function() { - const V=State.variables, S=V.SF.Squad; - var recom=`has been recommissioned from the Old World for ${V.SF.Lower}. It`; var jets=`Formerly mothballed strike jets`; var loc=``; var radar=``; var AA=``; var prop=``; var torp=``; var armor=``; var power=``; var scramble=``; - - if (V.week % 6 === 0) { loc=`moored to the pier in the Naval Yard`; } else { loc=`patrolling the waters near $arcologies[0].name`; } - if (S.AircraftCarrier >= 2) radar=`The island's radar and comms have been improved.`; recom=``; - if (S.AircraftCarrier >= 3) AA=`The antiair guns have been updated to automatically track and predict enemy aircraft movement.`; - if (S.AircraftCarrier >= 4) jets=`Modern strike jets with state-of-the-art armaments`; - if (S.AircraftCarrier >= 5) prop=`The propellers have been redesigned, granting greater speed with less noise.`; - if (S.AircraftCarrier >= 6) torp=`An anti-torpedo system detects and destroys incoming torpedoes.`; - if (S.AircraftCarrier >= 7) armor=`Additional armor has been added to the hull and deck.`; - if (S.AircraftCarrier >= 8) power=`The power plant has been converted to provide nuclear power.`; - if (S.AircraftCarrier >= 9) scramble=`The catapult has been converted to an electromagnetic launch system, halving the time it takes to scramble jets.`; - if (S.AircraftCarrier >= 10) jets=`Attack VTOL from the converted for carrier capability`; - - return `An aircraft carrier ${recom} is ${loc}. ${jets} serve as its airpower. ${scramble} ${power} ${radar} ${AA} ${torp} ${prop} ${armor}`; -}; - -window.Sub = function() { - const V=State.variables, S=V.SF.Squad; - var recom=`has been recommissioned from the old world, and`; var reactor=`Because diesel engines provide power and breathing oxygen is kept in pressurized canisters, the sub must frequently surface.`; var reactor1=``; var cal=``; var hull=``; var tubes=``; var torpedoes=``; var sonar=``; var control=``; var missiles=``; - - if (S.Sub >= 2) recom=``; reactor=`A nuclear reactor provides power`; reactor1=`; but because oxygen is still kept in pressurized canisters the sub must frequently surface to replenish its oxygen stocks.`; - if (S.Sub >= 3) reactor1=` and an oxygen generator pulls Oâ‚‚ from the surrounding seawater, allowing the submarine to remain underwater for months if necessary.`; - if (S.Sub >= 4) cal=`Calibration of the propulsion systems has reduced the telltale hum of a moving sub to a whisper.`; - if (S.Sub >= 5) hull=`The outer hull has been redesigned for hydrodynamics and sonar absorption.`; - if (S.Sub >= 6) tubes=`The torpedo tubes have been redesigned for faster loading speeds`; torpedoes=`.`; - if (S.Sub >= 7) sonar=`The passive sonar has been finely tuned to detect mechanical noises miles away.`; - if (S.Sub >= 8) control=`The control room computers have been upgraded to automate many conn duties.`; - if (S.Sub >= 9) torpedoes=`and launch more agile torpedoes.`; - if (S.Sub >= 10) missiles=`The submarine has been outfitted with several cruise missiles to attack land or sea-based targets.`; - - return `An attack submarine ${recom} is moored to the pier of the Naval Yard. ${reactor}${reactor1} ${cal} ${hull} ${tubes}${torpedoes} ${sonar} ${control} ${missiles}`; -}; - -window.HAT = function() { - const V=State.variables, S=V.SF.Squad; - var recom=`; has been recommissioned for use by ${V.SF.Lower}. It`; var tons=`200`; var skirt=``; var guns=``; var guns2=``; var fans=``; var speed=``; var turbines=``; var armor=``; var ramps=``; var HATframe=``; var loadout=``; - - if (S.HAT >= 2) skirt=`The skirt has been upgraded to increase durability and improve cushion when traveling over uneven terrain and waves.`; recom=`;`; - if (S.HAT >= 3) guns=`A minigun`; guns2=`has been mounted on the front corners of the craft to defend against attackers.`; - if (S.HAT >= 4) fans=`The turbines powering the rear fans`; speed=`acceleration and speed.`; turbines=`have been replaced with a more powerful version, allowing greater`; - if (S.HAT >= 5) armor=`The armor protecting its cargo has been increased.`; - if (S.HAT >= 6) tons=`300`; fans=`The turbines powering the rear fans and impeller`; speed=`acceleration, speed, and carrying capacity.`; - if (S.HAT >= 7) guns=`A minigun and grenade launcher`; - if (S.HAT >= 8) ramps=`The loading ramps have been improved, allowing for faster unloading.`; - if (S.HAT >= 9) HATframe=`The frame has been widened and reinforced, allowing for more space on the deck.`; - if (S.HAT >= 10) loadout=`An experimental loadout sacrifices all carrying capacity to instead act as a floating gun platform by mounting several rotary autocannons the deck, should the need arise.`; - - return `An air cushion transport vehicle, or hovercraft${recom} is parked on the pier of the Naval Yard, ready to ferry ${tons} tons of soldiers and vehicles. ${guns} ${guns2} ${fans} ${turbines} ${speed} ${skirt} ${armor} ${ramps} ${HATframe} ${loadout}`; -}; - -window.Interactions = function() { - const V=State.variables, C=V.SF.Colonel, T=State.temporary; - var choice=``; time=``; - if (V.SF.Gift > 0) { - if (V.choice == 1) { - choice +=`${V.SF.Caps} is turning over spare capital in tribute this week. `; - if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { - choice += `"I think I can find <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> for you, boss."`; - } else { - choice += `"We can spare <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> in tribute this week, boss".`; } - } else if (V.choice == 2) { - choice += `${V.SF.Caps} will be throwing a military parade this week. `; - if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { - choice += `"I expect the <span class='green'>public to enjoy</span> the parade, boss."`; - } else { - choice += `"I'll have plans for an <span class='green'>popular parade</span> on your desk, boss".`; } - } else if (V.choice == 3) { - choice += `${V.SF.Caps} will be conducting corporate sabotage on rival arcologies' businesses. `; - if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { - choice += `"Our interests should see a <span class='yellowgreen'>big boost,</span> boss."`; - } else { - choice += `"Your <span class='yellowgreen'>arcology's business prospects should see an improvement</span> this week, boss".`; } - } - } if (C.Talk + C.Fun > 0) time=`<br>The Colonel is busy for the rest of the week, so the Lieutenant Colonel will assist you.`; - return `${time} <br>${choice}`; -}; - -window.progress = function(x,max) { - var out = `â`, z, i; - if (max === undefined) { - Math.clamp(x,0,10); - if (State.variables.SF.Size < 30) { - z = 5 - x; - for (i=0;i<x;i++) out += `â–ˆâ`; - for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`; - for (i=0;i<5;i++) out += `â–‘â`;} - else { - z = 10 - x; - for (i=0;i<x;i++) out += `â–ˆâ`; - for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`;}} - else { - Math.clamp(x,0,max); - x=Math.floor(10*x/max); - z=10 - x; - for (i=0;i<x;i++) out += `â–ˆâ`; - for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`;} - return `${out}`; + if (V.SF.IntroProgress > -1) delete V.SF.IntroProgress; + if (V.SF.MercCon === undefined) MercCon(); + if (V.SF.Size === T.max) delete V.SF.Upgrade; }; window.Main = function() { @@ -447,7 +62,7 @@ window.Facility = function() { }; window.SFInit = function() { - Main();Squad();Colonel();MercCon();Facility(); + Main();Squad();Colonel(); }; window.SFBC = function() { @@ -637,6 +252,266 @@ window.SFBC = function() { if (V.SF.Facility === undefined) Facility(); }; +window.SFReport = function() { + const V=State.variables,T=State.temporary,S=V.SF.Squad; + var target=50000,baseLine=5000,profit=0,upkeep=0,income=0; + var Multiplier={action:1,troop:1,unit:1,depravity:1},SFD=V.SF.Depravity; + var FNG=10,unitCap=2500,Trade=0.025,deaths=0,r=``; Count(); + var cost={a:0.01,b:2.5};var NO=1+(V.SF.Size/10);var N1=1+(V.SF.Size/10); + V.SFUC=0; if (profit < 1) cost.a=10; cost.b=0.1;NO=1;N1=0.1; + + if (S.Troops > unitCap) S.Troops=unitCap; + if (S.Troops < 100) { S.Troops += Math.ceil(jsRandom(2,5)); + } else { + if (V.SF.Target === "recruit") { + S.Troops += Math.ceil(jsRandom(-1*S.Troops/100,0)); + } else if (V.SF.Target === "raiding") { + S.Troops += Math.ceil(jsRandom(-3*S.Troops/100,-4*S.Troops/100)); + } else { S.Troops += Math.ceil(jsRandom(-2*S.Troops/100,-3*S.Troops/100)); } + } + if (V.SF.UC.Assign > 0) { + if (V.SF.UC.Assign < 2) { V.SFUC=Math.ceil(S.Troops*0.1); + } else { V.SFUC=Math.ceil(S.Troops*0.25); } + } S.Troops -= V.SFUC; + if (S.Troops > 200) { Trade += 0.05*(Math.ceil(S.Troops/100)); + Multiplier.troop += S.Troops/200; upkeep += (S.Troops*25)/cost.a; + if (V.secExp > 0) { + V.authority += 25*(Math.ceil(S.Troops/200)); V.authority=Math.clamp(V.authority, 0, 20000); + } + } + + if (S.Firebase > 0) { + FNG += S.Firebase; Trade += 0.5*S.Firebase; Multiplier.unit += 7.5*S.Firebase+2*Math.pow(S.Firebase,2)*cost.a; upkeep += (95*10+S.Firebase)*cost.b; + } + if (S.Armoury > 0) { + FNG += 2*S.Armoury; Trade += 0.25*S.Armoury; Multiplier.unit += 7.5*S.Armoury+2*Math.pow(S.Armoury,2)*cost.a; upkeep += (55*S.Armoury)*cost.b; + } + if (S.Drugs > 0) { + FNG += S.Drugs; Trade += 0.25*S.Drugs; Multiplier.unit += 7.5*S.Drugs+2*Math.pow(S.Drugs,2)*cost.a; upkeep += (35*S.Drugs)*cost.b; + } + if (S.Firebase >= 1) { + if (S.AV > 0) { + FNG += S.AV; Trade += 0.25*S.AV; Multiplier.unit += 7.5*S.AV+2*Math.pow(S.AV,2)*cost.a; upkeep += (89*S.AV)*cost.b; + } + if (S.TV > 0) { + FNG += S.TV; Trade += 0.25*S.TV; Multiplier.unit += 7.5*S.TV+2*Math.pow(S.TV,2)*cost.a; upkeep += (89*S.TV)*cost.b; + } + if (S.PGT > 0) { + FNG += S.PGT; Trade += 0.25*S.PGT; Multiplier.unit += 15*S.PGT+3*Math.pow(S.PGT,2)*cost.a; upkeep += (100*S.PGT)*cost.b; + } + } + + if (S.Firebase >= 2 && S.Drones > 0) { + FNG += S.Drones; Trade += 0.5*S.Drones; Multiplier.unit += 7.5*S.Drones+2*Math.pow(S.Drones,2)*cost.a; upkeep += (50*S.Drones)*cost.b; + } + + if (S.Firebase >= 4) { + if (S.AA > 0) { + FNG += S.AA; Trade += 0.25*S.AA; Multiplier.unit += 7.5*S.AA+2*Math.pow(S.AA,2)*cost.a; upkeep += (100*S.AA)*cost.b; + } + if (S.TA > 0) { + FNG += S.TA; Trade += 0.25*S.TA; Multiplier.unit += 7.5*S.TA+2*Math.pow(S.TA,2)*cost.a; upkeep += (100*S.TA)*cost.b; + } + if (S.SpacePlane > 0) { + FNG += S.SpacePlane; Trade += 0.25*S.SpacePlane; Multiplier.unit += 7.5*S.SpacePlane+2*Math.pow(S.SpacePlane,2)*cost.a; upkeep += (100*S.SpacePlane)*cost.b; + } + if (S.GunS > 0) { + FNG += S.GunS; Trade += 0.25*S.GunS; Multiplier.unit += 12*S.GunS+3*Math.pow(S.GunS,2)*cost.a; upkeep += 70*S.GunS; + } + if (S.Satellite.lv > 0 && S.Satellite.InOrbit > 0) { + FNG += S.Satellite.lv; Trade += 0.25*S.Satellite.lv; Multiplier.unit += 15*S.Satellite.lv+5*Math.pow(S.Satellite.lv,2)*cost.a; upkeep += (85*S.Satellite.lv)*cost.b; + } + if (S.GiantRobot > 0) { + FNG += S.GiantRobot; Trade += 0.25*S.GiantRobot; Multiplier.unit += 15*S.GiantRobot+5*Math.pow(S.GiantRobot,2)*cost.a; upkeep += (95*S.GiantRobot)*cost.b; + } + if (S.MissileSilo > 0) { + FNG += S.MissileSilo; Trade += 0.25*S.MissileSilo; Multiplier.unit += 15*S.MissileSilo+5*Math.pow(S.MissileSilo,2)*cost.a; upkeep += (100*S.MissileSilo)*cost.b; + } + } + + if (S.AircraftCarrier > 0) { + FNG += S.AircraftCarrier; Trade += 0.25*S.AircraftCarrier; Multiplier.unit += 9*S.AircraftCarrier+3*Math.pow(S.AircraftCarrier,2)*cost.a; upkeep += (80*S.AircraftCarrier)*cost.b; + } + if (S.Sub > 0) { + FNG += S.Sub; Trade += 0.25*S.Sub; Multiplier.unit += 7.5*S.Sub+2*Math.pow(S.Sub,2)*cost.a; upkeep += (90*S.Sub)*cost.b; + } + if (S.HAT > 0) { + FNG += S.HAT; Trade += 0.25*S.HAT; Multiplier.unit += 7.5*S.HAT+2*Math.pow(S.HAT,2)*cost.a; upkeep += (70*S.HAT)*cost.b; + } + + switch (V.SF.Colonel.Core) { + case "kind": FNG += 10; Trade += 0.15; SFD -= 0.15; break; + case "cruel": Trade -= 0.15; SFD += 0.15; break; + case "brazen": FNG += 15; Multiplier.unit += 0.5; break; + case "jaded": Trade -= 0.05; SFD += 0.05; break; + case "shell shocked": Trade += 0.05; SFD -= 0.05; Multiplier.unit -= 0.5; break; + } + if (V.SF.Target === "raiding") { SFD += 0.05; Multiplier.action += 0.5; + } else if (V.SF.Target === "secure") { SFD -= 0.05; Multiplier.action += 0.2; + } else { SFD -= 0.1; Multiplier.action -= 0.5; } + if (V.SF.ROE === "free") { Multiplier.action *= 0.8; SFD += 0.05; Trade += Trade*0.95; + } else if (V.SF.ROE == "hold") { Multiplier.action *= 1.1; SFD -= 0.05; Trade += Trade*1.05; } + if (V.SF.Regs === "none") { Multiplier.action *= 0.8; SFD += 0.05; Trade += Trade*0.95; + } else if (V.SF.Regs === "strict") { Multiplier.action *= 1.1; SFD -= 0.05; Trade += Trade*1.05; + Multiplier.depravity=1+SFD; } + if (SFD > -2) Trade *= 1+SFD/2; + + if (V.SF.Target === "recruit") { FNG += Math.ceil(FNG*0.95); + } else { FNG += Math.ceil(FNG*0.25); } + if (V.SF.Target === "secure") { V.rep += Math.ceil(V.rep*((Trade/100)*0.95)); + V.arcologies[0].prosperity=Math.ceil((V.arcologies[0].prosperity+(Trade/10)*0.95)); + } else { V.rep += Math.ceil(V.rep*(Trade/100)*0.25); + V.arcologies[0].prosperity=Math.ceil(V.arcologies[0].prosperity+(Trade/10)*0.25);} + if (V.secExp > 0) V.authority += V.SF.Size*10; V.authority=Math.clamp(V.authority, 0, 20000); + + income += Math.ceil( (baseLine* (0.09+Multiplier.troop/NO).toFixed(2) * (0.09+Multiplier.unit/NO).toFixed(2) * (0.09+Multiplier.action/NO).toFixed(2) * (0.09+Multiplier.depravity/NO).toFixed(2) )-(upkeep*N1).toFixed(2) ); S.Troops += Math.round(FNG/2); + r += `income:${commaNum(income)}, troop:${commaNum((0.09+Multiplier.troop/NO).toFixed(2))}, unit:${commaNum((0.09+Multiplier.unit/NO).toFixed(2))}, action:${commaNum((0.09+Multiplier.action/NO).toFixed(2))}, depravity:${commaNum((0.09+Multiplier.depravity/NO).toFixed(2))}, upkeep:${commaNum((upkeep*N1).toFixed(2))}`; + //if (V.economy < 100) income=Math.ceil(income*(1+(V.week/100))); //Remove line if hard mode ever gets fixed. + if (income >= target) profit=1; delete V.SF.Subsidy; cashX(income, "specialForces"); + if (S.Troops > unitCap) S.Troops=unitCap; + if (V.rep > 20000) V.rep=20000; + if (V.arcologies[0].prosperity > V.ProsperityCap) V.arcologies[0].prosperity=V.ProsperityCap; + + if (S.Drugs >= 8 || S.Drugs >= 10) { var survivalChance=50; + if (S.Drugs >= 8) {survivalChance -= 5;} else if (S.Drugs >= 10) {survivalChance += 5;} + if (jsRandom(0,100) > survivalChance) deaths=jsRandom(0,((S.Drugs*2)+4)); + if (deaths > 0) S.Troops -= deaths; + } + if (V.SF.UC.Assign === 1 && V.SF.UC.Lock < 1) V.SF.UC.Assign=0; + if (V.SF.Upgrade !== undefined) V.SF.Upgrade=0; V.SF.Gift=0; + V.SF.Colonel.Talk=0; V.SF.Colonel.Fun=0; + + r += `<br>__Week ${V.week} operational report for ${V.SF.Lower}__:`; + r += `<br>${V.SF.Caps} focused their ${commaNum(S.Troops)} troops on `; + if (V.SF.Target === "recruit") { + r += `recruiting and training more personnel. Smaller parties ventured out to protect the arcology's trade routes and strike targets of opportunity.`; + } else if (V.SF.Target === "secure") { + r += `securing the trade routes between the arcology and the surrounding area. Smaller parties ventured out to strike targets of opportunity and process new recruits.`; + } else { + r += `locating and striking targets of opportunity, capturing both material loot and new slaves. Smaller parties secured the most important of the arcology's trade routes and processed new recruits.`; + } + if (V.SF.UC.Assign > 0) { + r += `<br>A ${V.SF.UC.Assign < 2 ? 'small':'large'} portion of the force was assigned as ${V.SF.UC.Assign < 2 ? 'part':'full'} time undercover officers.`; + } + if (deaths > 0) { + r += ` <span class='red'>${deaths} soldiers fatally overdosed on the drug cocktail</span>`; + if (V.SF.MercCon.CanAttend === -1) r += `, The Colonel's much heavier than average drug use saves her from this side effect.`; + } + r += `<br>These activities have, overall, <span class='green'>improved your arcology's prosperity</span>.`; + r+= ` The goods procured by ${V.SF.Lower} after accounting for the spoils retained by individual soldiers were `; + if (profit > 0) { + r += `<span class='green'>more than sufficient to cover expenses</span>. Excess material and human assets totaling <span class='yellowgreen'>${cashFormat(income)}</span> (after liquidation) were transferred to your accounts.`; + } else { + r += `<span class='red'>barely enough to cover expenses.</span> More growth will be needed to ensure profitability, <span class='yellow'>hopefully purchasing more upgrades will help</span>.`; + r += ` Per the estimates that ${SFC()} provides, an additional <span class='yellowgreen'>${cashFormat(target-income)}</span> is required for sufficient cover.`; + } + r += ` ${V.SF.Caps} managed to recruit ${Math.round(FNG/2)} new soldiers this week, and your reputation has <span class='green'>increased through the improvement of trade security</span>.`; + r += `<br>//Your instructions to ${SFC()}://`; + r += `<br> Deployment focus: `; + r += `<span id="focus"> <<if $SF.Target == "recruit">>''Recruiting and Training''<<elseif $SF.Target == "secure">>''Securing Trade Routes''<<else>>''Raiding and Slaving''<</if>></span>. `; + r += `<<link "Recruit and Train">> <<set $SF.Target="recruit">> <<replace "#focus">>''Recruiting and Training''<</replace>> <</link>> | <<link "Secure Trade Routes">> <<set $SF.Target="secure">> <<replace "#focus">>''Securing Trade Routes''<</replace>> <</link>> | <<link "Raiding and Slaving">> <<set $SF.Target="raiding">> <<replace "#focus">>''Raiding and Slaving''<</replace>> <</link>>`; + r += `<br> Rules of Engagement: `; + r += `<span id="roe"> <<if $SF.ROE === "hold">>''Hold Fire''<<elseif $SF.ROE === "limited">>''Limited Fire''<<else>>''Free Fire''<</if>></span>. `; + r += `<<link "Hold Fire">> <<set $SF.ROE="hold">> <<replace "#roe">>''Hold Fire''<</replace>> <</link>> | <<link "Limited Fire">> <<set $SF.ROE="limited">> <<replace "#roe">>''Limited Fire''<</replace>> <</link>> | <<link "Free Fire">> <<set $SF.ROE="free">> <<replace "#roe">>''Free Fire''<</replace>> <</link>>`; + r += `<br> Accountability: `; + r += `<span id="accountability"> <<if $SF.Regs === "strict">>''Strict Accountability''<<elseif $SF.Regs === "some">>''Some Accountability''<<else>>''No Accountability''<</if>></span>. `; + r += `<<link "Strict Accountability">> <<set $SF.Regs="strict">> <<replace "#accountability">>''Strict Accountability''<</replace>> <</link>> | <<link "Some Accountability">> <<set $SF.Regs="some">> <<replace "#accountability">>''Some Accountability''<</replace>> <</link>> | <<link "No Accountability">> <<set $SF.Regs="none">> <<replace "#accountability">>''No Accountability''<</replace>> <</link>>`; + if (V.SF.MercCon.View > 0 && V.SF.MercCon.CanAttend === 1) { + V.SF.MercCon.Income=0; V.SF.MercCon.Menials=0; + var tradeShowAttendes=200, menialGiftsPerAttendee=5, NewMercs=0; + var menialGifts=Math.ceil(jsRandom(1,((tradeShowAttendes*menialGiftsPerAttendee)/10))); + var TSProfit=Math.ceil(500000*(1+(V.SF.Size/1000))*(1+(V.arcologies[0].prosperity/1000))*T.Env); + V.menials += menialGifts; V.SF.MercCon.History += 1; + V.SF.MercCon.Menials += menialGifts; V.SF.MercCon.TotalMenials += menialGifts; + V.SF.MercCon.Income += TSProfit; V.SF.MercCon.Revenue += TSProfit; + cashX(TSProfit, "specialForces"); + if (V.secExp > 0 && V.mercenaries > 0) { V.SF.MercCon.Mercs=0; + NewMercs=jsRandom(1,(tradeShowAttendes/10)); + V.mercFreeManpower += NewMercs; V.SF.MercCon.TotalMercs += NewMercs; + V.SF.MercCon.Mercs += NewMercs; + } + r += `<br>''TradeShow'': During a break, The Colonel managed to sell some generic schematics to the ${tradeShowAttendes} attendees, some of whom decided to also give a few menial slaves as a bonus.<br>`; + } + return r; +}; + +window.SFNameCapsCheck = function() { + const V=State.variables; + if (V.SF.Lower != "the special force") V.SF.Caps=V.SF.Lower.replace("the ", "The "); +}; + +window.SFUpgradeCost = function(cost,unit) { + const V=State.variables,T=State.temporary,S=V.SF.Squad; var value=0; + //return Math.ceil(cost*T.Env*(1.15+(V.SF.Size/10))*(1.15+(unit/100))*HSM()); + value=cost*T.Env*(1.15+(V.SF.Size/10))*(1.15+(unit/100)); + if ([S.Sub,S.AircraftCarrier,S.MissileSilo,S.GiantRobot,S.Satellite.lv,S.GunS,S.SpacePlane,S.Drones].includes(unit)) value *= V.HackingSkillMultiplier; + return Math.ceil(value); +}; + +window.progress = function(x,max) { + var out = `â`, z, i; + if (max === undefined) { + Math.clamp(x,0,10); + if (State.variables.SF.Size < 30) { + z = 5 - x; + for (i=0;i<x;i++) out += `â–ˆâ`; + for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`; + for (i=0;i<5;i++) out += `â–‘â`;} + else { + z = 10 - x; + for (i=0;i<x;i++) out += `â–ˆâ`; + for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`;}} + else { + Math.clamp(x,0,max); + x=Math.floor(10*x/max); + z=10 - x; + for (i=0;i<x;i++) out += `â–ˆâ`; + for (i=0;i<z;i++) out += `<span style=\"opacity: 0;\">â–ˆ</span>â`;} + return `${out}`; +}; + +window.SFC = function() { + const V=State.variables; + if (V.SF.MercCon.CanAttend === -1) {return `The Colonel`;} + else { + if (V.SF.Facility.LCActive > 0) {return `Lieutenant Colonel ${SlaveFullName(V.SF.Facility.LC)}`;} + else {return `a designated soldier`;}} +}; + +window.SFCR = function() { + const V=State.variables, C=V.SF.Colonel; + if (C.Status <= 19) {return `boss`;} + else if (C.Status <= 39) {return `friend`;} + else {return `fuckbuddy`;} +}; + +window.Interactions = function() { + const V=State.variables, C=V.SF.Colonel, T=State.temporary; + var choice=``; time=``; + if (V.SF.Gift > 0) { + if (V.choice == 1) { + choice +=`${V.SF.Caps} is turning over spare capital in tribute this week. `; + if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { + choice += `"I think I can find <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> for you, boss."`; + } else { + choice += `"We can spare <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> in tribute this week, boss".`; } + } else if (V.choice == 2) { + choice += `${V.SF.Caps} will be throwing a military parade this week. `; + if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { + choice += `"I expect the <span class='green'>public to enjoy</span> the parade, boss."`; + } else { + choice += `"I'll have plans for an <span class='green'>popular parade</span> on your desk, boss".`; } + } else if (V.choice == 3) { + choice += `${V.SF.Caps} will be conducting corporate sabotage on rival arcologies' businesses. `; + if (V.SF.MercCon.CanAttend === -1 && (C.Talk + C.Fun !== 1)) { + choice += `"Our interests should see a <span class='yellowgreen'>big boost,</span> boss."`; + } else { + choice += `"Your <span class='yellowgreen'>arcology's business prospects should see an improvement</span> this week, boss".`; } + } + } if (C.Talk + C.Fun > 0) time=`<br>The Colonel is busy for the rest of the week, so the Lieutenant Colonel will assist you.`; + return `${time} <br>${choice}`; +}; + window.BadOutcome = function() { const V=State.variables,t=`The Colonel's`; var r =``;V.SF.Active=-2; switch(V.SF.Colonel.Core) { @@ -683,11 +558,268 @@ window.BadOutcome = function() { window.FlavourText = function() { const V=State.variables,T=State.temporary,S=V.SF.Squad; + function TroopDec() { + const common=`the ${commaNum(V.SF.Squad.Troops)} members of ${V.SF.Lower}`; + if (S.Troops < 100) {return `sparsely occupied, ${common} residing within them concentrating together in a corner. The hundreds of empty beds and lockers visibly herald the future`;} + else if (S.Troops < 400) {return `lightly occupied, with ${common} starting to spread out across them`;} + else if (S.Troops < 800) {return `moderately occupied, though ${common} residing within have a considerable amount of extra room`;} + else if (S.Troops < 1500) {return `well-occupied, and ${common} residing within have started to form small cliques based on section and row`;} + else {return `near capacity, and ${common} often barter their personal loot, whether it be monetary or human, for the choicest bunks`;} + } + + function Firebase() { + var appear=`is currently constructed in a haphazard fashion.`; var barracks=`Soldiers' cots are mixed in with weapons crates and ammunition.`; var slave=`Cages for processing slaves lie off to one side,`; var common=`and in the center is a common area with tables for soldiers to gather around for meals or rowdy conversations.`; var garage=``; var drone=``; var hangar=``; var launch=``; var artillery=``; var comms=``; var training=``; + if (S.Firebase >= 1) {appear=`has had some organization put into it.`; barracks=`The majority of weapons, armor, and ammunition have been separated from the soldiers' cots into their own armory.`; garage=`A section near the outer wall of the arcology has been converted to a garage with an adjoining vehicle maintenance bay`; drone=`.`; + if (V.terrain === "oceanic") garage += ` for inter-arcology travel`;} + if (S.Firebase >= 2) barracks=`A barracks has been constructed near the armory, allowing soldiers a quieter place to sleep and store their personal spoils.`; drone=`; as well as a facility for the storage, maintenance, and deployment of armed combat drones.`; + if (S.Firebase >= 3) appear=`has become more permanent.`; barracks=`A command center has been constructed near the barracks and armory, allowing for additional support personnel.`; + if (S.Firebase >= 4) hangar=`Hangar space for storing and repairing aircraft has been converted from unused space on the other side of the garage.`; + if (S.Firebase >= 5) { + appear=`is nearing the appearance of a military base.`; launch=`The rest of the firebase has been designated for special projects.`; artillery=`Artillery batteries are set around the base of the arcology.`; + if (V.terrain === "oceanic" || V.terrain === "marine") launch += ` A Naval Yard has been constructed in the waters near the arcology.`;} + if (S.Firebase >= 6) common=`and in the center is a common area for recreation, including a small movie theater and a mess hall.`; + if (S.Firebase >= 7) {slave=`A slave detention facility has been sectioned off to one side`; + if (V.SF.Depravity > 1.5) slave += ` emanating the sounds of rape and torture`; + slave += `;`;} + if (S.Firebase >= 8) appear=`has become a fully fledged military base.`; comms=`A Free City-wide communication network for ${V.SF.Lower} has been constructed to facilitate faster responses and efficient monitoring of the surrounding area.`; + if (S.Firebase >= 9) training=`A high-tech killhouse has been constructed to aid in soldier training.`; + if (S.Firebase >= 10) artillery=`Railgun artillery batteries are set around the base of the arcology, capable of accurately destroying enemies an absurd distance away.`; + return `The firebase ${appear} ${barracks} ${comms} ${training} ${slave} ${common} ${garage}${drone} ${hangar} ${launch} ${artillery}`; + } + + function Armoury() { + var weapons=`The weapons are mostly worn rifles that have already seen years of service before ${V.SF.Lower} acquired them.`; var armor=`The body armor is enough to stop smaller calibers, but nothing serious.`; var comms=``; var helmets=``; var ammo=``; var uniforms=``; var special=``; var exo=``; + if (S.Armoury >= 1) comms=`Radios have been wired into the soldiers helmets`; helmets=`.`; + if (S.Armoury >= 2) helmets=` and a HUD has been integrated into the soldier's eyewear.`; + if (S.Armoury >= 3) ammo=`Tactical vests have been provided, allowing soldiers to carry additional ammo.`; + if (S.Armoury >= 4) armor=`The body armor is a newer variant, able to stop small arms fire and protect against shrapnel.`; + if (S.Armoury >= 5) weapons=`The weapons are modern rifles and sidearms, putting ${V.SF.Lower} on par with rival mercenary outfits.`; + if (S.Armoury >= 6) uniforms=`New uniforms have been distributed that are more comfortable and made of breatheable fabric to keep soldiers from overheating.`; + if (S.Armoury >= 7) special=`Specialized weaponry is available for various roles, allowing more flexibility in planning.`; + if (S.Armoury >= 8) helmets=`and a HUD and camera display have been integrated into soldiers' eyewear, enabling accurate aim around corners or from behind cover`; + if (S.Armoury >= 9) exo=`An exosuit has been developed to reduce the amount of weight soldiers carry, increase lifting strength, and move faster in combat.`; + if (S.Armoury >= 10) weapons=`Cutting-edge weaponry is available to ${V.SF.Lower}, far outpacing the ability of rival mercenary outfits.`; + return `The armory holds soldiers' weapons and gear while not in training or combat. ${weapons} ${special} ${armor} ${comms}${helmets} ${ammo} ${uniforms} ${exo}`; + } + + function Drugs() { + var amphet=``; var phen=``; var steroid=``; var downer=``; var concen=``; var stimpack=``; var stabilizer=``; + if (S.Drugs >= 1) amphet=`Amphetamines have been added to the cocktail at a low dosage to act as a stimulant, physical performance enhancer, cognition control enhancer. Some side-effects exist.`; + if (S.Drugs >= 2) phen=`Phencyclidine has been added to the cocktail at a low dosage as a dissociative psychotropic for soldiers in battle to introduce feelings of detachment, strength and invincibility, and aggression. Some side-effects reduce the tolerable dosage before soldiers go on uncontrollable violent outbreaks.`; + if (S.Drugs >= 3) steroid=`Testosterone is being produced for soldiers in training as a natural muscle growth stimulant and to invoke aggression.`; + if (S.Drugs >= 4) downer=`Zaleplon is being produced as a downer to counteract the battle cocktail and encourage rest before combat.`; + if (S.Drugs >= 5) concen=`Methylphenidate has been added to the cocktail as a stimulant and to improve soldier concentration.`; + if (S.Drugs >= 6) phen=`A phencyclidine-based drug has been added to the cocktail as a dissociative psychotropic for soldiers in battle to introduce controllable feelings of detachment, strength and invincibility, and aggression.`; + if (S.Drugs >= 7) steroid=`Low levels of anabolic steroids are being produced for soldiers in training to stimulate muscle growth and invoke aggression.`; + if (S.Drugs >= 8) amphet=`Diphenylmethylsulfinylacetamide has been added to the cocktail to counteract the effects of sleep deprivation and promote alertness.`; + if (S.Drugs >= 9) stimpack=`A stimpack of the battle cocktail is being given to soldiers in battle to take if the original dose wears off before the battle is over.`; + if (S.Drugs >= 10) stabilizer=`A stabilizer has been added to the battle cocktail that helps tie effects together while reducing side-effects, leading to an effectively safe supersoldier drug.`; + return `A drug lab has been established to increase the effectiveness of ${V.SF.Lower}'s soldiers. Many of these chemicals are mixed into a single 'battle cocktail' to be taken before combat. ${amphet} ${phen} ${concen} ${steroid} ${downer} ${stimpack} ${stabilizer}`; + } + + function LUAV() { + var a=`have been recommissioned for use by ${V.SF.Lower}`; var b=`.`; var c=``; var d=``; var e=``; var f=``; var g=``; var h=``; var i=``; var j=``; var k=``; + if (S.Drones >= 2) a=`equipped with missiles are resting on one side of the drone bay`; b=`; as well as destroying the occasional target.`; + if (S.Drones >= 3) c=`A fleet of`; d=`large delivery quadcopters have been converted for military service to support ground forces as combat drones.`; + if (S.Drones >= 4) d=`combat drones take up the rest of the space in the drone bay. They have a`; e=`small automatic rifle`; f=`mounted to the underside.`; + if (S.Drones >= 5) g=`Armor has been added to protect vulnerable components from small arms fire.`; + if (S.Drones >= 6) h=`The fleet's batteries have been replaced with higher capacity models, increasing the functional time spent in combat.`; + if (S.Drones >= 7) i=`The propellers and motors have been upgraded, increasing maneuverability and speed.`; + if (S.Drones >= 8) j=`The drone control signal has been boosted and encrypted, giving the drones a greater range and protecting against electronic warfare.`; + if (S.Drones >= 9) e=`light machine gun`; + if (S.Drones >= 10) k=`A drone-to-drone network has been installed, allowing drones to swarm, maneuver, and attack targets autonomously.`; + return `Surveillance drones ${a}. During combat, they supply aerial intel to commanders and act as the communications network for ground forces${b} ${c} ${d} ${e} ${f} ${g} ${h} ${i} ${j} ${k}`; + } + + function AV() { + var b=`has been recommissioned for use by ${V.SF.Lower}. They`; var c=`; var mechanics are methodically checking the recent purchases for battle-readiness`; var MG=`120 mm main gun is enough to handle the majority of opponents around the Free Cities.`; var engine=``; var armor=``; var armor2=``; var ammo=``; var mg=``; var fireC0=``; var fireC1=``; var fireC2=``; var fireC3=``; var turret=``; + if (S.AV >= 2) engine=`The engine has been overhauled, allowing much faster maneuvering around the battlefield.`; b=``; c=``; + if (S.AV >= 3) armor=`A composite ceramic armor has replaced the original, offering much greater protection from attacks.`; + if (S.AV >= 4) ammo=`The tanks have been outfitted with additional types of ammo for situational use.`; + if (S.AV >= 5) mg=`A remote-controlled .50 cal machine gun has been mounted on the turret to handle infantry and low-flying aircraft.`; + if (S.AV >= 6) fireC0=`A fire-control system`; fireC3=`been installed, guaranteeing`; fireC2=`has`; fireC1=`accurate fire.`; + if (S.AV >= 7) fireC2=`and an autoloader have`; fireC1=`rapid, accurate fire while separating the crew from the stored ammunition in the event the ammo cooks off.`; + if (S.AV >= 8) armor2=`A reactive armor system has been added, giving the tank an additional, if temporary, layer of protection.`; + if (S.AV >= 9) turret=`The turret has been massively redesigned, lowering the tank profile and increasing the efficiency of the mechanisms within.`; + if (S.AV >= 10) MG=`140 mm main gun can quash anything even the greatest Old World nations could muster.`; + return `A fleet of main battle tanks ${b} are parked in the garage${c}. ${turret} The ${MG} ${ammo} ${mg} ${fireC0} ${fireC2} ${fireC3} ${fireC1} ${engine} ${armor} ${armor2}`; + } + + function TV() { + var B=`has been recommissioned for use by ${V.SF.Lower}. They`; var C=`; var mechanics are giving the new purchases a final tuneup`; var squad=`a squad`; var G1=`20`; var G2=`in a firefight`; var e0=`The engine has been`; var engine=``; var armor=``; var tires=``; var m1=``; var m2=``; var pod1=``; var pod2=``; + if (S.TV >= 2) engine=`${e0} overhauled, allowing for higher mobility.`; C=``; B=``; + if (S.TV >= 3) armor=`Composite armor has been bolted to the exterior, increasing the survivability of an explosive attack for the crew and passengers.`; + if (S.TV >= 4) tires=`The tires have been replaced with a much more durable version that can support a heavier vehicle.`; + if (S.TV >= 5) m1=`An automatic missile defense system has been installed,`; m2=`targeting any guided missiles with laser dazzlers and deploying a smokescreen.`; + if (S.TV >= 6) pod1=`An anti-tank missile pod`; pod2=`has been installed on the side of the turret.`; + if (S.TV >= 7) G1=`25`; G2=`by attacking enemies through cover and destroying light armor`; + if (S.TV >= 8) pod2=`and an anti-aircraft missile pod have been installed on either side of the turret.`; + if (S.TV >= 9) squad=`two squads`; armor=``; m2=`destroying any incoming missiles with a high-powered laser. Some of the now redundant composite armor has been removed, and the reclaimed space allows for more passengers.`; + if (S.TV >= 10) engine=`${e0} replaced with the newest model, allowing the vehicle to get in and out of the conflict extremely quickly.`; + return `A fleet of infantry fighting vehicles ${B} are parked in the garage${C}. The IFVs can carry ${squad} of 6 to a firezone. The ${G1} mm autocannon supports infantry ${G2}. ${pod1} ${pod2} ${engine} ${armor} ${tires} ${m1} ${m2}`; + } + + function PGT() { + var b=`has been sold to ${V.SF.Lower} through back channels to support a failing Old World nation. The tank is so large it cannot fit inside the garage, and has`; var c=``; var engines=`. Two engines power the left and right sides of the tank separately, leaving it underpowered and slow`; var gun0=``; var gun1=``; var gun2=`an undersized main gun and makeshift firing system from a standard battle tank`; var armor1=``; var armor0=``; var cannon=``; var laser=``; var PGTframe=``; + if (S.PGT >= 2) c=`rests in`; b=``; engines=` and powered by their own engine, allowing the tank to travel with an unsettling speed for its massive bulk`; + if (S.PGT >= 3) gun0=`a railgun capable of`; gun1=`firing steel slugs`; gun2=`through one tank and into another`; + if (S.PGT >= 4) armor0=`reinforced, increasing survivability for the crew inside.`; armor1=`The armor has been`; + if (S.PGT >= 5) cannon=`A coaxial 30mm autocannon has been installed in the turret, along with automated .50 cal machine guns mounted over the front treads.`; + if (S.PGT >= 6) laser=`Laser anti-missile countermeasures have been installed, destroying any subsonic ordinance fired at the Goliath.`; + if (S.PGT >= 7) PGTframe=`The frame has been reinforced, allowing the Goliath to carry more armor and guns.`; + if (S.PGT >= 8) armor0=`redesigned with sloping and state-of-the-art materials, allowing the Goliath to shrug off even the most advanced armor-piercing tank rounds.`; + if (S.PGT >= 9) gun1=`firing guided projectiles`; + if (S.PGT >= 10) gun0=`a twin-barreled railgun capable of rapidly`; + return `A prototype Goliath tank ${b}${c} its own garage housing built outside the arcology. The massive bulk is spread out over 8 tracks, two for each corner of the tank${engines}. The turret is equipped with ${gun0} ${gun1} ${gun2}. ${cannon} ${armor1} ${armor0} ${laser} ${PGTframe}`; + } + + function AA() { + var W1=`only armed`; var W2=`;`; var W3=`a poor weapon against flying targets, but enough to handle ground forces`; var group=`A small group of attack VTOL have been recommissioned for use by ${V.SF.Lower}, enough to make up a squadron`; var engines=``; var TAI=``; var lock=``; var support=``; var stealth=``; var scramble=``; var PAI=``; + if (S.AA >= 2) W1=`armed`; W2=` and air-to-air missiles,`; W3=`a combination that can defend the arcology from enemy aircraft, as well as`; support=` support ground troops`; + if (S.AA >= 3) engines=`The engines have been tuned, allowing faster flight with greater acceleration.`; + if (S.AA >= 4) TAI=`An advanced targeting AI has been installed to handle all control of weapons, allowing much more efficient use of ammunition and anti-countermeasure targeting.`; + if (S.AA >= 5) lock=`Installed multispectrum countermeasures protect against all types of missile locks.`; + if (S.AA >= 6) group=`A respectable number of attack VTOL protect your arcology, split into a few squadrons`; + if (S.AA >= 7) support=` attack ground targets`; W2=`; rocket pods, and air-to-air missiles,`; + if (S.AA >= 8) stealth=`The old skin has been replaced with a radar-absorbent material, making the aircraft difficult to pick up on radar.`; + if (S.AA >= 9) scramble=`The VTOLs can scramble to react to any threat in under three minutes.`; + if (S.AA >= 10) PAI=`A piloting AI has been installed, allowing the VTOLs to perform impossible maneuvers that cannot be done by a human pilot. This removes the need for a human in the aircraft altogether.`; + return `${group}. Several of the landing pads around $arcologies[0].name host groups of four fighters, ready to defend the arcology. ${scramble} The attack VTOL are currently ${W1} with a Gatling cannon${W2} ${W3}${support}. ${TAI} ${PAI} ${engines} ${lock} ${stealth}`; + } + + function TA() { + var Num=`number`; var type=`tiltrotor`; var capacity=`small platoon or 15`; var engines=``; var engines2=``; var Radar=``; var Armor=``; var landing=``; var miniguns=``; var counter=``; + if (S.TA >= 2) engines=`The tiltrotor engines have been replaced with a more powerful engine, allowing faster travel times.`; + if (S.TA >= 3) counter=`Multispectrum countermeasures have been added to protect against guided missiles.`; + if (S.TA >= 4) miniguns=`Mounted miniguns have been installed to cover soldiers disembarking in dangerous areas.`; + if (S.TA >= 5) Num=`large number`; + if (S.TA >= 6) landing=`The landing equipment has been overhauled, protecting personnel and cargo in the event of a hard landing or crash.`; + if (S.TA >= 7) Armor=`Armor has been added to protect passengers from small arms fire from below.`; + if (S.TA >= 8) capacity=`large platoon or 20`; engines2=`Further tweaks to the engine allow for greater lifting capacity.`; + if (S.TA >= 9) Radar=`Radar-absorbent materials have replaced the old skin, making it difficult to pick up the VTOL on radar.`; + if (S.TA >= 10) type=`tiltjet`; engines2=``; engines=`The tiltrotors have been replaced with tiltjets, allowing for much greater airspeed and acceleration.`; + return `A ${Num} of transport ${type} VTOL have been recommissioned for use by ${V.SF.Lower}. The VTOLs are resting on large pads near the base to load either a ${capacity} tons of material. ${engines} ${engines2} ${Armor} ${landing} ${counter} ${Radar} ${miniguns}`; + } + + function SP() { + var engine=`ramjet engines in the atmosphere that can reach Mach 10`; var b=`has been purchased from an insolvent Old World nation. It `; var shield=``; var camera=``; var efficiency=``; var camera2=``; var drag=``; var crew=``; var engine2=``; var skin=``; + if (S.SpacePlane >= 2) b=``; shield=`The current heat shielding has been upgraded, reducing the likelihood of heat damage during reentry.`; + if (S.SpacePlane >= 3) engine2=` and liquid rocket engines in orbit that can reach an equivalent Mach 18`; + if (S.SpacePlane >= 4) camera=`A state-of-the-art camera has been installed in the underbelly that takes incredibly high resolution photos, but requires the frictionless environment of space to focus.`; + if (S.SpacePlane >= 5) efficiency=`Tweaks to the engines have increased fuel efficiency to the point where midflight refueling is no longer necessary.`; + if (S.SpacePlane >= 6) camera2=`The camera sensor is capable of taking IR shots.`; + if (S.SpacePlane >= 7) drag=`Miraculous advances in aerodynamics and materials allow frictionless flight, even while in the atmosphere.`; + if (S.SpacePlane >= 8) crew=`Increased the crew comfort and life support systems to increase operational time.`; + if (S.SpacePlane >= 9) skin=`Replaced the underbelly skin with a chameleon kit, matching the color to the sky above it.`; + if (S.SpacePlane >= 10) engine=`experimental scramjet engines in the atmosphere that can reach Mach 15`; engine2=` and liquid rocket engines in orbit that can reach an equivalent Mach 25`; + return `A prototype spaceplane ${b} rests in the hangar, its black fuselage gleaming. The craft is powered by ${engine}${engine2}. ${efficiency} ${shield} ${camera} ${camera2} ${drag} ${crew} ${skin}`; + } + + function GunS() { + var a=`has been recommissioned for use by ${V.SF.Lower}. Currently, it `; var b=``; var c=``; var d=``; var e=`Miniguns and Gatling cannons line`; var f=`; var though the distance to ground targets renders the smaller calibers somewhat less useful`; var g=``; var h=``; var i=``; var j=``; var k=``; + if (S.GunS >= 2) b=`Infrared sensors have been added for the gunners to better pick targets.`; a=``; + if (S.GunS >= 3) c=`The underside of the aircraft has been better armored against small-arms fire`; h=`.`; + if (S.GunS >= 4) d=`Larger fuel tanks have been installed in the wings and fuselage, allowing the gunship to provide aerial support for longer periods before refueling.`; + if (S.GunS >= 5) e=`25 mm Gatling cannons`; f=`; allowing the gunship to eliminate infantry`; j=` and light vehicles from above`; k=` and a 40 mm autocannon are mounted on`; + if (S.GunS >= 6) g=`The engines have been replaced, allowing both faster travel to a target, and slower travel around a target.`; + if (S.GunS >= 7) h=`; and multi-spectrum countermeasures have been installed to protect against guided missiles.`; + if (S.GunS >= 8) b=`Upgraded multi-spectrum sensors can clearly depict targets even with IR shielding.`; + if (S.GunS >= 9) i=`The ammunition storage has been increased, only slightly depriving loaders of a place to sit.`; + if (S.GunS >= 10) j=`; both light and heavy vehicles, and most enemy cover from above`; k=`; a 40 mm autocannon, and a 105 mm howitzer are mounted on`; + return `A large gunship ${a} is being refueled in the hangar. ${e}${k} the port side of the fuselage${f}${j}. ${b} ${i} ${g} ${c}${h} ${d}`; + } + + function Sat() { + var loc=`An unused science satellite has been purchased from an Old World nation. While currently useless, it holds potential to be a powerful tool.`; var gyro=``; var telemetry=``; var thrusters=``; var solar=``; var surviv=``; var laser=``; var heat=``; var reactor=``; var lens=``; var kin=``; + if (S.Satellite.lv >= 2) { + if (V.SF.Squad.Satellite.InOrbit < 1) {loc=`The satellite is being worked on in the Launch Bay.`;} else {loc=`The satellite is in geosynchronous orbit, far above the arcology.`;} + gyro=`A suite of sensors have been installed to ensure the satellite can detect attitude and orbital altitude.`;} + if (S.Satellite.lv >= 3) telemetry=`Telemetry systems have been installed to communicate with the satellite in orbit, with strong encryption measures.`; + if (S.Satellite.lv >= 4) thrusters=`Thrusters have been installed to control satellite attitude and orbit.`; + if (S.Satellite.lv >= 5) solar=`A massive folding solar panel array, combined with the latest in battery technology allow the satellite to store an enormous amount of energy relatively quickly.`; surviv=`Enough of the satellite has been finished that it can expect to survive for a significant period of time in space.`; + if (S.Satellite.lv >= 6) laser=`A laser cannon has been mounted facing the earth, capable of cutting through steel in seconds`; heat=` while generating a large amount of heat.`; + if (S.Satellite.lv >= 7) heat=`. The installed heatsink allows the laser cannon to fire more frequently without damaging the satellite.`; + if (S.Satellite.lv >= 8) reactor=`A small, efficient nuclear reactor has been installed to continue generating energy while in the Earth's shadow.`; + if (S.Satellite.lv >= 9) lens=`A higher quality and adjustable lens has been installed on the laser, allowing scalpel precision on armor or wide-area blasts on unarmored targets.`; + if (S.Satellite.lv >= 10) kin=`A magazine of directable tungsten rods have been mounted to the exterior of the satellite, allowing for kinetic bombardment roughly equal to a series of nuclear blasts.`; + return `${loc} ${gyro} ${thrusters} ${telemetry} ${solar} ${reactor} ${surviv} ${laser}${heat} ${lens} ${kin}`; + } + + function GR() { + var loc=`has been purchased from a crumbling Old World nation. It`; var power=`Large batteries mounted in oversized shoulders power the robot for up to ten minutes of use, though they make for large targets.`; var knife=`simply a 8.5 meter long knife, though additional weapons are under development.`; var armor=``; var actuator=``; var cannon=``; var heatsink=``; var ammo=``; var missile=``; + if (S.GiantRobot >= 2) loc=``; armor=`Armor plating has been mounted over the majority of the robot.`; + if (S.GiantRobot >= 3) power=`The robot is now powered by an umbilical cable system instead of bulky and short-lived batteries.`; + if (S.GiantRobot >= 4) knife=`a 25 meter plasma sword. The cutting edge uses plasma to melt and cut through targets, reducing the strain on the sword.`; + if (S.GiantRobot >= 5) actuator=`The limb actuators have been replaced with a faster and more powerful variant, granting the robot the same.`; + if (S.GiantRobot >= 6) cannon=`A custom 45 mm Gatling cannon rifle has been developed for ranged use`; ammo=`; though it lacks enough ammo storage for a main weapon.`; + if (S.GiantRobot >= 7) heatsink=`Large heatsinks have been installed out of the back to solve a massive overheating problem. These heatsinks resemble wings, and tend to glow red with heat when in heavy use.`; + if (S.GiantRobot >= 8) armor=``; actuator=`Final actuator tweaks have allowed for the addition of exceptionally thick armor without any loss in speed or power.`; + if (S.GiantRobot >= 9) ammo=`; with spare ammunition drums kept along the robot's waist.`; + if (S.GiantRobot >= 10) missile=`Missile pods have been mounted on the shoulders.`; + return `A prototype giant robot ${loc} rests in a gantry along the side of the arcology. The robot is as tall as a medium-sized office building, focusing on speed over other factors. ${power} ${armor} ${actuator} ${heatsink} The main armament is ${knife} ${cannon}${ammo} ${missile}`; + } + + function ms() { + var a=`A cruise missile launch site has been constructed near the base of`; var b=`outdated, something quickly rigged together to give the launch site something to fire in the case of an attack`; var c=``; var d=``; var e=``; var f=``; var g=``; var h=``; + if (S.MissileSilo >= 2) b=`a modern missile`; c=`; tipped with a conventional warhead`; + if (S.MissileSilo >= 3) d=`The launch systems have been overhauled, allowing a launch within seconds of an attack order being given.`; + if (S.MissileSilo >= 4) e=`The missile engines have been tweaked, giving them a greater range.`; + if (S.MissileSilo >= 5) f=`A passive radar has been installed, allowing the missile to follow moving targets.`; + if (S.MissileSilo >= 6) a=`Several cruise missile launch sites have been constructed around`; + if (S.MissileSilo >= 7) e=`The engine has been replaced, giving the missiles greater range and supersonic speeds.`; + if (S.MissileSilo >= 8) g=`The ability to pick new targets should the original be lost has been added.`; + if (S.MissileSilo >= 9) h=`The missile now uses its remaining fuel to create a thermobaric explosion, massively increasing explosive power.`; + if (S.MissileSilo >= 10) c=` that can be tipped with either a conventional or nuclear warhead`; + return `${a} the arcology. The current missile armament is ${b}${c}. ${d} ${e} ${f} ${g} ${h}`; + } + + function AC() { + var recom=`has been recommissioned from the Old World for ${V.SF.Lower}. It`; var jets=`Formerly mothballed strike jets`; var loc=``; var radar=``; var AA=``; var prop=``; var torp=``; var armor=``; var power=``; var scramble=``; + if (V.week % 6 === 0) { loc=`moored to the pier in the Naval Yard`; } else { loc=`patrolling the waters near $arcologies[0].name`; } + if (S.AircraftCarrier >= 2) radar=`The island's radar and comms have been improved.`; recom=``; + if (S.AircraftCarrier >= 3) AA=`The antiair guns have been updated to automatically track and predict enemy aircraft movement.`; + if (S.AircraftCarrier >= 4) jets=`Modern strike jets with state-of-the-art armaments`; + if (S.AircraftCarrier >= 5) prop=`The propellers have been redesigned, granting greater speed with less noise.`; + if (S.AircraftCarrier >= 6) torp=`An anti-torpedo system detects and destroys incoming torpedoes.`; + if (S.AircraftCarrier >= 7) armor=`Additional armor has been added to the hull and deck.`; + if (S.AircraftCarrier >= 8) power=`The power plant has been converted to provide nuclear power.`; + if (S.AircraftCarrier >= 9) scramble=`The catapult has been converted to an electromagnetic launch system, halving the time it takes to scramble jets.`; + if (S.AircraftCarrier >= 10) jets=`Attack VTOL from the converted for carrier capability`; + return `An aircraft carrier ${recom} is ${loc}. ${jets} serve as its airpower. ${scramble} ${power} ${radar} ${AA} ${torp} ${prop} ${armor}`; + } + + function Sub() { + var recom=`has been recommissioned from the old world, and`; var reactor=`Because diesel engines provide power and breathing oxygen is kept in pressurized canisters, the sub must frequently surface.`; var reactor1=``; var cal=``; var hull=``; var tubes=``; var torpedoes=``; var sonar=``; var control=``; var missiles=``; + if (S.Sub >= 2) recom=``; reactor=`A nuclear reactor provides power`; reactor1=`; but because oxygen is still kept in pressurized canisters the sub must frequently surface to replenish its oxygen stocks.`; + if (S.Sub >= 3) reactor1=` and an oxygen generator pulls Oâ‚‚ from the surrounding seawater, allowing the submarine to remain underwater for months if necessary.`; + if (S.Sub >= 4) cal=`Calibration of the propulsion systems has reduced the telltale hum of a moving sub to a whisper.`; + if (S.Sub >= 5) hull=`The outer hull has been redesigned for hydrodynamics and sonar absorption.`; + if (S.Sub >= 6) tubes=`The torpedo tubes have been redesigned for faster loading speeds`; torpedoes=`.`; + if (S.Sub >= 7) sonar=`The passive sonar has been finely tuned to detect mechanical noises miles away.`; + if (S.Sub >= 8) control=`The control room computers have been upgraded to automate many conn duties.`; + if (S.Sub >= 9) torpedoes=`and launch more agile torpedoes.`; + if (S.Sub >= 10) missiles=`The submarine has been outfitted with several cruise missiles to attack land or sea-based targets.`; + return `An attack submarine ${recom} is moored to the pier of the Naval Yard. ${reactor}${reactor1} ${cal} ${hull} ${tubes}${torpedoes} ${sonar} ${control} ${missiles}`; + } + + function HAT() { + var recom=`; has been recommissioned for use by ${V.SF.Lower}. It`; var tons=`200`; var skirt=``; var guns=``; var guns2=``; var fans=``; var speed=``; var turbines=``; var armor=``; var ramps=``; var HATframe=``; var loadout=``; + if (S.HAT >= 2) skirt=`The skirt has been upgraded to increase durability and improve cushion when traveling over uneven terrain and waves.`; recom=`;`; + if (S.HAT >= 3) guns=`A minigun`; guns2=`has been mounted on the front corners of the craft to defend against attackers.`; + if (S.HAT >= 4) fans=`The turbines powering the rear fans`; speed=`acceleration and speed.`; turbines=`have been replaced with a more powerful version, allowing greater`; + if (S.HAT >= 5) armor=`The armor protecting its cargo has been increased.`; + if (S.HAT >= 6) tons=`300`; fans=`The turbines powering the rear fans and impeller`; speed=`acceleration, speed, and carrying capacity.`; + if (S.HAT >= 7) guns=`A minigun and grenade launcher`; + if (S.HAT >= 8) ramps=`The loading ramps have been improved, allowing for faster unloading.`; + if (S.HAT >= 9) HATframe=`The frame has been widened and reinforced, allowing for more space on the deck.`; + if (S.HAT >= 10) loadout=`An experimental loadout sacrifices all carrying capacity to instead act as a floating gun platform by mounting several rotary autocannons the deck, should the need arise.`; + return `An air cushion transport vehicle, or hovercraft${recom} is parked on the pier of the Naval Yard, ready to ferry ${tons} tons of soldiers and vehicles. ${guns} ${guns2} ${fans} ${turbines} ${speed} ${skirt} ${armor} ${ramps} ${HATframe} ${loadout}`; + } + var r=``; V.nextButton=" "; r += `<br>`; - r += `You continue towards the common area, the soldiers you pass, nod respectfully, salute, or bow slightly, as they please.`; - r +=`You pass the briefing areas, the officers and sergeants of the force are conferring over planning tables and display screens regarding their upcoming deployments.`; - r += `<br><br><div style="margin-left:2em">The commanders are`; if (V.SF.Target === "recruit") { + r +=`You continue towards the common area, the soldiers you pass, nod respectfully, salute, or bow slightly, as they please. You pass the briefing areas, the officers and sergeants of the force are conferring over planning tables and display screens regarding their upcoming deployments.`; + r += `<br><br><div style="margin-left:2em">The commanders are `; if (V.SF.Target === "recruit") { r += `viewing lists of potential recruits for ${V.SF.Lower}. Mainly mercenaries and Old World soldiers who might be receptive to an offer of employment and residence within the arcology, in addition to some citizens of the arcology who wish to have some excitement in their lives.`; } else if (V.SF.Target === "secure") { r += `reviewing maps of trade routes to the arcology as well as nearby merchant hubs, arranging their future deployments to best protect them and encourage business and trade.`; @@ -711,7 +843,7 @@ window.FlavourText = function() { r += `<br>You arrive at the firebase's common area, a nest of bars, pleasure dens, public spaces, and other facilities catering to the soldiers' needs and giving them somewhere to spend their free time, since they do not mingle with your citizens on the higher levels or exit the arcology except on deployment. It is well-occupied by the soldiers not currently tasked with duties, and they respectfully move out of your way as you approach, clearing a path for you to move forward.`; r += `<br><br><div style="margin-left:2em">`; - r += `The amenities are staffed by menial slaves, captured by the soldiers on their excursions. They are`; + r += `The amenities are staffed by menial slaves, captured by the soldiers on their excursions. They are `; if (V.SF.Depravity <= 0.3 && V.SF.Colonel.Core === "kind") { r += `wearing plain jumpsuits and slim identification collars to set them apart from the soldiers, and look resigned but not fearful. The soldiers themselves socialize at the bars, in small groups around tables, and in the gambling parlors. Many of them can be seen entering or leaving the dens occupied by the sexual slaves they have acquired. Laughter from the carousing soldiers can be heard at all times. Small groups of slaves move freely between the plaza and their basic accommodations attached to the firebase.`; } else if (V.SF.Depravity <= 0.6 && V.SF.Colonel.Core === "kind") { @@ -721,7 +853,7 @@ window.FlavourText = function() { } else if (V.SF.Depravity <= 1.2) { r += `topless, wearing only a single undergarment and heavy steel collars to set them apart from the soldiers, and often shoot fearful looks at the soldiers. The soldiers occupy themselves primarily with sex, pulling slaves onto benches and fucking them hard in public. Many soldiers stagger around or lie passed out from drug and alcohol abuse.`; } else if (V.SF.Depravity >= 1.5 && (V.SF.Colonel.Core === "Warmonger" || V.SF.Colonel.Core !== "Shell Shocked") ) { - r += `To a one, they are naked, and are wearing heavy shock collars to force obedience. Most are wild-eyed with fear or dull-eyed from mental collapse, and many others bear marks of abuse. Few of the slaves are here long-term, the depraved pleasures of the soldiers resulting in enormous turnover and loss of 'damaged' stock. The extreme libations of the soldiers are ever-present. Drunken soldiers stagger around everywhere, beating slaves too slow to get out of their way. Others lie sprawled out on the ground, rendered senseless from heavy drug abuse. Some walk around naked, and hold slaves down on the benches scattered around, raping or sodomizing them with their cocks or their personal strap-ons as they desire. In alcoves, some soldier-lover pairs fuck loudly, moaning in pleasure.`; + r += `naked, and are wearing heavy shock collars to force obedience. Most are wild-eyed with fear or dull-eyed from mental collapse, and many others bear marks of abuse. Few of the slaves are here long-term, the depraved pleasures of the soldiers resulting in enormous turnover and loss of 'damaged' stock. The extreme libations of the soldiers are ever-present. Drunken soldiers stagger around everywhere, beating slaves too slow to get out of their way. Others lie sprawled out on the ground, rendered senseless from heavy drug abuse. Some walk around naked, and hold slaves down on the benches scattered around, raping or sodomizing them with their cocks or their personal strap-ons as they desire. In alcoves, some soldier-lover pairs fuck loudly, moaning in pleasure.`; if (jsRandom(1,100) <= 50) { r += `Off to the side, a group of soldiers brutally gangbang a very young slave girl, with one soldier buried balls-deep in her ass, another brutally sawing a barbed strap-on in and out of her pussy, and a third with his cock forced deep down her throat. The slave girl struggles and gags, desperate for breath or relief.`; } else if (jsRandom(1,100) > 50) { @@ -801,200 +933,6 @@ window.FlavourText = function() { return r; }; -window.SFReport = function() { - const V=State.variables,T=State.temporary,S=V.SF.Squad; - var incomeTarget=50000,unitCap=2500,SFIncome=5000; - var actionMultiplier=1,troopMultiplier=1,unitMultiplier=1,depravityMultiplier=1,SFupkeep=0; - var FNG=10,Trade=0.025; V.SFUC=0; Count(); - if (S.Troops > unitCap) S.Troops=unitCap; - if (S.Troops < 100) { S.Troops += Math.ceil(jsRandom(2,5)); - } else { - if (V.SF.Target === "recruit") { - S.Troops += Math.ceil(jsRandom(-1*S.Troops/100,0)); - } else if (V.SF.Target === "raiding") { - S.Troops += Math.ceil(jsRandom(-3*S.Troops/100,-4*S.Troops/100)); - } else { S.Troops += Math.ceil(jsRandom(-2*S.Troops/100,-3*S.Troops/100)); } - } - if (V.SF.UC.Assign > 0) { - if (V.SF.UC.Assign < 2) { V.SFUC=Math.ceil(S.Troops*.1); - } else { V.SFUC=Math.ceil(S.Troops*.25); } - } S.Troops -= V.SFUC; - if (S.Troops > 200) { Trade += 0.05*(Math.ceil(S.Troops/100)); - troopMultiplier=S.Troops/200; SFupkeep += S.Troops*25; - if (V.secExp > 0) { - V.authority += 25*(Math.ceil(S.Troops/200)); V.authority=Math.clamp(V.authority, 0, 20000); - } - } - - if (S.Firebase > 0) { - FNG += S.Firebase; Trade += 0.5*S.Firebase; unitMultiplier += 7.5*S.Firebase+2*Math.pow(S.Firebase,2); SFupkeep += 95*(10+S.Firebase); - } - if (S.Armoury > 0) { - FNG += 2*S.Armoury; Trade += 0.25*S.Armoury; unitMultiplier += 7.5*S.Armoury+2*Math.pow(S.Armoury,2); SFupkeep += 55*S.Armoury; - } - if (S.Drugs > 0) { - FNG += S.Drugs; Trade += 0.25*S.Drugs; unitMultiplier += 7.5*S.Drugs+2*Math.pow(S.Drugs,2); SFupkeep += 35*S.Drugs; - } - if (S.Firebase >= 1) { - if (S.AV > 0) { - FNG += S.AV; Trade += 0.25*S.AV; unitMultiplier += 7.5*S.AV+2*Math.pow(S.AV,2); SFupkeep += 89*S.AV; - } - if (S.TV > 0) { - FNG += S.TV; Trade += 0.25*S.TV; unitMultiplier += 7.5*S.TV+2*Math.pow(S.TV,2); SFupkeep += 89*S.TV; - } - if (S.PGT > 0) { - FNG += S.PGT; Trade += 0.25*S.PGT; unitMultiplier += 15*S.PGT+3*Math.pow(S.PGT,2); SFupkeep += 100*S.PGT; - } - } - if (S.Firebase >= 2 && S.Drones > 0) { - FNG += S.Drones; Trade += 0.5*S.Drones; unitMultiplier += 7.5*S.Drones+2*Math.pow(S.Drones,2); SFupkeep += 50*S.Drones; - } - - if (S.Firebase >= 4) { - if (S.AA > 0) { - FNG += S.AA; Trade += 0.25*S.AA; unitMultiplier += 7.5*S.AA+2*Math.pow(S.AA,2); SFupkeep += 100*S.AA; - } - if (S.TA > 0) { - FNG += S.TA; Trade += 0.25*S.TA; unitMultiplier += 7.5*S.TA+2*Math.pow(S.TA,2); SFupkeep += 80*S.TA; - } - if (S.SpacePlane > 0) { - FNG += S.SpacePlane; Trade += 0.25*S.SpacePlane; unitMultiplier += 7.5*S.SpacePlane+2*Math.pow(S.SpacePlane,2); SFupkeep += 100*S.SpacePlane; - } - if (S.GunS > 0) { - FNG += S.GunS; Trade += 0.25*S.GunS; unitMultiplier += 12*S.GunS+3*Math.pow(S.GunS,2); SFupkeep += 70*S.GunS; - } - if (S.Satellite.lv > 0 && S.Satellite.InOrbit > 0) { - FNG += S.Satellite.lv; Trade += 0.25*S.Satellite.lv; unitMultiplier += 15*S.Satellite.lv+5*Math.pow(S.Satellite.lv,2); SFupkeep += 85*S.Satellite.lv; - } - if (S.GiantRobot > 0) { - FNG += S.GiantRobot; Trade += 0.25*S.GiantRobot; unitMultiplier += 15*S.GiantRobot+5*Math.pow(S.GiantRobot,2); SFupkeep += 95*S.GiantRobot; - } - if (S.MissileSilo > 0) { - FNG += S.MissileSilo; Trade += 0.25*S.MissileSilo; unitMultiplier += 15*S.MissileSilo+5*Math.pow(S.MissileSilo,2); SFupkeep += 100*S.MissileSilo; - } - } - - if (S.AircraftCarrier > 0) { - FNG += S.AircraftCarrier; Trade += 0.25*S.AircraftCarrier; unitMultiplier += 9*S.AircraftCarrier+3*Math.pow(S.AircraftCarrier,2); SFupkeep += 80*S.AircraftCarrier; - } - if (S.Sub > 0) { - FNG += S.Sub; Trade += 0.25*S.Sub; unitMultiplier += 7.5*S.Sub+2*Math.pow(S.Sub,2); SFupkeep += 90*S.Sub; - } - if (S.HAT > 0) { - FNG += S.HAT; Trade += 0.25*S.HAT; unitMultiplier += 7.5*S.HAT+2*Math.pow(S.HAT,2); SFupkeep += 70*S.HAT; - } - - var SFD=V.SF.Depravity; - switch (V.SF.Colonel.Core) { - case "kind": - FNG += 10; Trade += 0.15; SFD -= 0.15; - break; - case "cruel": - Trade -= 0.15; SFD += 0.15; - break; - case "brazen": - FNG += 15; unitMultiplier += 0.5; - break; - case "jaded": - Trade -= 0.05; SFD += 0.05; - break; - case "shell shocked": - Trade += 0.05; SFD -= 0.05; unitMultiplier -= 0.5; - break; - } - if (V.SF.Target === "raiding") { SFD += 0.05; actionMultiplier += 0.5; - } else if (V.SF.Target === "secure") { SFD -= 0.05; actionMultiplier += 0.2; - } else { SFD -= 0.1; actionMultiplier -= 0.5; } - if (V.SF.ROE === "free") { actionMultiplier *= 0.8; SFD += 0.05; Trade += Trade*.95; - } else if (V.SF.ROE == "hold") { actionMultiplier *= 1.1; SFD -= 0.05; Trade += Trade*1.05; } - if (V.SF.Regs === "none") { actionMultiplier *= 0.8; SFD += 0.05; Trade += Trade*.95; - } else if (V.SF.Regs === "strict") { actionMultiplier *= 1.1; SFD -= 0.05; Trade += Trade*1.05; - depravityMultiplier=1+SFD; } - if (SFD > -2) Trade *= 1+SFD/2; - - if (V.SF.Target === "recruit") { FNG += Math.ceil(FNG*.95); - } else { FNG += Math.ceil(FNG*.25); } - if (V.SF.Target === "secure") { V.rep += Math.ceil(V.rep*((Trade/100)*.95)); - V.arcologies[0].prosperity=Math.ceil((V.arcologies[0].prosperity+(Trade/10)*.95)); - } else { V.rep += Math.ceil(V.rep*(Trade/100)*.25); - V.arcologies[0].prosperity=Math.ceil(V.arcologies[0].prosperity+(Trade/10)*.25);} - if (V.secExp > 0) V.authority += V.SF.Size*10; V.authority=Math.clamp(V.authority, 0, 20000); - - SFIncome += Math.ceil((SFIncome*(troopMultiplier/5*unitMultiplier/5*actionMultiplier/5*depravityMultiplier))-SFupkeep); S.Troops += Math.round(FNG/2); - /*Remove below line if hard mode ever gets fixed*/ - if (V.economy < 100) SFIncome=Math.ceil(SFIncome*(1+(V.week/100))); - if (S.Troops > unitCap) S.Troops=unitCap; - if (V.rep > 20000) V.rep=20000; var Profitable=1; - if (V.arcologies[0].prosperity > V.ProsperityCap) V.arcologies[0].prosperity=V.ProsperityCap; - if (SFIncome >= incomeTarget) { V.SF.Subsidy=0; - cashX(SFIncome, "specialForces"); - } else { Profitable=0; } - - var Deaths=0; - if (S.Drugs >= 8 || S.Drugs >= 10) { var SurvivalChance=50; - if (S.Drugs >= 8) { SurvivalChance -= 5; } else if (S.Drugs >= 10) { - SurvivalChance += 5; } - if (jsRandom(0,100) > SurvivalChance) Deaths=jsRandom(0,((S.Drugs*2)+4)); - if (Deaths > 0) S.Troops -= Deaths; - } var r=``; - r += `<br>__Week ${V.week} operational report for ${V.SF.Lower}__:`; - r += `<br>${V.SF.Caps} focused their ${commaNum(S.Troops)} troops on`; - if (V.SF.Target === "recruit") { - r += `recruiting and training more personnel. Smaller parties ventured out to protect the arcology's trade routes and strike targets of opportunity.`; - } else if (V.SF.Target === "secure") { - r += `securing the trade routes between the arcology and the surrounding area. Smaller parties ventured out to strike targets of opportunity and process new recruits.`; - } else { - r += `locating and striking targets of opportunity, capturing both material loot and new slaves. Smaller parties secured the most important of the arcology's trade routes and processed new recruits.`; - } - if (V.SF.UC.Assign > 0) { - r += `<br>A ${V.SF.UC.Assign < 2 ? 'small':'large'} portion of the force was assigned as ${V.SF.UC.Assign < 2 ? 'part':'full'} time undercover officers.`; - } - - if (Deaths > 0) { - r += ` <span class='red'>${Deaths} soldiers fatally overdosed on the drug cocktail</span>`; - if (V.SF.MercCon.CanAttend === -1) r += `, The Colonel's much heavier than average drug use saves her from this side effect.`; - } - r += `<br>These activities have, overall, <span class='green'>improved your arcology's prosperity</span>.`; - r+= ` The goods procured by ${V.SF.Lower} after accounting for the spoils retained by individual soldiers were `; - if (Profitable > 0) { - r += `<span class='green'>more than sufficient to cover expenses</span>. Excess material and human assets totaling <span class='yellowgreen'>${cashFormat(SFIncome)}</span> (after liquidation) were transferred to your accounts.`; - } else { - r += `<span class='red'>barely enough to cover expenses.</span> More growth will be needed to ensure profitability, <span class='yellow'>hopefully purchasing more upgrades will help</span>.`; - r += ` ${SFC()} estimates that an additional <span class='yellowgreen'>${cashFormat(incomeTarget-SFIncome)}</span> is required for sufficient cover.`; - } - r += ` ${V.SF.Caps} managed to recruit ${Math.round(FNG/2)} new soldiers this week, and your reputation has <span class='green'>increased through the improvement of trade security</span>.`; - - r += `<br>//Your instructions to ${SFC()}://`; - r += `<br> Deployment focus: `; - r += `<span id="focus"> <<if $SF.Target == "recruit">>''Recruiting and Training''<<elseif $SF.Target == "secure">>''Securing Trade Routes''<<else>>''Raiding and Slaving''<</if>></span>. `; - r += `<<link "Recruit and Train">> <<set $SF.Target="recruit">> <<replace "#focus">>''Recruiting and Training''<</replace>> <</link>> | <<link "Secure Trade Routes">> <<set $SF.Target="secure">> <<replace "#focus">>''Securing Trade Routes''<</replace>> <</link>> | <<link "Raiding and Slaving">> <<set $SF.Target="raiding">> <<replace "#focus">>''Raiding and Slaving''<</replace>> <</link>>`; - r += `<br> Rules of Engagement: `; - r += `<span id="roe"> <<if $SF.ROE === "hold">>''Hold Fire''<<elseif $SF.ROE === "limited">>''Limited Fire''<<else>>''Free Fire''<</if>></span>. `; - r += `<<link "Hold Fire">> <<set $SF.ROE="hold">> <<replace "#roe">>''Hold Fire''<</replace>> <</link>> | <<link "Limited Fire">> <<set $SF.ROE="limited">> <<replace "#roe">>''Limited Fire''<</replace>> <</link>> | <<link "Free Fire">> <<set $SF.ROE="free">> <<replace "#roe">>''Free Fire''<</replace>> <</link>>`; - r += `<br> Accountability: `; - r += `<span id="accountability"> <<if $SF.Regs === "strict">>''Strict Accountability''<<elseif $SF.Regs === "some">>''Some Accountability''<<else>>''No Accountability''<</if>></span>. `; - r += `<<link "Strict Accountability">> <<set $SF.Regs="strict">> <<replace "#accountability">>''Strict Accountability''<</replace>> <</link>> | <<link "Some Accountability">> <<set $SF.Regs="some">> <<replace "#accountability">>''Some Accountability''<</replace>> <</link>> | <<link "No Accountability">> <<set $SF.Regs="none">> <<replace "#accountability">>''No Accountability''<</replace>> <</link>>`; - if (V.SF.MercCon.View > 0 && V.SF.MercCon.CanAttend === 1) { r += `<br>''TradeShow'':`; - V.SF.MercCon.Income=0; V.SF.MercCon.Menials=0; - var TradeShowAttendes=200, MenialSlavesPerAttendee=5, NewMercs=0; - var MenialSlaves=Math.ceil(jsRandom(1,((TradeShowAttendes*MenialSlavesPerAttendee)/10))); - var TSProfit=Math.ceil(500000*(1+(V.SF.Size/1000))*(1+(V.arcologies[0].prosperity/1000))*T.Env); - r += ` During a break, The Colonel managed to sell some generic schematics to the ${TradeShowAttendes} attendees, some decided to also give menial slaves as a bonus.<br>`; - V.menials += MenialSlaves; V.SF.MercCon.History += 1; - V.SF.MercCon.Menials += MenialSlaves; V.SF.MercCon.TotalMenials += MenialSlaves; - V.SF.MercCon.Income += TSProfit; V.SF.MercCon.Revenue += TSProfit; - cashX(TSProfit, "specialForces"); - if (V.secExp > 0 && V.mercenaries > 0) { V.SF.MercCon.Mercs=0; - NewMercs=jsRandom(1,(TradeShowAttendes/10)); - V.mercFreeManpower += NewMercs; V.SF.MercCon.TotalMercs += NewMercs; - V.SF.MercCon.Mercs += NewMercs; - } - } - if (V.SF.UC.Assign === 1 && V.SF.UC.Lock < 1) V.SF.UC.Assign=0; - V.SF.Upgrade=0; V.SF.Gift=0; V.SF.Colonel.Talk=0; V.SF.Colonel.Fun=0; - return r; -}; - /*window.FSIntegrationMenu = function() { const V=State.variables; const UpgradeOptions=['Slaves','FoodsAndMedia','CommonArea','Barracks', 'SlaveProcessingCages','CommandCenter','Armory','DrugLab','Garage','Hangar', 'DroneBay','PersonalItems','VehicleUpgrades','CommonAreaVendors', 'RoleplayingManadated','ColonelCompilance','ColonelGift']; diff --git a/src/SpecialForce/Upgrades.tw b/src/SpecialForce/Upgrades.tw index d2d1a3b94e10d7bc5870e3fe9852fc8b3125845a..c2fab8eee128d5eed5c943b79e9bb70c18491c0f 100644 --- a/src/SpecialForce/Upgrades.tw +++ b/src/SpecialForce/Upgrades.tw @@ -1,115 +1,108 @@ :: Upgrades [nobr] - <br><br>Total upgrade progress: <<print progress($SF.Size,_max)>> + <br><br> <<if $SF.Size !== _max>> Total upgrade progress: <<print progress($SF.Size,_max)>> $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)>>%) <<if $SF.Size < 30>><br>//<<print (30-$SF.Size )>> more upgrades is needed untill the next tier unlocks.//<</if>> + <<else>>There are no more upgrades available.<</if>> <<if $SF.Upgrade > 0 && ($SF.Size !== _max)>> <<set _cost = Math.ceil(Math.abs($cash*.05*(1.25+($SF.Size/1000))))>> - <br>[[Re-unlock upgrading.|Firebase][$SF.Upgrade = 0,cashX(forceNeg(_cost), "specialForces")]] @@.yellowgreen;<<print cashFormat(_cost)>> <</if>> - <<if ($SF.Size < 30 || $SF.Size !== _max) && $SF.Upgrade < 1>> <<set _T1 = $SF.Size >= 30>> + <br>[[Re-unlock upgrading.|Firebase][$SF.Upgrade = 0,cashX(forceNeg(_cost), "specialForces")]] @@.red;<<print cashFormat(_cost)>> <</if>> + <<if ($SF.Size < 30||$SF.Size !== _max) && $SF.Upgrade < 1>> - <br>Which facility or equipment do you wish to upgrade this week? <br><br> - <<if $SF.Squad.Firebase < 5||_T1 && $SF.Squad.Firebase < _FU>> + <br>Which facility or equipment do you wish to upgrade this week? <br> + <<if $SF.Squad.Firebase < 5||_T1 && $SF.Squad.Firebase < _FU>> <br> <<set _cF = SFUpgradeCost(100000,$SF.Squad.Firebase)>> <<if $cash >= _cF>> [[Upgrade Firebase|Firebase][$SF.Upgrade = 1, $SF.Squad.Firebase++, cashX(forceNeg(_cF), "specialForces")]] <<else>>//Cannot afford to upgrade the Firebase.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cF)>>@@ // - <<elseif $SF.Squad.Firebase == _FU>>//The Firebase has been fully upgraded.// - <<else>>//More upgrades are required to unlock the next tier.// - <</if>> <span style="float:right;"> <<print progress($SF.Squad.Firebase)>> </span><br> + //Costs @@.red;<<print cashFormat(_cF)>>@@// <span style="float:right;"> <<print progress($SF.Squad.Firebase)>> </span><br> + <<elseif $SF.Squad.Firebase === _FU>> <br>//The Firebase has been fully upgraded.//<br><</if>> - <<if $SF.Squad.Armoury < 5||_T1 && $SF.Squad.Armoury < _AU>> + <<if $SF.Squad.Armoury < 5||_T1 && $SF.Squad.Armoury < _AU>> <br> <<set _cA = SFUpgradeCost(40000,$SF.Squad.Armoury)>> <<if $cash >= _cA>> [[Upgrade Armory|Firebase][$SF.Upgrade = 1, $SF.Squad.Armoury++, cashX(forceNeg(_cA), "specialForces")]] <<else>>//Cannot afford to upgrade the Armory.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cA)>>@@ // - <<elseif $SF.Squad.Armoury == _AU>>//The Armory has been fully upgraded.// - <<else>>//More upgrades are required to unlock the next tier.// - <</if>> <span style="float:right;"> <<print progress($SF.Squad.Armoury)>> </span><br> - - <<if $SF.Squad.Drugs < 5||_T1 && $SF.Squad.Drugs < _DrugsU>> + //Costs @@.red;<<print cashFormat(_cA)>>@@// <span style="float:right;"> <<print progress($SF.Squad.Armoury)>> </span><br> + <<elseif $SF.Squad.Armoury === _AU>> //The Armory has been fully upgraded.//<br><</if>> + + <<if $SF.Squad.Drugs < 5||_T1 && $SF.Squad.Drugs < _DrugsU>> <br> <<set _cDrugs = SFUpgradeCost(40000,$SF.Squad.Drugs)>> <<if $cash >= _cDrugs>> [[Upgrade Drug Lab|Firebase][$SF.Upgrade = 1, $SF.Squad.Drugs++, cashX(forceNeg(_cDrugs), "specialForces")]] <<else>>//Cannot afford to upgrade the Drug Lab.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cDrugs)>>@@ // - <<elseif $SF.Squad.Drugs == _DrugsU>>//The Drug Lab has been fully upgraded.// - <<else>>//More upgrades are required to unlock the next tier.// - <</if>> <span style="float:right;"> <<print progress($SF.Squad.Drugs)>> </span><br> - - <<if $SF.Squad.Firebase >= 2 && ($SF.Squad.Drones < 5 ||_T1 && $SF.Squad.Drones < _DU)>> + //Costs @@.red;<<print cashFormat(_cDrugs)>>@@// <span style="float:right;"> <<print progress($SF.Squad.Drugs)>> </span><br> + <<elseif $SF.Squad.Drugs === _DrugsU>> //The Drug Lab has been fully upgraded.//<br><</if>> + + <<if $SF.Squad.Firebase >= 2 && ($SF.Squad.Drones < 5 ||_T1 && $SF.Squad.Drones < _DU)>> <br> <<set _cDrones = SFUpgradeCost(45000,$SF.Squad.Drones)>> <<if $cash >= _cDrones>> [[Upgrade Drone Bay|Firebase][$SF.Upgrade = 1, $SF.Squad.Drones++, cashX(forceNeg(_cDrones), "specialForces")]] <<else>>//Cannot afford to upgrade the Drone Bay.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cDrones)>>@@ // <span style="float:right;"> <<print progress($SF.Squad.Drones)>> </span> - <<elseif $SF.Squad.Drones == _DU>>//The Drone Bay has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.Drones)>> </span> - <<elseif _T1 && $SF.Squad.Drones == 5>>//More upgrades are required to unlock the next tier.//<span style="float:right;"> <<print progress($SF.Squad.Drones)>> </span><</if>> - - <<if $SF.Squad.Firebase >= 1 && $terrain !== "oceanic">><br>''Garage'' + //Costs @@.red;<<print cashFormat(_cDrones)>>@@// <span style="float:right;"> <<print progress($SF.Squad.Drones)>> </span><br><br> + <<elseif $SF.Squad.Drones === _DU>> //The Drone Bay has been fully upgraded.//<br><</if>> + + <<if $SF.Squad.Firebase >= 1 && $terrain !== "oceanic">><br>''Garage''<br> <div style="margin-left:2em"><<if ($SF.Squad.AV < 5||_T1 && $SF.Squad.AV < _AVU)>> <<set _cAV = SFUpgradeCost(60000,$SF.Squad.AV)>> <<if $cash >= _cAV>> [[Upgrade Attack Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Squad.AV++, cashX(forceNeg(_cAV), "specialForces")]] <<else>>//Cannot afford to upgrade the Attack Vehicle Fleet.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cAV)>>@@//<span style="float:right;"><<print progress($SF.Squad.AV)>></span> - <<elseif $SF.Squad.AV == _AVU>>//The Attack Vehicle Fleet has been fully upgraded.//<span style="float:right;"><<print progress($SF.Squad.AV)>></span> - <<else>>//More upgrades are required to unlock the next tier.//<span style="float:right;"><<print progress($SF.Squad.AV)>></span> - <</if>></div> + //Costs @@.red;<<print cashFormat(_cAV)>>@@// <span style="float:right;"><<print progress($SF.Squad.AV)>></span> + <<elseif $SF.Squad.AV === _AVU>> //The Attack Vehicle Fleet has been fully upgraded.//<br><</if>> + </div> <div style="margin-left:2em"><<if ($SF.Squad.TV < 5||_T1 && $SF.Squad.TV < _TVU)>> <<set _cTV = SFUpgradeCost(60000,$SF.Squad.TV)>> <<if $cash >= _cTV>> [[Upgrade Transport Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Squad.TV++, cashX(forceNeg(_cTV), "specialForces")]] <<else>>//Cannot afford to upgrade Transport Vehicle Fleet.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cTV)>>@@//<span style="float:right;"><<print progress($SF.Squad.TV)>> </span> - <<elseif $SF.Squad.TV == _TVU>>//The Transport Vehicle Fleet has been fully upgraded.//<span style="float:right;"><<print progress($SF.Squad.TV)>></span> - <<else>>//More upgrades are required to unlock the next tier.//<span style="float:right;"> <<print progress($SF.Squad.TV)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cTV)>>@@// <span style="float:right;"> <<print progress($SF.Squad.TV)>> </span> + <<elseif $SF.Squad.TV === _TVU>> //The Transport Vehicle Fleet has been fully upgraded.//<br><</if>> + </div> <div style="margin-left:2em"><<if _T1 && $SF.Squad.PGT < _PGTU>> <<set _cPGT = SFUpgradeCost(735000,$SF.Squad.PGT)>> <<if $cash >= _cPGT>> [[Upgrade Prototype Goliath tank|Firebase][$SF.Upgrade = 1, $SF.Squad.PGT++, cashX(forceNeg(_cPGT), "specialForces")]] <<else>>//Cannot afford to upgrade Prototype Goliath Tank.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cPGT)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.PGT)>> </span> - <<elseif $SF.Squad.PGT == _PGTU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.PGT)>> </span> - <<elseif $SF.Squad.PGT == _PGTU>>//The Prototype Goliath Tank has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.PGT)>> </span><</if>></div><</if>> + //Costs @@.red;<<print cashFormat(_cPGT)>>@@// <span style="float:right;"> <<print progress($SF.Squad.PGT)>> </span> + <<elseif $SF.Squad.PGT === _PGTU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.PGT)>> </span> + <<elseif $SF.Squad.PGT === _PGTU>> //The Prototype Goliath Tank has been fully upgraded.//<br><</if>></div><</if>> - <<if $SF.Squad.Firebase >= 4>>''Hangar'' + <<if $SF.Squad.Firebase >= 4>>''Hangar''<br> <div style="margin-left:2em"><<if $SF.Squad.AA < 5||_T1 && $SF.Squad.AA < _AAU>> <<set _cAA = SFUpgradeCost(70000,$SF.Squad.AA)>> <<if $cash >= _cAA>> [[Upgrade Attack Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Squad.AA++, cashX(forceNeg(_cAA), "specialForces")]] <<else>>//Cannot afford to upgrade Attack Aircraft Fleet.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cAA)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.AA)>> </span> - <<elseif $SF.Squad.AA == _AAU>>//The Attack Aircraft Fleet has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.AA)>> </span> - <<else>>//More upgrades are required to unlock the next tier.//<span style="float:right;"> <<print progress($SF.Squad.AA)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cAA)>>@@// <span style="float:right;"> <<print progress($SF.Squad.AA)>> </span> + <<elseif $SF.Squad.AA === _AAU>> //The Attack Aircraft Fleet has been fully upgraded.//<br><</if>> + </div> <div style="margin-left:2em"><<if $SF.Squad.TA < 5||_T1 && $SF.Squad.TA < _TAU>> <<set _cTA = SFUpgradeCost(70000,$SF.Squad.TA)>> <<if $cash >= _cTA>> [[Upgrade Transport Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Squad.TA++, cashX(forceNeg(_cTA), "specialForces")]] <<else>>//Cannot afford to upgrade the Transport Aircraft Fleet.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cTA)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.TA)>> </span> - <<elseif $SF.Squad.TA == _TAU>>//The Transport Aircraft Fleet has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.TA)>> </span> - <<else>>//More upgrades are required to unlock the next tier.//<span style="float:right;"> <<print progress($SF.Squad.TA)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cTA)>>@@// <span style="float:right;"> <<print progress($SF.Squad.TA)>> </span> + <<elseif $SF.Squad.TA === _TAU>> //The Transport Aircraft Fleet has been fully upgraded.//<br><</if>> + </div> <div style="margin-left:2em"><<if _T1 && $SF.Squad.SpacePlane < _SPU>> <<set _cSP = SFUpgradeCost(250000,$SF.Squad.SpacePlane)>> <<if $cash >= _cSP>> [[Upgrade Spaceplane|Firebase][$SF.Upgrade = 1, $SF.Squad.SpacePlane++, cashX(forceNeg(_cSP), "specialForces")]] <<else>>//Cannot afford to upgrade the Spaceplane.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cSP)>>@@//<span style="float:right;"><<print progress($SF.Squad.SpacePlane)>> </span> - <<elseif $SF.Squad.SpacePlane == _SPU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.SpacePlane)>> </span> - <<elseif $SF.Squad.SpacePlane == _SPU>>//The Spaceplane has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.SpacePlane)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cSP)>>@@//<span style="float:right;"><<print progress($SF.Squad.SpacePlane)>> </span> + <<elseif $SF.Squad.SpacePlane === _SPU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.SpacePlane)>> </span> + <<elseif $SF.Squad.SpacePlane === _SPU>> //The Spaceplane has been fully upgraded.//<br> <</if>></div> <div style="margin-left:2em"><<if _T1 && $SF.Squad.GunS < _GunSU>> <<set _cGunS = SFUpgradeCost(350000,$SF.Squad.GunS)>> <<if $cash >= _cGunS>> [[Upgrade Gunship|Firebase][$SF.Upgrade = 1, $SF.Squad.GunS++, cashX(forceNeg(_cGunS), "specialForces")]] <<else>>//Cannot afford to upgrade Gunship.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cGunS)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.GunS)>> </span> - <<elseif $SF.Squad.GunS == _GunSU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.GunS)>> </span> - <<elseif $SF.Squad.GunS == _GunSU>>//The Gunship has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.GunS)>> </span><</if>></div><</if>> + //Costs @@.red;<<print cashFormat(_cGunS)>>@@//<span style="float:right;"> <<print progress($SF.Squad.GunS)>> </span> + <<elseif $SF.Squad.GunS === _GunSU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.GunS)>> </span> + <<elseif $SF.Squad.GunS === _GunSU>> //The Gunship has been fully upgraded.//<br> <</if>></div><</if>> <<if _T1>>''Launch Bay'' <div style="margin-left:2em"><<if $SF.Squad.Satellite.lv < _SatU && $SF.Squad.Satellite.InOrbit < 1>> @@ -117,9 +110,9 @@ <<if $cash >= _cSat>> [[Upgrade Satellite|Firebase][$SF.Upgrade = 1, $SF.Squad.Satellite.lv++, cashX(forceNeg(_cSat), "specialForces")]] <<else>>//Cannot afford to upgrade Satellite.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cSat)>>@@//<span style="float:right;"><<print progress($SF.Squad.Satellite.lv)>> </span> - <<elseif $SF.Squad.Satellite.lv == _SatU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.Satellite.lv)>> </span> - <<else>>//The Satellite has been fully upgraded.//<span style="float:right;"><<print progress($SF.Squad.Satellite.lv)>></span><</if>></div> + //Costs @@.red;<<print cashFormat(_cSat)>>@@//<span style="float:right;"><<print progress($SF.Squad.Satellite.lv)>> </span> + <<elseif $SF.Squad.Satellite.lv === _SatU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.Satellite.lv)>> </span> + <<else>>//The Satellite has been fully upgraded.//<br><</if>></div> <<if $terrain !== "oceanic">> <div style="margin-left:2em"><<if $SF.Squad.GiantRobot < _GRU>> @@ -127,49 +120,47 @@ <<if $cash >= _cGR>> [[Upgrade Giant Robot|Firebase][$SF.Upgrade = 1, $SF.Squad.GiantRobot++, cashX(forceNeg(_cGR), "specialForces")]] <<else>>//Cannot afford to upgrade the Giant Robot.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cGR)>>@@//<span style="float:right;"><<print progress($SF.Squad.GiantRobot)>></span> - <<elseif $SF.Squad.GiantRobot == _GRU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.GiantRobot)>> </span> - <<else>>//The Giant Robot has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.GiantRobot)>> </span><</if>></div><</if>> + //Costs @@.red;<<print cashFormat(_cGR)>>@@//<span style="float:right;"><<print progress($SF.Squad.GiantRobot)>></span> + <<elseif $SF.Squad.GiantRobot === _GRU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.GiantRobot)>> </span> + <<else>>//The Giant Robot has been fully upgraded.//<br><</if>></div><</if>> <div style="margin-left:2em"><<if $SF.Squad.MissileSilo < _MSU>> <<set _cMS = SFUpgradeCost(565000,$SF.Squad.MissileSilo)>> <<if $cash >= _cMS>> [[Upgrade Cruise Missile|Firebase][$SF.Upgrade = 1, $SF.Squad.MissileSilo++, cashX(forceNeg(_cMS), "specialForces")]] <<else>>//Cannot afford to upgrade Cruise Missile.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cMS)>>@@ //<span style="float:right;"><<print progress($SF.Squad.MissileSilo)>></span> - <<elseif $SF.Squad.MissileSilo == _MSU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.MissileSilo)>> </span> - <<else>>//The Cruise Missile has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.MissileSilo)>> </span><</if>></div><</if>> - + //Costs @@.red;<<print cashFormat(_cMS)>>@@//<span style="float:right;"><<print progress($SF.Squad.MissileSilo)>></span> + <<elseif $SF.Squad.MissileSilo === _MSU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.MissileSilo)>> </span> + <<else>>//The Cruise Missile has been fully upgraded.//<br><</if>></div><</if>> - <<if _T1 && ($terrain == "oceanic" || $terrain == "marine")>>''Naval Yard'' + <<if _T1 && ($terrain == "oceanic" || $terrain == "marine")>>''Naval Yard''<br> <div style="margin-left:2em"><<if $SF.Squad.AircraftCarrier < _ACU>> <<set _cAC = SFUpgradeCost(650000,$SF.Squad.AircraftCarrier)>> <<if $cash >= _cAC>> [[Upgrade Aircraft Carrier|Firebase][$SF.Upgrade = 1, $SF.Squad.AircraftCarrier++, cashX(forceNeg(_cAC), "specialForces")]] <<else>>//Cannot afford to upgrade Aircraft Carrier.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cAC)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.AircraftCarrier)>> </span> - <<elseif $SF.Squad.AircraftCarrier == _ACU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.AircraftCarrier)>> </span> - <<else>>//The Aircraft Carrier has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.AircraftCarrier)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cAC)>>@@//<span style="float:right;"> <<print progress($SF.Squad.AircraftCarrier)>> </span> + <<elseif $SF.Squad.AircraftCarrier === _ACU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.AircraftCarrier)>> </span> + <<else>>//The Aircraft Carrier has been fully upgraded.//<br><</if>></div> <div style="margin-left:2em"><<if $SF.Squad.Sub < _SubU>> <<set _cSub = SFUpgradeCost(700000,$SF.Squad.Sub)>> <<if $cash >= _cSub>> [[Upgrade Submarine|Firebase][$SF.Upgrade = 1, $SF.Squad.Sub++, cashX(forceNeg(_cSub), "specialForces")]] <<else>>//Cannot afford to upgrade Submarine//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cSub)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.Sub)>> </span> - <<elseif $SF.Squad.Sub == _SubU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.Sub)>> </span> - <<else>>//The Submarine has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.Sub)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cSub)>>@@//<span style="float:right;"> <<print progress($SF.Squad.Sub)>> </span> + <<elseif $SF.Squad.Sub === _SubU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.Sub)>> </span> + <<else>>//The Submarine has been fully upgraded.//<br><</if>></div> <div style="margin-left:2em"><<if $SF.Squad.HAT < _HATU>> <<set _cHAT = SFUpgradeCost(665000,$SF.Squad.HAT)>> <<if $cash >= _cHAT>> [[Upgrade Amphibious Transport|Firebase][$SF.Upgrade = 1, $SF.Squad.HAT++, cashX(forceNeg(_cHAT), "specialForces")]] <<else>>//Cannot afford to upgrade Amphibious Transport.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cHAT)>>@@ //<span style="float:right;"> <<print progress($SF.Squad.HAT)>> </span> - <<elseif $SF.Squad.HAT == _HATU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.HAT)>> </span> - <<else>>//The Amphibious Transport has been fully upgraded.//<span style="float:right;"> <<print progress($SF.Squad.HAT)>> </span><</if>></div> + //Costs @@.red;<<print cashFormat(_cHAT)>>@@//<span style="float:right;"> <<print progress($SF.Squad.HAT)>> </span> + <<elseif $SF.Squad.HAT === _HATU && $PC.warfare < 75>>//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print progress($SF.Squad.HAT)>> </span> + <<else>>//The Amphibious Transport has been fully upgraded.//<br><</if>></div> <</if>> - <<if _T1 < 1>>//More firebase upgrades are required to unlock further upgrades.//<</if>> <</if>> /* <div style="margin-left:2em"><<if _T1 && $SF.Facility.Toggle > 0 && $SF.Facility.Active < 1>> @@ -177,5 +168,5 @@ <<if $cash >= _cSFF>> [[Build $SF.Lower's support facility|Firebase][$SF.Upgrade = 1, $SF.Facility.Active++, cashX(forceNeg(_cSFF), "specialForces")]] <<else>>//Cannot afford to build $SF.Lower's support facility.//<</if>> - //Costs @@.yellowgreen;<<print cashFormat(_cSFF)>>@@// + //Costs @@.red;<<print cashFormat(_cSFF)>>@@// <</if>>*/ \ No newline at end of file diff --git a/src/SpecialForce/WeeklyChoices.tw b/src/SpecialForce/WeeklyChoices.tw index 1941d31f79db460ca9bf16e9415f148315bf5620..18e11b4ac20db91eca527d4b4ce1ab85ef15a579 100644 --- a/src/SpecialForce/WeeklyChoices.tw +++ b/src/SpecialForce/WeeklyChoices.tw @@ -47,8 +47,8 @@ <</if>> <<if $SF.Colonel.Talk === 0 && $SF.Colonel.Fun === 0 && $SF.MercCon.CanAttend === -1>> <span id="result0"> -<br><br>If you need me for anything else, let me know."<br> - <<if $SF.Colonel.Status >= 25>> +<br>"If you need me for anything else, let me know." + <<if $SF.Colonel.Status >= 25>> <br> <<link "Walk with the Colonel on the surface.">> <<replace "#result0">> <<set $SF.Colonel.Talk = 1>> <br><br>You ask the Colonel if she would like to stretch her legs up on the surface. It doesn't take much effort for her to agree. diff --git a/src/art/vector/Generate_Stylesheet.tw b/src/art/vector/Generate_Stylesheet.tw index a9597a4c95a3fe4eb3be83a99692512de54e8b53..cb50ba685a6b24f2c6fc5015a064f0e72688c044 100644 --- a/src/art/vector/Generate_Stylesheet.tw +++ b/src/art/vector/Generate_Stylesheet.tw @@ -10,16 +10,17 @@ /* setup height scaling and style */ <<if $seeHeight == 0 || ($seeHeight == 1 && $args[1] == 3)>> - <<set _slaveHeightScale = 100>> + <<set _slaveHeightScale = 1>> <<set _margin = 0>> <<else>> - <<set _slaveHeightScale = Math.trunc(_artSlave.height/2)>> - <<set _margin = 100 - _slaveHeightScale>> + <<set _slaveHeightScale = _artSlave.height/200>> + <<set _margin = Math.max(50 - (50 * _slaveHeightScale), 0)>> <</if>> <<print "<style>."+_art_display_class+" { position: absolute; - height: " + _slaveHeightScale + "%; + height: 100%; + transform: scale(" + _slaveHeightScale + "); margin-top: " + _margin + "%; margin-left: auto; margin-right: auto; diff --git a/src/debugging/debugJS.js b/src/debugging/debugJS.js index 7f1a9650c8aa8a80997420bc6d522bd6068ad8c4..5e94aaa4a4461bcd9317eedf485eac465eb606ad 100644 --- a/src/debugging/debugJS.js +++ b/src/debugging/debugJS.js @@ -80,3 +80,34 @@ window.findNaN = function findNan() { } return result; }; + +/** + * Dumps game save as a readable JSON to the browser for saving in a file + */ +App.Debug.dumpGameState = function () { + // helper to download a blob + // borrowed from stackexchange + function downloadToFile(content, fileName, contentType) { + var a = document.createElement("a"); + var file = new Blob([content], { + type: contentType + }); + a.href = URL.createObjectURL(file); + a.download = fileName; + a.click(); + } + + // we will replace SugarCube onSave handler + let oldHandler = SugarCube.Config.saves.onSave; + try { + SugarCube.Config.saves.onSave = function (save) { + if (oldHandler) { + oldHandler(save); + } + downloadToFile(JSON.stringify(save, null, 2), save.id + ".json", "text/plain"); + } + SugarCube.Save.serialize(); + } finally { + SugarCube.Config.saves.onSave = oldHandler; + } +}; diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw index 37951dd4f7e09179c13ada73933e170a4e3ebef6..41d2e6ed3b4ce82a0384b4e7f605bd02a8b41c86 100644 --- a/src/events/intro/introSummary.tw +++ b/src/events/intro/introSummary.tw @@ -1050,7 +1050,8 @@ Currently @@.cyan;ENABLED.@@ [[Disable|Intro Summary][$seeVectorArtHighlights = 0]] <<else>> @@.red;DISABLED.@@ [[Enable|Intro Summary][$seeVectorArtHighlights = 1]] - <</if>><br> + <</if>> + <br> Height scaling <<if $seeHeight == 1>> @@.yellow;ENABLED@@ on small images. [[Disable|Intro Summary][$seeHeight = 0]] | [[Enable for all images|Intro Summary][$seeHeight = 2]] @@ -1111,12 +1112,12 @@ Currently __''Mods''__ <br>The Special Force Mod is -<<if $SF.Toggle === 0>> +<<if $SF.Toggle < 1>> ''disabled.'' [[Enable|Intro Summary][$SF.Toggle = 1]] <<else>> ''enabled.'' [[Disable|Intro Summary][$SF.Toggle = 0]] <br> The support facility is - <<if ($SF.Facility.Toggle === 0)>> + <<if $SF.Facility.Toggle < 1>> @@.red;DISABLED.@@ [[Enable|Intro Summary][$SF.Facility.Toggle = 1]] <<else>> @@.cyan;ENABLED.@@ [[Disable|Intro Summary][$SF.Facility.Toggle = 0]] diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index d05c527d10d7384124afc2a22b29dfcf7abd9a5e..baca91d539717d3e0518cf7eb4e748f792fe5f72 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -305,7 +305,7 @@ You should have received a copy of the GNU General Public License along with thi <<set $abbreviateSkills = 2>> <<set $abbreviateMental = 2>> <<set $abbreviateSidebar = 2>> - <<set $summaryStats = 1>> + <<set $summaryStats = 0>> <<set $nicknamesAllowed = 1>> <<set $modRequestsAllowed = 1>> <<set $expansionRequestsAllowed = 1>> @@ -1495,10 +1495,7 @@ erectileImplant: 0 <<set $DefaultBirthDestination = "individually decided fates">> <<set $abbreviateHormoneBalance = 2>> -<<if def $SF.Toggle>> - <<set $SF = {Toggle:$SF.Toggle,Active:-1}>> -<<else>> - <<set $SF = {Toggle:0,Active:-1}>> -<</if>> +<<if def $SF.Toggle>> <<set $SF={Toggle:$SF.Toggle}>> <<else>> <<set $SF={Toggle:0}>> <</if>> +<<set $SF.Active=-1>> <<= Facility()>> <<goto "Alpha disclaimer">> diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index a55c854f33f1a2e8f7ba880b21286480c32b1872..94026f56c35bc21483cff86afdd58fd3d0868f77 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -581,7 +581,7 @@ window.DefaultRules = (function() { r += `<br>Breeding regulations forbid the use of cervix penetrating dildos on marked slaves, so the virgin ${slave.slaveName} has been given a standard length huge dildo for her pussy.`; slave.vaginalAccessory = "huge dildo"; } else { - r += `<br>slave.slaveName is a virgin and has been given a `; + r += `<br>${slave.slaveName} is a virgin and has been given a `; if (slave.vagina >= 2) r += `massive and oversized dildo to permanently gape her cunt.`; else { @@ -650,11 +650,11 @@ window.DefaultRules = (function() { break; case "none": - r += `<br>slave.slaveName is a virgin and has been instructed not to use a vaginal accessory.`; + r += `<br>${slave.slaveName} is a virgin and has been instructed not to use a vaginal accessory.`; break; default: - r += `<br>slave.slaveName is a virgin and has been given a ${slave.vaginalAccessory} for her pussy.`; + r += `<br>${slave.slaveName} is a virgin and has been given a ${slave.vaginalAccessory} for her pussy.`; break; } } @@ -834,7 +834,7 @@ window.DefaultRules = (function() { r += `<br>Breeding regulations forbid the use of anal plugs that can damage a growing fetus on marked slaves, so the anal virgin ${slave.slaveName} has been given a standard length huge plug for her anus.`; slave.buttplug = "huge plug"; } else { - r += `<br>slave.slaveName is an anal virgin and has been given a `; + r += `<br>${slave.slaveName} is an anal virgin and has been given a `; if (slave.anus >= 2) r += `massive and oversized plug to permanently gape her asshole.`; else { diff --git a/src/js/economyJS.js b/src/js/economyJS.js index ede978fdd40e3efa1d778956a269ef962dac0b99..e26b85ff6608ff3ee10d02afef7f42e405ba78a3 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -520,7 +520,7 @@ window.getEnvironmentCosts = function(cost) { window.getSFCosts = function() { var costs = 0; - if(State.variables.SF.Toggle && State.variables.SF.Active >= 1 && State.variables.SF.Subsidy > 0) { + if(State.variables.SF.Toggle && State.variables.SF.Active >= 1 && State.variables.SF.Subsidy !== undefined) { Count(); costs += Math.ceil(State.temporary.SFSubsidy); } return costs; diff --git a/src/js/generateNewSlaveJS.js b/src/js/generateNewSlaveJS.js index f4dee9f0c0ae93aca3a1c856b740bf3b3d9db091..e6c91b9967380cd0f2242293e36bca44deb9c8b6 100644 --- a/src/js/generateNewSlaveJS.js +++ b/src/js/generateNewSlaveJS.js @@ -57,6 +57,7 @@ window.GenerateNewSlave = (function(){ } function postGenCleanup() { + generatePuberty(slave); generateBoobTweaks(); /* split this up for female vs. male? */ generateSkills(); generateDisabilities(); @@ -69,7 +70,6 @@ window.GenerateNewSlave = (function(){ function GenerateXXSlave() { slave.ovaries = 1; - slave.pubertyXY = 0; slave.energy = jsRandom(1,85); generateXXGeneticQuirks(); @@ -84,14 +84,12 @@ window.GenerateNewSlave = (function(){ generateXXTeeth(); generateXXMods(); generateXXBodyHair(); - generateXXPuberty(); } function GenerateXYSlave() { slave.genes = "XY"; slave.hLength = 10; slave.prostate = 1; - slave.pubertyXX = 0; slave.energy = jsRandom(15,90); generateXYGeneticQuirks(); @@ -107,7 +105,6 @@ window.GenerateNewSlave = (function(){ generateXYTeeth(); generateXYMods(); generateXYBodyHair(); - generateXYPuberty(); } function generateXXBodyProportions() { @@ -1050,26 +1047,6 @@ window.GenerateNewSlave = (function(){ slave.eyebrowFullness = jsEither(["bushy", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "pencil-thin", "tapered", "tapered", "tapered", "thick", "thick", "thin", "thin", "threaded", "threaded", "threaded"]); } - function generateXXPuberty() { - if (slave.physicalAge >= slave.pubertyAgeXX) { - slave.pubertyXX = 1; - } else { - slave.pubertyXX = 0; - } - } - - function generateXYPuberty() { - if (slave.balls > 0) { - if (slave.physicalAge >= slave.pubertyAgeXY) { - slave.pubertyXY = 1; - } else { - slave.pubertyXY = 0; - } - } else { - slave.pubertyXY = 0; - } - } - function generateXXGeneticQuirks() { chance = jsRandom(1,1000); if (chance >= 980) { diff --git a/src/js/heroCreator.js b/src/js/heroCreator.js index 62194ac9182c3397b08e6dbdbba72a9106fbaa93..95f8d0ca54d067122cbbc1819603701b11f4fcc1 100644 --- a/src/js/heroCreator.js +++ b/src/js/heroCreator.js @@ -3,5 +3,6 @@ window.getHeroSlave = function (heroSlave, baseHeroSlave) { for (var attrname in heroSlave) { newSlave[attrname] = heroSlave[attrname]; } + generatePuberty(newSlave); return newSlave; }; diff --git a/src/js/slaveGenerationJS.js b/src/js/slaveGenerationJS.js index 6cbbe9b08178d4777ba52f9111495289936368d6..8a9f5c913f1546bc366c3901703c7feb5ac42092 100644 --- a/src/js/slaveGenerationJS.js +++ b/src/js/slaveGenerationJS.js @@ -1417,3 +1417,16 @@ window.generatePronouns = /** @param {App.Entity.SlaveState} slave*/ function ge slave.noun = "girl"; } }; + +window.generatePuberty = function(slave) { + if ((slave.ovaries === 1 || slave.mpreg === 1) && slave.physicalAge >= slave.pubertyAgeXX) { + slave.pubertyXX = 1; + } else { + slave.pubertyXX = 0; + } + if (slave.balls > 0 && slave.ballType !== "sterile" && slave.physicalAge >= slave.pubertyAgeXY) { + slave.pubertyXY = 1; + } else { + slave.pubertyXY = 0; + } +}; diff --git a/src/player/actions/fCaress.tw b/src/player/actions/fCaress.tw index 45d19ad48dbcc9847b07b5a46510062fc01af797..65bcc0959e99b170b6997dff9b3287738e719ef3 100644 --- a/src/player/actions/fCaress.tw +++ b/src/player/actions/fCaress.tw @@ -37,7 +37,7 @@ You tell $activeSlave.slaveName to <<elseif $activeSlave.devotion < -20>> $He complies out of fear. Once $he's close, you hold $his shaking face in your palms and look into $his teary $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's forcibly married to terrifying, and <<if canSee($activeSlave)>> breaks eye contact<<else>> turns $his face away<</if>>. <<else>> - $He complies obediently. Once $he's close, you hold $his face in your palms and look into $his $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if $canSee($activeSlave)>>, running $his eyes over your <<if $PC.boobs == 1>>bosom<<else>>chest<</if>><</if>>. + $He complies obediently. Once $he's close, you hold $his face in your palms and look into $his $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if canSee($activeSlave)>>, running $his eyes over your <<if $PC.boobs == 1>>bosom<<else>>chest<</if>><</if>>. <</if>> <<elseif ($activeSlave.devotion > 75)>> $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and look into $his $activeSlave.eyeColor eyes. $He finds the intense look from $his beloved <<= WrittenMaster()>> disconcerting, and $his eyes flick downward after a moment. $He blushes furiously. diff --git a/src/player/actions/fEmbrace.tw b/src/player/actions/fEmbrace.tw index b4d91a7d797701b8b1d77a9b6e6927b88424a2d6..d04356b961731b82950c72753967e8b4bbeaf363 100644 --- a/src/player/actions/fEmbrace.tw +++ b/src/player/actions/fEmbrace.tw @@ -25,7 +25,7 @@ You tell $activeSlave.slaveName to <<elseif $activeSlave.devotion < -20>> $He complies out of fear. Once $he's close, you take your unwilling wife's head in your hands and gaze deeply into $his teary $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's forcibly married to terrifying, and <<if canSee($activeSlave)>> breaks eye contact<<else>> turns $his face away<</if>>. <<else>> - $He complies obediently. Once $he's close, you take your willing wife's head in your hands and gaze deeply into $his $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if $canSee($activeSlave)>>, running $his eyes over your <<if $PC.boobs == 1>>bosom<<else>>chest<</if>><</if>>. + $He complies obediently. Once $he's close, you take your willing wife's head in your hands and gaze deeply into $his $activeSlave.eyeColor eyes. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if canSee($activeSlave)>>, running $his eyes over your <<if $PC.boobs == 1>>bosom<<else>>chest<</if>><</if>>. <</if>> <<elseif ($activeSlave.devotion > 75)>> $He elatedly complies, joyful at being near to you. Once $he's close, you take $his completely relaxed head in your hands and gaze deeply into $his $activeSlave.eyeColor eyes. $He finds the intense look from $his beloved <<= WrittenMaster()>> disconcerting, and $his eyes flick downward after a moment. $He blushes furiously. diff --git a/src/pregmod/eliteTakeOverFight.tw b/src/pregmod/eliteTakeOverFight.tw index 2f530ac527d5572e63460d89a45e368f1c371988..2f7cc92bd7237d623f48397b15e2f4e47f32f32b 100644 --- a/src/pregmod/eliteTakeOverFight.tw +++ b/src/pregmod/eliteTakeOverFight.tw @@ -31,7 +31,7 @@ <br>You send a quick message to the leader of your $mercenariesTitle, about your situation, then you pick up the revolver and quickly take aim. <<set $MercenariesMessageSent = 1>> <<case "SF">> - <br>You send a quick message to <<print SFC()> about your situation, then you pick up the revolver and quickly take aim. + <br>You send a quick message to <<print SFC()>> about your situation, then you pick up the revolver and quickly take aim. <<set $SpecialForcesMessageSent = 1>> <<case "enrage">> <<if $PC.career != "wealth" && $PC.career != "engineer" && $PC.career != "medicine">> diff --git a/src/pregmod/manageCorporation.tw b/src/pregmod/manageCorporation.tw index 5803bd691f59d8c92e08632acdef6459be6ebe85..fdc6b33d3608d857dc1eab972c43756905995b1f 100644 --- a/src/pregmod/manageCorporation.tw +++ b/src/pregmod/manageCorporation.tw @@ -244,7 +244,7 @@ __Division Management__ <<set $corpCash += $corpDivExtraSlaves * 10 * menialSlaveCost(-$corpDivExtraSlaves) + $corpDivExtraDev * 16000, $corpRev += $corpDivExtraSlaves * 10 * menialSlaveCost(-$corpDivExtraSlaves), $corpAssetsDev -= $corpDivExtraDev * 16000, - $corpExpandToken += 1 + $corpExpandToken += 1, $menialDemandFactor -= $corpDivExtraSlaves, $corpDivExtra = 0, $corpDivExtraDev = 0>> @@ -1465,7 +1465,7 @@ __Slave specialization__ <<if ndef $corpSpecImplants && $corpDivSurgery > 0>> /*This used to be $surgicalUpgradeImplants, it is the surgery specialization*/ <br>Slave implants are [[Applied|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Not Applied|Manage Corporation][$corpSpecImplants = 0, $corpSpecTimer = 2]] <</if>> - <<if ndef $corpSpecGenitalia && $corpDivSurgery > 100>> /*This used to be $surgicalUpgradeGenitalia, it is the surgery specialization*/ + <<if ndef $corpSpecGenitalia && $corpDivSurgeryDev > 100>> /*This used to be $surgicalUpgradeGenitalia, it is the surgery specialization*/ <br>Slaves get their genitalia reconfigured [[Add Pussy|Manage Corporation][$corpSpecPussy = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Pussy|Manage Corporation][$corpSpecPussy = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Dick|Manage Corporation][$corpSpecDick = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Dick|Manage Corporation][$corpSpecDick = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Balls|Manage Corporation][$corpSpecBalls = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Balls|Manage Corporation][$corpSpecBalls = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] <</if>> <<if ndef $corpSpecTrust && $corpDivBreak > 0>> /*This used to be $generalUpgradeBreaking, it is the slave breaking specific specialization*/ @@ -1863,7 +1863,7 @@ __Slave specialization__ <<if $arcologies[0].FSPhysicalIdealist == "unset">> [[Aim for Frail|Manage Corporation][$corpSpecMuscle = 1, $corpSpecTimer = 2]] | <</if>> - [[Aim for Soft][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corpSpecMuscle == 3>> <br>The corporation is aiming for slaves with soft muscles. @@ -1876,10 +1876,10 @@ __Slave specialization__ <<elseif $corpSpecMuscle == 4>> <br>The corporation aims for toned muscles. <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && ($corpDivBreakDev + $corpDivSurgery + $corpDivTrainDev > 100)>> + <<if $corpSpecToken > 0 && ($corpDivBreakDev + $corpDivSurgeryDev + $corpDivTrainDev > 100)>> [[Aim for Ripped|Manage Corporation][$corpSpecMuscle = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | <</if>> - [[Aim for Soft][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corpSpecMuscle == 5>> <br>The corporation aims for ripped slaves. @@ -1955,7 +1955,7 @@ __Slave specialization__ <<elseif $corpSpecEducation == 1>> <br>The corporation makes sure all slaves have a basic education. <<if $corpSpecTimer == 0>> - <<if $corpDivTrain > 200 && $corpSpecToken > 0>> + <<if $corpDivTrainDev > 200 && $corpSpecToken > 0>> [[Advanced Education|Manage Corporation][$corpSpecEducation = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | <</if>> [[No Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> diff --git a/src/uncategorized/RETS.tw b/src/uncategorized/RETS.tw index 2dd397825a8e3c020caf9289da5e832929e48f63..fa80e9640bfccb49d04df02851e1e10dadefee66 100644 --- a/src/uncategorized/RETS.tw +++ b/src/uncategorized/RETS.tw @@ -227,7 +227,7 @@ $activeSlave.slaveName <</if>> <br><br> <<run Enunciate($subSlave)>> -"Oh," says $subSlave.slaveName. "Um, can I try <<s>>ome?" +"Oh," says <<EventNameLink $subSlave>>. "Um, can I try <<s>>ome?" <br><br> $activeSlave.slaveName smiles and murmurs, "Mm hm." There is a distinct <<if canSee($activeSlave)>>glint in $his eye<<else>>look on $his face<</if>>. $He's got a healthy libido, to put it mildly. Like all slaves, $subSlave.slaveName sleeps nude and hasn't gotten dressed yet, and $activeSlave.slaveName has <<if canSee($activeSlave)>> @@ -311,13 +311,13 @@ After you complete your weekly inspection of <<EventNameLink $activeSlave>>, the $desc asks if $he can beg a favor. Absurd though it sounds, $he does exactly that, saying in $his <<if $activeSlave.voice > 2>>high<<elseif $activeSlave.voice > 1>>feminine<<else>>bimbo<</if>> voice, "<<Master>>, may I a<<s>>k a favor?" You take a moment to look at $him, standing there in front of your desk. $He's devoted to you, willing to please you for the sake of pleasing you, rather than to avoid punishment or make $his own life easier. And $he's very trusting, confident that $he can say such an odd thing without fear. So, you hear $him out. <br><br> -"Thank you, <<Master>>," $he <<say>>s. "I would like to do <<s>>omething for $subSlave.slaveName." You ask if $he's worried about $his <<if $activeSlave.relationship >= 5>>wife<<else>>girlfriend<</if>> for some reason. "Oh no, <<Master>>," $he answers hurriedly. "No, no, that came out wrong. It'<<s>> ju<<s>>t that I love _him2 and I want to, you know, get _him2 <<s>>omething or do <<s>>omething <<s>>pe<<c>>ial for _him2. We don't really have <<s>>tuff of our own, <<s>>o I can't give _him2 a pre<<s>>ent, and we already do everything either one of u<<s>> want<<s>> in bed, <<s>>o I can't really think of anything." $He <<if canSee($activeSlave)>>looks<<else>>gazes<</if>> at you hopefully. +"Thank you, <<Master>>," $he <<say>>s. "I would like to do <<s>>omething for <<EventNameLink $subSlave>>." You ask if $he's worried about $his <<if $activeSlave.relationship >= 5>>wife<<else>>girlfriend<</if>> for some reason. "Oh no, <<Master>>," $he answers hurriedly. "No, no, that came out wrong. It'<<s>> ju<<s>>t that I love _him2 and I want to, you know, get _him2 <<s>>omething or do <<s>>omething <<s>>pe<<c>>ial for _him2. We don't really have <<s>>tuff of our own, <<s>>o I can't give _him2 a pre<<s>>ent, and we already do everything either one of u<<s>> want<<s>> in bed, <<s>>o I can't really think of anything." $He <<if canSee($activeSlave)>>looks<<else>>gazes<</if>> at you hopefully. <<case "anal cowgirl">> As you approach your office as you return from an unexpected but minor matter, you hear the unmistakable sounds of sexual congress. Reviewing your schedule as you cover the last few <<if $showInches == 2>>feet<<else>>meters<</if>> on your way there, you see that indeed, <<EventNameLink $activeSlave>> is due to be inspected. It seems likely that while waiting for your return, $he called a fellow slave who was passing your office in to keep $him company. And as you enter, you see that this is true. <br><br> -$He's sitting on the end of the couch, though only $his legs, crotch and hands are immediately visible. This is because $he has $subSlave.slaveName on top of $him, impaled on <<if canPenetrate($activeSlave)>>$his cock<<else>>a strap-on $he's wearing<</if>>. $subSlave.slaveName is bent almost double. $activeSlave.slaveName has $his $activeSlave.skin hands up on the backs of $subSlave.slaveName's $subSlave.skin knees, holding _his2 legs<<if $activeSlave.belly >= 5000>> to either side of _his2 <<if ($activeSlave.preg > $activeSlave.pregData.normalBirth/8)>>pregnancy<<else>>belly<</if>>,<</if>> up against _his2 <<if $subSlave.boobs > 2000>>inconveniently big boobs<<else>>shoulders<</if>>. $subSlave.slaveName is completely helpless, and _he2's being fucked hard: +$He's sitting on the end of the couch, though only $his legs, crotch and hands are immediately visible. This is because $he has <<EventNameLink $subSlave>> on top of $him, impaled on <<if canPenetrate($activeSlave)>>$his cock<<else>>a strap-on $he's wearing<</if>>. $subSlave.slaveName is bent almost double. $activeSlave.slaveName has $his $activeSlave.skin hands up on the backs of $subSlave.slaveName's $subSlave.skin knees, holding _his2 legs<<if $activeSlave.belly >= 5000>> to either side of _his2 <<if ($activeSlave.preg > $activeSlave.pregData.normalBirth/8)>>pregnancy<<else>>belly<</if>>,<</if>> up against _his2 <<if $subSlave.boobs > 2000>>inconveniently big boobs<<else>>shoulders<</if>>. $subSlave.slaveName is completely helpless, and _he2's being fucked hard: <<if canPenetrate($activeSlave)>> <<if ($activeSlave.dick - $subSlave.anus > 2)>> $activeSlave.slaveName's cock is very big, <<if $subSlave.anus > 2>>even for $subSlave.slaveName's loose anus<<elseif $subSlave.anus > 1>>even for $subSlave.slaveName's experienced anus<<else>>especially for $subSlave.slaveName's tight anus<</if>>, so $activeSlave.slaveName is bouncing $his anal bottom up and down only a little way, allowing $him to do so fast. @@ -395,7 +395,7 @@ $He clearly held off on climaxing in case you wanted $his libido undiminished fo <<set _headGirlPresent = 0>> <</if>> <</if>> -You pass by the slave quarters during a busy time. Girls are hurrying back and forth, rushing to bathe, eat, and get dressed. <<EventNameLink $activeSlave>> is in a particular hurry, $his <<if $activeSlave.belly >= 10000>><<if $activeSlave.bellyPreg >= 8000>>heavy pregnancy<<else>>heavy belly<</if>> and <</if>><<if $activeSlave.boobs > 8000>>gargantuan tits hampering $him badly<<else>>huge boobs getting in the way<</if>> as $he rushes around. Returning from the shower to the sleeping area, $he turns a corner and runs hard into $subSlave.slaveName. Both slaves are nude, and the collision of their massive breasts makes an audibly painful smack. $activeSlave.slaveName has enough momentum that $he overbears the top-heavy $subSlave.slaveName entirely. The poor <<if $subSlave.physicalAge > 30>>_woman2<<else>>_girl2<</if>> crashes backwards, _his2 <<if $subSlave.butt > 8>>monstrous bottom<<elseif $subSlave.butt > 4>>big behind<<else>>hind end<</if>> hitting the floor with a slap. $activeSlave.slaveName lands on top of _him2, the fall and the sudden weight of $activeSlave.slaveName on top of _him2 driving the wind out of $subSlave.slaveName with a whoosh. +You pass by the slave quarters during a busy time. Girls are hurrying back and forth, rushing to bathe, eat, and get dressed. <<EventNameLink $activeSlave>> is in a particular hurry, $his <<if $activeSlave.belly >= 10000>><<if $activeSlave.bellyPreg >= 8000>>heavy pregnancy<<else>>heavy belly<</if>> and <</if>><<if $activeSlave.boobs > 8000>>gargantuan tits hampering $him badly<<else>>huge boobs getting in the way<</if>> as $he rushes around. Returning from the shower to the sleeping area, $he turns a corner and runs hard into <<EventNameLink $subSlave>>. Both slaves are nude, and the collision of their massive breasts makes an audibly painful smack. $activeSlave.slaveName has enough momentum that $he overbears the top-heavy $subSlave.slaveName entirely. The poor <<if $subSlave.physicalAge > 30>>_woman2<<else>>_girl2<</if>> crashes backwards, _his2 <<if $subSlave.butt > 8>>monstrous bottom<<elseif $subSlave.butt > 4>>big behind<<else>>hind end<</if>> hitting the floor with a slap. $activeSlave.slaveName lands on top of _him2, the fall and the sudden weight of $activeSlave.slaveName on top of _him2 driving the wind out of $subSlave.slaveName with a whoosh. <br><br> "<<S>>orry! I'm <<s>>o <<s>>orry," apologizes $activeSlave.slaveName. $He starts to try to disentangle $himself as $subSlave.slaveName struggles to get _his2 breath back, but you see $activeSlave.slaveName's back stiffen. $He stops trying to get up. As the discomfort of the collision fades, $he notices the warmth of $subSlave.slaveName underneath $him, and the way their nipples are pressed against one another. Impulsively, $he kisses $subSlave.slaveName full on the lips, <<if $activeSlave.boobs+$subSlave.boobs > 20000>> @@ -528,7 +528,7 @@ Once $he's gotten $himself positioned, $subSlave.slaveName reaches around $activ The distinctive sounds of a sexual encounter in which exactly one of the participants is enjoying $himself are coming from the dormitory. This is by no means uncommon, but this particular nonconsensual assignation sounds interesting, so you stick your head in on your way by. You're treated to the sight of <<EventNameLink $activeSlave>>'s $activeSlave.skin back and <<if ($activeSlave.butt > 4)>>massive ass<<elseif ($activeSlave.butt > 2)>>plush rear<<else>>cute butt<</if>> as $he kneels on one of the bedrolls. It isn't immediately clear what's going on, but $he's doing something with $his <<if canPenetrate($activeSlave)>>dick<<else>>hands<</if>>, and there are a pair of $subSlave.skin feet visible on either side of $him. $He's clearly got someone shoved down into the bedroll in front of $him, doggy style. That's the source of the whining. <br><br> -Advancing to get a better view, you identify the bottom as <<if $subSlave.bellyPreg >= 5000>>the pregnant <</if>>$subSlave.slaveName. $activeSlave.slaveName has +Advancing to get a better view, you identify the bottom as <<if $subSlave.bellyPreg >= 5000>>the pregnant <</if>><<EventNameLink $subSlave>>. $activeSlave.slaveName has <<if canPenetrate($activeSlave)>> <<if $activeSlave.dick > 4>> $his gigantic dick up $subSlave.slaveName's @@ -563,7 +563,7 @@ $activeSlave.slaveName isn't fucking $subSlave.slaveName at all: $he's just <<if <<set $subSlave.analCount++, $analTotal++>> <<set _belly = bellyAdjective($subSlave)>> <<setPlayerPronouns>> -You look in on your slaves as a group of them heads for bed. $subSlave.slaveName finds <<EventNameLink $activeSlave>> blocking the way to _hers2. Poor $subSlave.slaveName cringes at $activeSlave.slaveName's predatory expression, but the horny slave doesn't pounce at once. Instead, $he starts to walk around $subSlave.slaveName, whose $subSlave.skin body is nude for bed, groping and prodding _him2 as $subSlave.slaveName shivers with fear. Finally $activeSlave.slaveName sidles up behind $subSlave.slaveName<<if $activeSlave.belly >= 5000>>, until $his bulging belly pushes into $his back, before<</if>> snaking $his arms around $subSlave.slaveName's +You look in on your slaves as a group of them heads for bed. <<EventNameLink $subSlave>> finds <<EventNameLink $activeSlave>> blocking the way to _hers2. Poor $subSlave.slaveName cringes at $activeSlave.slaveName's predatory expression, but the horny slave doesn't pounce at once. Instead, $he starts to walk around $subSlave.slaveName, whose $subSlave.skin body is nude for bed, groping and prodding _him2 as $subSlave.slaveName shivers with fear. Finally $activeSlave.slaveName sidles up behind $subSlave.slaveName<<if $activeSlave.belly >= 5000>>, until $his bulging belly pushes into $his back, before<</if>> snaking $his arms around $subSlave.slaveName's <<if $subSlave.bellyPreg >= 10000>> pregnant <<elseif $subSlave.weight > 95>> @@ -629,13 +629,13 @@ $subSlave.slaveName keeps _his2 eyes clamped shut and _his2 hands down at _his2 <<set $subSlave.analCount++, $analTotal++>> <<set _belly = bellyAdjective($subSlave)>> -As you pass the showers, you hear what sounds like a muffled altercation over the noise of the showers running. You look in to see $subSlave.slaveName's $subSlave.skin body facing you, pressed hard up against the glass wall of one of the showers. _His2 <<if $subSlave.face > 95>>gorgeous<<elseif $subSlave.face > 40>>beautiful<<elseif $subSlave.face > 10>>pretty<<elseif $subSlave.face >= -10>>attractive<<else>>homely<</if>> face<<if $subSlave.belly >= 5000>> and <<if $subSlave.bellyPreg >= 5000>>pregnant<<else>>_belly<</if>> belly are<<else>> is<</if>> smashed against the glass, <<if $subSlave.belly >= 5000>>_his2 face <</if>>contorted in pain and fear. The apparent mystery is solved when you notice that there are four legs visible: there's a pair of <<if ($activeSlave.muscles > 95)>>ripped<<elseif ($activeSlave.muscles > 30)>>muscular<<elseif ($activeSlave.muscles > 5)>>toned<<else>>soft<</if>> $activeSlave.skin calves behind $subSlave.slaveName's. <<EventNameLink $activeSlave>>'s face appears at $subSlave.slaveName's ear, and though you can't hear exactly what $he says, it's something along the lines of "Take it, you whiny little bitch." $He's clearly got <<if canPenetrate($activeSlave)>>$his cock<<else>>a couple of fingers<</if>> up $subSlave.slaveName's asshole. +As you pass the showers, you hear what sounds like a muffled altercation over the noise of the showers running. You look in to see <<EventNameLink $subSlave>>'s $subSlave.skin body facing you, pressed hard up against the glass wall of one of the showers. _His2 <<if $subSlave.face > 95>>gorgeous<<elseif $subSlave.face > 40>>beautiful<<elseif $subSlave.face > 10>>pretty<<elseif $subSlave.face >= -10>>attractive<<else>>homely<</if>> face<<if $subSlave.belly >= 5000>> and <<if $subSlave.bellyPreg >= 5000>>pregnant<<else>>_belly<</if>> belly are<<else>> is<</if>> smashed against the glass, <<if $subSlave.belly >= 5000>>_his2 face <</if>>contorted in pain and fear. The apparent mystery is solved when you notice that there are four legs visible: there's a pair of <<if ($activeSlave.muscles > 95)>>ripped<<elseif ($activeSlave.muscles > 30)>>muscular<<elseif ($activeSlave.muscles > 5)>>toned<<else>>soft<</if>> $activeSlave.skin calves behind $subSlave.slaveName's. <<EventNameLink $activeSlave>>'s face appears at $subSlave.slaveName's ear, and though you can't hear exactly what $he says, it's something along the lines of "Take it, you whiny little bitch." $He's clearly got <<if canPenetrate($activeSlave)>>$his cock<<else>>a couple of fingers<</if>> up $subSlave.slaveName's asshole. <br><br> Both slaves notice you at the same time. $subSlave.slaveName's <<if canSee($subSlave)>>$subSlave.eyeColor eyes widen<<else>>face lights up<</if>>, but _his2 momentary look of hope is snuffed out when _he2 remembers who you are. $activeSlave.slaveName, on the other hand, looks a little doubtful. The rules allow $him to fuck your other slaves, but $he isn't quite sure what the right thing to do is, since $he isn't the most dominant force in the showers any more. <<case "repressed anal virgin">> -$subSlave.slaveName has been a very good _girl2 this week, so when _his2 <<if $subSlave.anus > 2>>loose asshole<<elseif $subSlave.anus > 1>>big butthole<<else>>tight anus<</if>> catches your eye near the start of a long inspection, you decide to be kind to _him2 as you conduct the rest of your inspection with <<if $PC.dick == 1>>your cock<<else>>a strap-on<</if>>. <<EventNameLink $activeSlave>> is next on the inspection schedule, and when $he comes into your office, it's to the <<if canSee($activeSlave)>>sight of $subSlave.slaveName's back and rear<<else>>sound of $subSlave.slaveName<</if>> as _he2 lazily rides _his2 <<= WrittenMaster($subSlave)>>. You've been sitting on the couch, making out with the compliant _girl2 as _he2 rides you, for a good half hour. Poor $subSlave.slaveName was pent up when you started, and _he2's climaxed already; _he2's feeling very devoted and relaxed at the moment, and is doing _his2 best to get you off, too. When you finally come, _he2 moans _his2 thanks into your mouth nonverbally, breaks your lip lock, gives you a peck on the nose, and climbs off you. As _he2 does, _he2 lifts _his2 ass off your <<if $PC.dick == 1>>cock<<else>>strap-on<</if>>, _his2 <<if $subSlave.anus > 2>>gaping anus dripping <<if $PC.dick == 1>>cum<<else>>lube<</if>> all over _his2 $subSlave.skin legs<<elseif $subSlave.anus > 1>>well-fucked backdoor taking a few seconds to recover from its gape, dripping a little <<if $PC.dick == 1>>cum<<else>>lube<</if>> down _his2 $subSlave.skin legs<<else>>still-tight backdoor sliding quickly off you, visibly slick with <<if $PC.dick == 1>>cum<<else>>lube<</if>><</if>>. You didn't fuck _him2 too hard, but <<if $PC.dick == 1>>you're not small<<else>>your strap-ons are not small<</if>>, and _he2 walks a little gingerly as _he2 heads for the bathroom. $activeSlave.slaveName, standing there nude for inspection, stares openmouthed at $subSlave.slaveName as _he2 goes. $He's obviously unfamiliar with anal sex. +<<EventNameLink $subSlave>> has been a very good _girl2 this week, so when _his2 <<if $subSlave.anus > 2>>loose asshole<<elseif $subSlave.anus > 1>>big butthole<<else>>tight anus<</if>> catches your eye near the start of a long inspection, you decide to be kind to _him2 as you conduct the rest of your inspection with <<if $PC.dick == 1>>your cock<<else>>a strap-on<</if>>. <<EventNameLink $activeSlave>> is next on the inspection schedule, and when $he comes into your office, it's to the <<if canSee($activeSlave)>>sight of $subSlave.slaveName's back and rear<<else>>sound of $subSlave.slaveName<</if>> as _he2 lazily rides _his2 <<= WrittenMaster($subSlave)>>. You've been sitting on the couch, making out with the compliant _girl2 as _he2 rides you, for a good half hour. Poor $subSlave.slaveName was pent up when you started, and _he2's climaxed already; _he2's feeling very devoted and relaxed at the moment, and is doing _his2 best to get you off, too. When you finally come, _he2 moans _his2 thanks into your mouth nonverbally, breaks your lip lock, gives you a peck on the nose, and climbs off you. As _he2 does, _he2 lifts _his2 ass off your <<if $PC.dick == 1>>cock<<else>>strap-on<</if>>, _his2 <<if $subSlave.anus > 2>>gaping anus dripping <<if $PC.dick == 1>>cum<<else>>lube<</if>> all over _his2 $subSlave.skin legs<<elseif $subSlave.anus > 1>>well-fucked backdoor taking a few seconds to recover from its gape, dripping a little <<if $PC.dick == 1>>cum<<else>>lube<</if>> down _his2 $subSlave.skin legs<<else>>still-tight backdoor sliding quickly off you, visibly slick with <<if $PC.dick == 1>>cum<<else>>lube<</if>><</if>>. You didn't fuck _him2 too hard, but <<if $PC.dick == 1>>you're not small<<else>>your strap-ons are not small<</if>>, and _he2 walks a little gingerly as _he2 heads for the bathroom. $activeSlave.slaveName, standing there nude for inspection, stares openmouthed at $subSlave.slaveName as _he2 goes. $He's obviously unfamiliar with anal sex. <br><br> $activeSlave.slaveName coughs and looks doubtful, like $he's mulling over a question. You let the poor repressed $girl chew on it for a while, and eventually $he bursts out, "<<Master $activeSlave>>, what were you doing with $subSlave.slaveName?" The absurdity gives you a moment's pause, but you answer gamely that you were fucking _his2 ass. $activeSlave.slaveName blushes furiously but plunges on, "I'm <<s>>-<<s>>orry, <<Master>>, but I <<s>>till don't under<<s>>tand. I thought <<s>>e<<x>> happened in a v-vagina. I d-didn't think b-butt<<s>> were — were for, you know, that." <<set $subSlave.analCount++, $analTotal++>> @@ -652,7 +652,7 @@ $activeSlave.slaveName coughs and looks doubtful, like $he's mulling over a ques <<set _notVirgin = 0>> <</if>> <<set _belly = bellyAdjective($activeSlave)>> -As you stroll past the best part of the slave living area one evening, you hear a lewd slap, slap, slap coming from the room <<EventNameLink $activeSlave>> and $subSlave.slaveName share. It's quite obvious what they're up to, but you look in anyway. $activeSlave.slaveName has clearly had a long day, and is tired, but $he's being a good <<if $activeSlave.relationship > 4>>wife<<else>>lover<</if>> and letting $subSlave.slaveName use $his body. $activeSlave.slaveName is lying face-down on their bed, arms crossed under $his head, looking quite relaxed. $He has a couple of pillows tucked under $his hips to raise them so that $his <<if $activeSlave.relationship > 4>>wife<<else>>sweetheart<</if>> can fuck $him comfortably<<if $activeSlave.belly >= 5000>> and to give $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> room beneath $him<</if>>. They've obviously been at this for a while. $subSlave.slaveName likes to top and is not gentle at it, and _he2's pounding $activeSlave.slaveName as hard as _he2 can. _He2's <<if $subSlave.muscles > 30>>a very strong girl, and _his2 muscles work noticeably<<elseif $subSlave.muscles > 5>>physically fit, but even so, _he2's showing signs of fatigue<<else>>not very fit, and _he2's gasping tiredly<</if>> as _he2 pistons <<if canPenetrate($subSlave)>>_his2 penis<<else>>the strap-on _he2's wearing<</if>> in and out of the <<if _notVirgin == 1>>asshole<<else>>pussy<</if>> beneath _him2. +As you stroll past the best part of the slave living area one evening, you hear a lewd slap, slap, slap coming from the room <<EventNameLink $activeSlave>> and <<EventNameLink $subSlave>> share. It's quite obvious what they're up to, but you look in anyway. $activeSlave.slaveName has clearly had a long day, and is tired, but $he's being a good <<if $activeSlave.relationship > 4>>wife<<else>>lover<</if>> and letting $subSlave.slaveName use $his body. $activeSlave.slaveName is lying face-down on their bed, arms crossed under $his head, looking quite relaxed. $He has a couple of pillows tucked under $his hips to raise them so that $his <<if $activeSlave.relationship > 4>>wife<<else>>sweetheart<</if>> can fuck $him comfortably<<if $activeSlave.belly >= 5000>> and to give $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> room beneath $him<</if>>. They've obviously been at this for a while. $subSlave.slaveName likes to top and is not gentle at it, and _he2's pounding $activeSlave.slaveName as hard as _he2 can. _He2's <<if $subSlave.muscles > 30>>a very strong girl, and _his2 muscles work noticeably<<elseif $subSlave.muscles > 5>>physically fit, but even so, _he2's showing signs of fatigue<<else>>not very fit, and _he2's gasping tiredly<</if>> as _he2 pistons <<if canPenetrate($subSlave)>>_his2 penis<<else>>the strap-on _he2's wearing<</if>> in and out of the <<if _notVirgin == 1>>asshole<<else>>pussy<</if>> beneath _him2. <br><br> @@ -730,7 +730,7 @@ Mere moments after you absorb this arresting scene, $subSlave.slaveName thrusts <<set $activeSlave.penetrativeCount++, $penetrativeTotal++>> <<set _vaginal = 0>> <<if $subSlave.vagina != 0 && canDoVaginal($subSlave)>><<set _vaginal = 1>><</if>> -You round a corner and almost trip over <<EventNameLink $activeSlave>>. $He's on top of another slave, humping away; $his <<if $activeSlave.butt > 8>>monstrous, naked ass jiggles lewdly<<elseif $activeSlave.anus > 2>>loose asspussy winks lewdly<<elseif $activeSlave.muscles > 30>>heavily muscled butt flexes powerfully<<elseif $activeSlave.butt > 3>>big butt pumps energetically<<else>>nice little butt flexes cutely<</if>> as $he thrusts. You can't see much of the slave <<if _vaginal>>lying on _his2 back<<else>>face-down<</if>> underneath $activeSlave.slaveName, but you recognize _him2 as $subSlave.slaveName by _his2 sobbing. _He2's struggling a little, but $activeSlave.slaveName has _him2 pinned to the floor by _his2 wrists, and $activeSlave.slaveName is quickly raping the resistance out of the <<print SlaveTitle($subSlave)>>. +You round a corner and almost trip over <<EventNameLink $activeSlave>>. $He's on top of another slave, humping away; $his <<if $activeSlave.butt > 8>>monstrous, naked ass jiggles lewdly<<elseif $activeSlave.anus > 2>>loose asspussy winks lewdly<<elseif $activeSlave.muscles > 30>>heavily muscled butt flexes powerfully<<elseif $activeSlave.butt > 3>>big butt pumps energetically<<else>>nice little butt flexes cutely<</if>> as $he thrusts. You can't see much of the slave <<if _vaginal>>lying on _his2 back<<else>>face-down<</if>> underneath $activeSlave.slaveName, but you recognize _him2 as <<EventNameLink $subSlave>> by _his2 sobbing. _He2's struggling a little, but $activeSlave.slaveName has _him2 pinned to the floor by _his2 wrists, and $activeSlave.slaveName is quickly raping the resistance out of the <<print SlaveTitle($subSlave)>>. <br><br> $activeSlave.slaveName senses your presence above and behind $him, and twists $his $activeSlave.hColor head around to <<if canSee($activeSlave)>>see who it is. $He sees that it's you<<else>>discern who it is. $He realizes that it's you<</if>>, and greets you cheerfully. "Hi, <<Master>>," $he trills. <<if $activeSlave.fetishKnown && $activeSlave.fetish == "sadist">> @@ -748,7 +748,7 @@ $activeSlave.slaveName senses your presence above and behind $him, and twists $h <</if>> <br><br> <<run Enunciate($subSlave)>> -$subSlave.slaveName <<if _vaginal>>looks out from under $activeSlave.slaveName<<else>>turns _his2 head<</if>> and <<if canSee($subSlave)>>looks at<<else>>faces<</if>> you too. "<<Master $subSlave>>, plea<<s>>e," _he2 begs. "P-plea<<s>>e, make $him <<s>>-<<s>>top — mhhh —" $activeSlave.slaveName shuts _him2 up by <<if _vaginal>>kissing _his2 unwilling mouth<<else>>shoving _his2 face back against the floor<</if>>. Once $he has $subSlave.slaveName back under control, $activeSlave.slaveName slows $his thrusting, reaches around behind $himself, and <<if $activeSlave.vagina != 0 && canDoVaginal($activeSlave)>>spreads $his futa pussy for you.<<else>>pulls one asscheek aside to offer you $his anus. To make the offer extra clear, $he starts winking it lewdly.<</if>> +<<EventNameLink $subSlave>> <<if _vaginal>>looks out from under $activeSlave.slaveName<<else>>turns _his2 head<</if>> and <<if canSee($subSlave)>>looks at<<else>>faces<</if>> you too. "<<Master $subSlave>>, plea<<s>>e," _he2 begs. "P-plea<<s>>e, make $him <<s>>-<<s>>top — mhhh —" $activeSlave.slaveName shuts _him2 up by <<if _vaginal>>kissing _his2 unwilling mouth<<else>>shoving _his2 face back against the floor<</if>>. Once $he has $subSlave.slaveName back under control, $activeSlave.slaveName slows $his thrusting, reaches around behind $himself, and <<if $activeSlave.vagina != 0 && canDoVaginal($activeSlave)>>spreads $his futa pussy for you.<<else>>pulls one asscheek aside to offer you $his anus. To make the offer extra clear, $he starts winking it lewdly.<</if>> <br><br> <<run Enunciate($activeSlave)>> "Plea<<s>>e fuck me while I rape _him2, <<Master>>," $activeSlave.slaveName <<say>>s in a mockery of $subSlave.slaveName's <<if $subSlave.voice > 2>>high-pitched whining<<elseif $subSlave.voice > 1>>begging<<else>>deep-voiced begging<</if>>. "Ooh, or, plea<<s>>e, <<Master>>, may I flip _him2 over? I'd love to feel <<if $PC.dick>>your cock in<<s>>ide _him2 along<<s>>ide mine<<else>>that <<s>>trap-on you u<<s>>e in<<s>>ide _him2 along<<s>>ide my cock<</if>>!" @@ -760,7 +760,7 @@ $subSlave.slaveName <<if _vaginal>>looks out from under $activeSlave.slaveName<< <<set $subSlave.oralCount++, $oralTotal++>> <<set $activeSlave.oralCount++, $oralTotal++>> -Early in the morning, you run across $subSlave.slaveName using one of the penthouse milking machines. This isn't surprising; +Early in the morning, you run across <<EventNameLink $subSlave>> using one of the penthouse milking machines. This isn't surprising; <<if $subSlave.lactation == 0>> _he2's not lactating, but _he2's a good semen producer and when _he2 wakes up, _he2's usually very ready to have one of the machines drain _his2 balls for _him2. <<else>> @@ -831,7 +831,7 @@ Passing the slave quarters late at night, you hear <<EventNameLink $activeSlave> <<elseif $activeSlave.voice < $subSlave.voice>>another, higher, <<else>><<if $activeSlave.voice > 2>>high-pitched<<elseif $activeSlave.voice > 1>>soft<<else>>harsh<</if>> <</if>> -voice. It's $subSlave.slaveName. +voice. It's <<EventNameLink $subSlave>>. <<if $subSlave.belly >= 120000 && $activeSlave.dick > 3>> <<if $subSlave.bellyPreg >= 2000>> "I'm way too pregnant; there'<<s>> ju<<s>>t no room for a big cock like your<<s>> in<<s>>ide me anymore. Plu<<s>> you'll wake them up and they'll be kicking all night again." @@ -945,7 +945,7 @@ $activeSlave.slaveName is almost in tears. <<set _mother = "father">> <<set _mommy = "Daddy">> <</if>> -<<if _meal == "breakfast">>At the beginning<<elseif _meal == "lunch">>At the midpoint<<else>>Near the end<</if>> of $subSlave.slaveName's scheduled day, you come across _him2 curled up in _his2 _mother <<EventNameLink $activeSlave>>'s lap, face buried in $his bosom. $activeSlave.slaveName is running a gentle hand <<if $activeSlave.hLength > 5>>through $subSlave.slaveName's hair<<else>>across $subSlave.slaveName's scalp<</if>>, and is softly <<say>>ing something to _him2. As you approach, you catch the end of it. +<<if _meal == "breakfast">>At the beginning<<elseif _meal == "lunch">>At the midpoint<<else>>Near the end<</if>> of <<EventNameLink $subSlave>>'s scheduled day, you come across _him2 curled up in _his2 _mother <<EventNameLink $activeSlave>>'s lap, face buried in $his bosom. $activeSlave.slaveName is running a gentle hand <<if $activeSlave.hLength > 5>>through $subSlave.slaveName's hair<<else>>across $subSlave.slaveName's scalp<</if>>, and is softly <<say>>ing something to _him2. As you approach, you catch the end of it. <<if $activeSlave.genes == "XX" && $subSlave.tankBaby < 1>> "I mi<<ss>>ed doing thi<<s>> for you <<s>>o much," $he murmurs. "It'<<s>> <<s>>o ni<<c>>e to do it again." <<elseif $activeSlave.genes == "XY">> diff --git a/src/uncategorized/costsReport.tw b/src/uncategorized/costsReport.tw index 71ca5d6988cff83987096d31396ea4d8b39c65b0..b8ab38c174a570accc7e25da2229d0b2ebf6f172 100644 --- a/src/uncategorized/costsReport.tw +++ b/src/uncategorized/costsReport.tw @@ -80,7 +80,7 @@ your personal living expenses are @@.yellowgreen;<<print cashFormat(Math.trunc($ <<set _arcologyCosts += $peacekeepers.undermining>> <</if>> -<<if $SF.Toggle && $SF.Active >= 1 && $SF.Subsidy> > 0>> <<= Count()>> +<<if $SF.Toggle && $SF.Active >= 1 && def $SF.Subsidy>> <<= Count()>> <br>__Financially supporting $SF.Lower until self sufficiency:__ <<print cashFormat(Math.ceil(_SFSubsidy))>> <<set _arcologyCosts += Math.ceil(_SFSubsidy)>> <</if>> diff --git a/src/uncategorized/genericPlotEvents.tw b/src/uncategorized/genericPlotEvents.tw index 4380a19173e268d3061888ae760bd27bc6ca8b35..c5cefdf7c8718fd7d0a15a7a0c220f6e3843733a 100644 --- a/src/uncategorized/genericPlotEvents.tw +++ b/src/uncategorized/genericPlotEvents.tw @@ -880,7 +880,7 @@ A screen opposite your desk springs to life, <<if $assistant == 0>>showing your <<run SetBellySize($slaves[$i])>> <<elseif $slaves[$i].drugs == "breast injections">> <<set $slaves[$i].lactation = 1>> - <<set $activeSlave.lactationDuration = 2>> + <<set $slaves[$i].lactationDuration = 2>> <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> <<set $slaves[$i].hips += 1>> <<set $slaves[$i].butt += 1>> @@ -913,7 +913,7 @@ A screen opposite your desk springs to life, <<if $assistant == 0>>showing your <<run SetBellySize($slaves[$i])>> <<elseif $slaves[$i].drugs == "intensive breast injections">> <<set $slaves[$i].lactation = 1>> - <<set $activeSlave.lactationDuration = 2>> + <<set $slaves[$i].lactationDuration = 2>> <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> <<set $slaves[$i].hips += 1>> <<set $slaves[$i].butt += 1>> @@ -946,7 +946,7 @@ A screen opposite your desk springs to life, <<if $assistant == 0>>showing your <<run SetBellySize($slaves[$i])>> <<elseif $slaves[$i].drugs == "hyper breast injections">> <<set $slaves[$i].lactation = 1>> - <<set $activeSlave.lactationDuration = 2>> + <<set $slaves[$i].lactationDuration = 2>> <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> <<set $slaves[$i].hips += 1>> <<set $slaves[$i].butt += 2>> diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index 4a961fd10b6dfbe556d0879c662d77abf614af35..37d1744c8c0ed4b82be2e8d7322d6a3ce23e8218 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -6675,7 +6675,11 @@ <<set $slaves[$i].boobs -= $slaves[$i].boobsMilk>> <<set $slaves[$i].boobsMilk = 0, $slaves[$i].lactationDuration = 2>> <<else>> - but without regular use, $his lactation finally @@.orange;dries up@@ and $he can be drained without encouraging it. + <<if $slaves[$i].boobsMilk > 0>> + but without regular use, $his lactation finally @@.orange;dries up@@ and $he can be drained without encouraging it. + <<else>> + Without regular use, $his lactation naturally @@.orange;come to an end.@@ + <</if>> <<set $slaves[$i].boobs -= $slaves[$i].boobsMilk>> <<set $slaves[$i].boobsMilk = 0, $slaves[$i].lactation = 0>> <</if>> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 56ed6e7001aae723009d8637d1c325170392b8a3..0bb68500f687419618fa9d61ee2f3538377fa2c1 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -348,11 +348,10 @@ <</if>> <<set _ML = $marrying.length>> <<if (($MixedMarriage == 1 || $cheatMode == 1) && $activeSlave.relationship != 5 && $activeSlave.relationship != -3)>> + <<set _eligible = 1>> <<for _m = 0; _m < _ML; _m++>> <<if $marrying[_m] == $activeSlave.ID>> <<set _eligible = 0>> - <<else>> - <<set _eligible = 1>> <</if>> <</for>> <<if _eligible != 0>> diff --git a/src/uncategorized/storyCaption.tw b/src/uncategorized/storyCaption.tw index c6dc225865c7e81aea363a267210dcc5c6c1ae77..ee53c2e5c8d130c6ffe2c2a629a9be2efba7fe01 100644 --- a/src/uncategorized/storyCaption.tw +++ b/src/uncategorized/storyCaption.tw @@ -830,6 +830,8 @@ <</if>> <<goto _Pass>> <</link>> + <br> + <<link "Dump Game State">><<run App.Debug.dumpGameState()>><</link>> <</if>> <</nobr>>