diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js index e929eb9ebd7322f3c69e04fa9c615dcea9cc6b4f..48afb0e264384a799258f7c6d6c407f9aa80cf84 100644 --- a/js/003-data/policiesData.js +++ b/js/003-data/policiesData.js @@ -714,7 +714,7 @@ App.Data.Policies.Selection = { title: "Physical Retirement Age", get text() { const el = new DocumentFragment; - el.append(`you will set your arcology's standard retirement age for sex slaves once their bodies reach age `); + el.append(`you will replace your arcology's standard age-based retirement policy for one retiring sex slaves once their bodies reach age `); el.append( App.UI.DOM.makeElement( "div", @@ -733,7 +733,7 @@ App.Data.Policies.Selection = { ); return el; }, - get activatedText() { return `you have set your arcology's standard retirement age for sex slaves at ${V.retirementAge}.`; }, + get activatedText() { return `you have set your arcology's standard retirement age for sex slaves at physically ${V.retirementAge}. This policy completely supplants former age retirement policies.`; }, onRepeal: function() { V.retirementAge = 45; }, note: "Set age before implementing" } diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index e76fe673db4cf9b2c559a805cbd37000e8f0dd80..a9fb197bc1f674f40e0a7cde80b7302313689a3d 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "3.5.3", commitHash: null, - release: 1073 + release: 1074 }; diff --git a/src/Mods/SecExp/attackHandler.tw b/src/Mods/SecExp/attackHandler.tw index 21134caec5f9fcd3225674bd20f1628b5d1295bc..11ee23f4ac78843b3b83180baea117a2aeb30e55 100644 --- a/src/Mods/SecExp/attackHandler.tw +++ b/src/Mods/SecExp/attackHandler.tw @@ -84,8 +84,8 @@ <<if $SF.Squad.GunS >= 1>> <<set _defMod += $SF.Squad.GunS * 0.05>> <</if>> - <<if $SF.Squad.Satellite.lv >= 5 && $SF.Squad.Satellite.InOrbit > 0>> - <<set _atkMod += ($SF.Squad.Satellite.lv - 5) * 0.05>> + <<if $SF.Squad.Satellite >= 5 && $SF.SatLaunched > 0>> + <<set _atkMod += ($SF.Squad.Satellite - 5) * 0.05>> <</if>> <<if $SF.Squad.GiantRobot >= 6>> <<set _defMod += ($SF.Squad.GiantRobot - 5) * 0.05>> diff --git a/src/Mods/SecExp/attackReport.tw b/src/Mods/SecExp/attackReport.tw index 65d8d802a2d4f0c708f50762fa4c6a281439adf2..e73de6208a3b6a89bfacdd5c89995bdd80a8f086 100644 --- a/src/Mods/SecExp/attackReport.tw +++ b/src/Mods/SecExp/attackReport.tw @@ -1443,7 +1443,7 @@ <br> <<include "unitsBattleReport">> - <<if $SF.Toggle && $SF.Active >= 1 && ($SF.Squad.Firebase >= 7 || $SF.Squad.GunS >= 1 || $SF.Squad.Satellite.lv >= 5 || $SF.Squad.GiantRobot >= 6 || $SF.Squad.MissileSilo >= 1)>> + <<if $SF.Toggle && $SF.Active >= 1 && ($SF.Squad.Firebase >= 7 || $SF.Squad.GunS >= 1 || $SF.Squad.Satellite >= 5 || $SF.Squad.GiantRobot >= 6 || $SF.Squad.MissileSilo >= 1)>> /* SF upgrades effects */ <br><br> <<if $SF.Squad.Firebase >= 7>> The artillery pieces installed around $SF.Lower's firebase provided vital fire support to the troops in the field. @@ -1451,7 +1451,7 @@ <<if $SF.Squad.GunS >= 1>> The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support. <</if>> - <<if $SF.Squad.Satellite.lv >= 5 && $SF.Squad.Satellite.InOrbit > 0>> + <<if $SF.Squad.Satellite >= 5 && $SF.SatLaunched > 0>> The devastating power of $SF.Lower's satellite was employed with great efficiency against the enemy. <</if>> <<if $SF.Squad.GiantRobot >= 6>> diff --git a/src/Mods/SecExp/authorityReport.tw b/src/Mods/SecExp/authorityReport.tw index 2a243fa2ac115f8a2fff2ca8fc13730bdae55a97..dffcf96963e69d4c96e81183c3ef9937ac835be7 100644 --- a/src/Mods/SecExp/authorityReport.tw +++ b/src/Mods/SecExp/authorityReport.tw @@ -106,9 +106,10 @@ Your authority is <<set _authGrowth += (12 * App.SecExp.battle.activeUnits())>> <</if>> -<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>> +<<set _size = App.SF.upgrades.total()>> +<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>> Having a powerful special force increases your authority. - <<set _authGrowth += ($SF.Size/10)>> + <<set _authGrowth += (_size/10)>> <</if>> <<if $arcologies[0].FSChattelReligionist >= 90>> diff --git a/src/Mods/SecExp/buildings/riotControlCenter.tw b/src/Mods/SecExp/buildings/riotControlCenter.tw index 1f4074f665c266e021bfba72e670b4606285c6fe..0a911347ae58092e021f3e32097594c68ca76d02 100644 --- a/src/Mods/SecExp/buildings/riotControlCenter.tw +++ b/src/Mods/SecExp/buildings/riotControlCenter.tw @@ -203,7 +203,7 @@ The riot control center opens its guarded doors to you. The great chamber inside <</if>> <<if $SF.Toggle && $SF.Active >= 1>> - <<if $SFSupportLevel >= 4 && !$SFGear && $SF.Squad.Armoury >= 8>> <<= App.SF.Count()>> + <<if $SFSupportLevel >= 4 && !$SFGear && $SF.Squad.Armoury >= 8>> <<set _Env = App.SF.env()>> <br> <<link "Give the riot unit access to the combat armor suits of $SF.Lower.""riotControlCenter">> <<set $SFGear = 1,cashX(forceNeg(Math.ceil(500000*_Env*(1.15+($SF.Squad.Armoury/10)))), "capEx")>> <</link>> //Costs <<print cashFormat(Math.ceil(500000*_Env*(1.15+($SF.Squad.Armoury/10))))>> <<else>> diff --git a/src/Mods/SecExp/securityReport.tw b/src/Mods/SecExp/securityReport.tw index e0b14ca2d2db91ce2618025e25639d9c8bc24b37..5b3783426b744e2a6a6a3ae2f096301f60d91484 100644 --- a/src/Mods/SecExp/securityReport.tw +++ b/src/Mods/SecExp/securityReport.tw @@ -352,11 +352,11 @@ Due to the deterioration of the old world countries, organized crime focuses mor <<set $SecExp.core.crimeLow = Math.clamp(_newCrime,0,100)>> <<if $militiaFounded == 1 || App.SecExp.battle.activeUnits() >= 1>> - <br><br> + <br><br> <<set _size = App.SF.upgrades.total()>> <strong> Military</strong>: /* militia */ - <<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>> + <<if $SF.Toggle && $SF.Active >= 1 && _size > 10>> Having a powerful special force attracts a lot of citizens, hopeful that they may be able to fight along side it. - <<set _recruitsMultiplier *= 1 + (random(1, (Math.round($SF.Size / 10))) / 20)>> /* not sure how high $SF.Size goes, so I hope this makes sense */ + <<set _recruitsMultiplier *= 1 + (random(1, (Math.round(_size / 10))) / 20)>> /* not sure how high _size goes, so I hope this makes sense */ <</if>> <<if $SecExp.buildings.propHub.active > 0>> <<if $SecExp.buildings.propHub.campaign >= 1 && $SecExp.buildings.propHub.focus == "recruitment">> @@ -503,9 +503,9 @@ Due to the deterioration of the old world countries, organized crime focuses mor The powerful crime organizations that nested themselves in the arcology have an unending need for cheap guns for hire, many mercenaries flock to your free city in search of employment. <<set _newMercs += random(1,2)>> <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>> + <<if $SF.Toggle && $SF.Active >= 1 && _size > 10>> Having a powerful special force attracts a lot of mercenaries, hopeful that they may be able to fight along side it. - <<set _newMercs += random(1,Math.round($SF.Size/10))>> + <<set _newMercs += random(1,Math.round(_size/10))>> <</if>> <<if $discountMercenaries > 0>> More mercenaries are attracted to your arcology as a result of the reduced rent. diff --git a/src/Mods/SecExp/tradeReport.tw b/src/Mods/SecExp/tradeReport.tw index edb838a44ea94b67e5c18371ce571a078f697f86..d27deed58f3ad89f9816723319a9dd079ac1730a 100644 --- a/src/Mods/SecExp/tradeReport.tw +++ b/src/Mods/SecExp/tradeReport.tw @@ -123,9 +123,10 @@ <</if>> <</if>> -<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>> +<<set _size = App.SF.upgrades.total()>> +<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>> Having a powerful special force increases trade security. - <<set _tradeChange += $SF.Size/10>> + <<set _tradeChange += _size/10>> <</if>> <<if _tradeChange > 0>> diff --git a/src/Mods/SpecialForce/CheatEdit.tw b/src/Mods/SpecialForce/CheatEdit.tw deleted file mode 100644 index f715f7231c124b3e9e3b25d8c9e0c300a4f6ffad..0000000000000000000000000000000000000000 --- a/src/Mods/SpecialForce/CheatEdit.tw +++ /dev/null @@ -1,44 +0,0 @@ -:: CheatEdit [nobr] - -<<set $nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", $returnTo = "Firebase">> -<<= App.SF.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 -<<if $SF.Squad.Firebase >= 2>> - <br>''Drone Bay:'' <<textbox "$SF.Squad.Drones" $SF.Squad.Drones "CheatEdit">>/_DU -<</if>> - -<<if $SF.Squad.Firebase >= 1 && $terrain != "oceanic">> <br><br>''Garage:'' - <br> ''Vehicles:'' - <br> ''Attack:'' <<textbox "$SF.Squad.AV" $SF.Squad.AV "CheatEdit">>/_AVU - <br> ''Transport:'' <<textbox "$SF.Squad.TV" $SF.Squad.TV "CheatEdit">>/_TVU - <<if _T1>> - <br> ''Prototype Goliath Tank:'' <<textbox "$SF.Squad.PGT" $SF.Squad.PGT "CheatEdit">>/_PGTU - <</if>> -<</if>> - -<<if $SF.Squad.Firebase >= 4>> <br><br>''Hangar:'' - <br> ''Aircraft:'' - <br> ''Attack:'' <<textbox "$SF.Squad.AA" $SF.Squad.AA "CheatEdit">>/_AAU - <br> ''Transport:'' <<textbox "$SF.Squad.TA" $SF.Squad.TA "CheatEdit">>/_TAU - <<if _T1>> - <br> ''Spaceplane'': <<textbox "$SF.Squad.SpacePlane" $SF.Squad.SpacePlane "CheatEdit">>/_SPU - <br> ''Gunship:'' <<textbox "$SF.Squad.GunS" $SF.Squad.GunS "CheatEdit">>/_GunSU - <br><br>''Launch Bay:'' - <br> ''Satellite:'' <<textbox "$SF.Squad.Satellite.lv" $SF.Squad.Satellite.lv "CheatEdit">>/_SatU - <<if $terrain != "oceanic">> - <br> ''Giant Robot:'' <<textbox "$SF.Squad.GiantRobot" $SF.Squad.GiantRobot "CheatEdit">>/_GRU - <</if>> - <br> ''Cruise Missile:'' <<textbox "$SF.Squad.MissileSilo" $SF.Squad.MissileSilo "CheatEdit">>/_MSU - <<if $terrain == "oceanic" || $terrain == "marine">> <br><br>''Naval Yard:'' - <br> ''Aircraft Carrier:'' <<textbox "$SF.Squad.AircraftCarrier" $SF.Squad.AircraftCarrier "CheatEdit">>/_ACU - <br> ''Submarine:'' <<textbox "$SF.Squad.Sub" $SF.Squad.Sub "CheatEdit">>/_SubU - <br> ''Amphibious Transport:'' <<textbox "$SF.Squad.HAT" $SF.Squad.HAT "CheatEdit">>/_HATU - <</if>> - <</if>> -<</if>> - -<<if $SF.FS.Tension !== -1>> - <br><br>The Colonel's current Tension: <<textbox "$SF.FS.Tension" $SF.FS.Tension "CheatEdit">> -<</if>> diff --git a/src/Mods/SpecialForce/Firebase.tw b/src/Mods/SpecialForce/Firebase.tw index 05013775d056916af542219e2f2fd2fd8a31d3e2..9e5a96b6d74d621d862326690d9a411187c23bdc 100644 --- a/src/Mods/SpecialForce/Firebase.tw +++ b/src/Mods/SpecialForce/Firebase.tw @@ -1,19 +1,12 @@ :: Firebase [nobr jump-to-safe jump-from-safe] -<<= App.SF.Count()>> +<<set _max = App.SF.upgrades.max(), _Env = App.SF.env(), _size = App.SF.upgrades.total()>> + <<if $SF.FS.Tension > 100>> <<= App.SF.fsIntegration('BadOutcome')>> <<else>> - <<switch _Env>> <<case 4>> - <<set _EnvCash2 = 450,_EnvCash3 = 200,_EnvCash4 = 100,_EnvProsp = 3>> - <<case 3>> - <<set _EnvCash2 = 500,_EnvCash3 = 250,_EnvCash4 = 150,_EnvProsp = 5>> - <<case 2>> - <<set _EnvCash2 = 550,_EnvCash3 = 300,_EnvCash4 = 200,_EnvProsp = 7>> - <</switch>> - <<set $nextButton = "Back", $nextLink = "Main">> - <<if $cheatMode > 0>> [[Cheat edit|CheatEdit][]] <br> <</if>> + <<if $cheatMode > 0 || $debugMode > 0>> [[Edit|editSF][]] <br> <</if>> The firebase of $arcologies[0].name's <<textbox "$SF.Lower" $SF.Lower "Firebase">> is located in the lower levels, occupying unneeded warehouse space. It is not accessible to the general citizenry, but your personal elevator has express service to it. As you step off, two soldiers in combat armor manning the entry checkpoint tense before recognizing their Marshal and stepping aside with a sharp salute.<br> You make your way to the operations center. The Colonel is @@ -29,16 +22,14 @@ <br> <<link "Tour the firebase" "FirebaseTour">> <</link>> <br> - <<if $SF.Size === _max>> - <br>There are no more upgrades available. - <</if>> - <<if $SF.FS.Tension !== -1>> - The Colonel's current Tension: $SF.FS.Tension + <<if _size === _max>> + <br>There are no more upgrades available. <<run delete $SF.Upgrade>> <</if>> + <<if $SF.FS.Tension !== -1>> The Colonel's current Tension: $SF.FS.Tension<</if>> <<run App.UI.tabbar.handlePreSelectedTab($tabChoice.Firebase)>> <div class="tabbar"> - <<if $SF.Size !== _max>> + <<if _size !== _max>> <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Upgrades')" id="tab Upgrades">Upgrades</button> <</if>> <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Actions')" id="tab Actions">Actions</button> @@ -47,7 +38,15 @@ <div id="Upgrades" class="tabcontent"> <div class="content"> - <<include "Upgrades">> + <<set _T1 = App.SF.unlocked.secondTier()>> + Total upgrade progress: <<print App.SF.progress(_size,_max)>> _size/_max(<<print (_size/_max).toFixed(2)*100>>%) <<if _size < 30>> <br>//<<print (30-_size)>> more upgrades is needed until the next tier unlocks.// <</if>> + + <<if $SF.Upgrade > 0>> + <<set _cost = Math.ceil(Math.abs($cash*.05 * (1.25 + (_size/1000))))>> + <br>[[Re-unlock upgrading.|Firebase][$SF.Upgrade = 0,cashX(-(_cost), "specialForces")]] @@.red;<<print cashFormat(_cost)>>@@ + <<elseif _size < 30 || _size !== _max>> + <<include "Upgrades">> + <</if>> </div> </div> @@ -97,18 +96,16 @@ <</if>> <<if $SF.Squad.Firebase > 5 && $secExpEnabled > 0 && $SFSupportLevel >= 4 && App.SecExp.battle.maxUnits() === 18 && App.SecExp.battle.deploySpeed() <= 10>> - <br><br>[[Provide the security force with their own section.|Firebase][$sectionInFirebase = 1, cashX(forceNeg(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env)), "capEx")]] - @@.red;<<print cashFormat(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@ + <br><br>[[Provide the security force with their own section.|Firebase][$sectionInFirebase = 1, cashX(forceNeg(Math.ceil((750000*(1.15+(_size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env)), "capEx")]] + @@.red;<<print cashFormat(Math.ceil((750000*(1.15+(_size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@ <</if>> - <<print App.SF.Interactions()>> + <<= App.SF.Interactions()>> <<include "WC">> </div> </div> <div id="FS" class="tabcontent"> - <div class="content"> - <<= App.SF.fsIntegration()>> - </div> + <div class="content"> <<= App.SF.fsIntegration()>> </div> </div> -<</if>> +<</if>> \ No newline at end of file diff --git a/src/Mods/SpecialForce/FirebaseTour.tw b/src/Mods/SpecialForce/FirebaseTour.tw index e4b7ecb70ca2616c1fa5455a5aec450848a1a281..82125801272756a23aac444b4d1387fd78b6da3b 100644 --- a/src/Mods/SpecialForce/FirebaseTour.tw +++ b/src/Mods/SpecialForce/FirebaseTour.tw @@ -96,16 +96,16 @@ As you approach, The Colonel <<= App.SF.UnitText('drugs')>> <<= App.SF.fsIntegration('OptionsFlavourText',45)>> <<= App.SF.UnitText('UAV')>> <<= App.SF.fsIntegration('OptionsFlavourText',55)>> - <<if _G > 0 && $SF.Squad.Firebase >= 1>> <br><br>''Garage:'' - <<if $SF.Squad.AV+$SF.Squad.TV > 0>> <br> ''Vehicles:'' - <<= App.SF.UnitText('AV')>> <<= App.SF.UnitText('TV')>> - <</if>> - <<= App.SF.UnitText('PGT')>> - <<= App.SF.fsIntegration('OptionsFlavourText',60)>> - <<= App.SF.fsIntegration('OptionsFlavourText',65)>> +<<if App.SF.unlocked.garage()>> <br><br>''Garage:'' + <<if $SF.Squad.AV+$SF.Squad.TV > 0>> <br> ''Vehicles:'' + <<= App.SF.UnitText('AV')>> <<= App.SF.UnitText('TV')>> + <</if>> + <<= App.SF.UnitText('PGT')>> + <<= App.SF.fsIntegration('OptionsFlavourText',60)>> + <<= App.SF.fsIntegration('OptionsFlavourText',65)>> <</if>> -<<if $SF.Squad.Firebase >= 4>> +<<if App.SF.unlocked.hangar()>> <<if _H > 0>> <br><br>''Hangar:'' <<if $SF.Squad.AA+$SF.Squad.TA > 0>> <br> ''Airforce:'' <<= App.SF.UnitText('AA')>> <<= App.SF.UnitText('TA')>> @@ -115,16 +115,16 @@ As you approach, The Colonel <<= App.SF.fsIntegration('OptionsFlavourText',70)>> <<= App.SF.fsIntegration('OptionsFlavourText',75)>> <</if>> -<<if _T1 && _LB> 0>> <br><br>''Launch Bay:'' - <<if $SF.Squad.Satellite.lv > 0>> <<= App.SF.UnitText('sat')>> - <<if $SF.Squad.Satellite.InOrbit < 1>> - <br> [[Launch it into geostationary orbit.|FirebaseTour][$SF.Squad.Satellite.InOrbit = 1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.// +<<if App.SF.unlocked.launchBay()>> <br><br>''Launch Bay:'' + <<if $SF.Squad.Satellite > 0>> <<= App.SF.UnitText('sat')>> + <<if $SF.SatLaunched < 1>> + <br> [[Launch it into geostationary orbit.|FirebaseTour][$SF.SatLaunched = 1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.// <<else>> - <br> [[Recall the satellite.|FirebaseTour][$SF.Squad.Satellite.InOrbit = 0]] + <br> [[Recall the satellite.|FirebaseTour][$SF.SatLaunched = 0]] <</if>> <</if>> <<= App.SF.UnitText('GR')>> <<= App.SF.UnitText('ms')>> <</if>> -<<if _NY > 0>> <br><br>''Naval Yard:'' +<<if App.SF.unlocked.navalYard()>> <br><br>''Naval Yard:'' <<= App.SF.UnitText('AC')>> <<= App.SF.UnitText('Sub')>> <<= App.SF.UnitText('HAT')>> <</if>> \ No newline at end of file diff --git a/src/Mods/SpecialForce/NamingColonel.tw b/src/Mods/SpecialForce/NamingColonel.tw index fe68dc0628e0b16390e6e5454fa9c5a05ef08f6a..b8a735058e6c385ac542daabd4f82c70add2edcc 100644 --- a/src/Mods/SpecialForce/NamingColonel.tw +++ b/src/Mods/SpecialForce/NamingColonel.tw @@ -1,7 +1,7 @@ :: Security Force Naming-Colonel [nobr] <<set $nextButton = " ">> -<<if $SF.IntroProgress < 0>> +<<if $SF.IntroProgress === -1>> <<setNonlocalPronouns $seeDicks>> You instruct $assistant.name 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 _himU under your desk. The unspoken instruction is clear, and _heU begins enthusiastically @@ -23,7 +23,7 @@ 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][$SF.IntroProgress = 1]] -<<elseif $SF.IntroProgress < 2>> +<<elseif $SF.IntroProgress === 1>> 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 === "">> She strikes you as someone who is likely to be: @@ -133,7 +133,10 @@ <br><br> [[Let her leave|Security Force Naming-Colonel][$SF.IntroProgress = 2]] <</if>> -<<elseif $SF.IntroProgress < 3>> <<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">> +<<elseif $SF.IntroProgress === 2>> + <<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">> + <<run delete $SF.IntroProgress>> + 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 $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. @@ -144,4 +147,4 @@ Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arc owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like. <br><br> Talk to you later, boss.// -<</if>> +<</if>> \ No newline at end of file diff --git a/src/Mods/SpecialForce/Proposal.tw b/src/Mods/SpecialForce/Proposal.tw index 934a91b28a292aa6b896a76623d2ac8a927c04b0..b3646d3defd73184a43103477e559824fcf705c9 100644 --- a/src/Mods/SpecialForce/Proposal.tw +++ b/src/Mods/SpecialForce/Proposal.tw @@ -18,4 +18,4 @@ Such a force would solve many problems. More soldiers would mean more control, w <</if>> <br>[[Prepare for an announcement.|Security Force Naming-Colonel][$SF.Active = 1, $SF.IntroProgress = -1, App.SF.Init(), cashX(forceNeg(_price), "specialForces")]] <br> //Initial costs are @@.yellowgreen;<<print cashFormat(_price)>>@@ and upon establishment the force will have significant support costs until it is self-sufficient.// -<br>[[The current measures are enough|RIE Eligibility Check][$SF.Active = 0]] \ No newline at end of file +<br>[[The current measures are enough|RIE Eligibility Check][$SF.Active = 0, delete $SF.IntroProgress]] \ No newline at end of file diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js index 47848580fdb58f9128b59ed9746e71bdd5b740cb..6e9631705647a088540b809c864746b29475c89f 100644 --- a/src/Mods/SpecialForce/SpecialForce.js +++ b/src/Mods/SpecialForce/SpecialForce.js @@ -3,6 +3,160 @@ App.SF.Caps = function() { return capFirstChar(V.SF.Lower || "the special force"); }; +App.SF.weeklyGift = function(input) { + V.SF.Gift = input; + let value, + EnvProsp; + const env = App.SF.env(), + size = App.SF.upgrades.total(); + + switch(input) { + case 1: + value = Math.ceil(25000 * (size/10) * env); + value = (value > 5000 ? value : 5000); + break; + case 2: + value = 50 * (Math.ceil(size * 0.03 * env)); + value = (Number(value) ? value : 500); + break; + case 3: + switch(env) { + case 4: EnvProsp = 3; + case 3: EnvProsp = 5; + case 2: EnvProsp = 7; + } + value = EnvProsp + (Math.ceil(size/100 * env)); + break; + } + return value; +} + +App.SF.unlocked = (function() { + return { + secondTier: secondTier, + garage: garage, + hangar: hangar, + launchBay: launchBay, + navalYard: navalYard + }; + + function secondTier() { + return V.SF.Squad.Firebase + V.SF.Squad.Armoury + V.SF.Squad.Drugs + V.SF.Squad.Drones + + V.SF.Squad.AV + V.SF.Squad.TV + V.SF.Squad.AA + V.SF.Squad.TA >= 30; + } + + function garage(mode = 'standard') { + if (V.SF.Squad.Firebase >= 1 && V.terrain !== "oceanic") { + if (V.SF.Squad.AV + V.SF.Squad.TV + V.SF.Squad.PGT > 0 || mode === 'cheat') { + return true; + } + } + return false; + } + + function hangar(mode = 'standard') { + if (V.SF.Squad.Firebase >= 4) { + if (V.SF.Squad.AA + V.SF.Squad.TA + V.SF.Squad.SpacePlane + V.SF.Squad.GunS > 0 || mode === 'cheat') { + return true; + } + } + return false; + } + + function launchBay(mode = 'standard') { + if (secondTier()) { + if (V.SF.Squad.Satellite + V.SF.Squad.GiantRobot + V.SF.Squad.MissileSilo > 0 || mode === 'cheat') { + return true; + } + } + return false; + } + + function navalYard(mode = 'standard') { + if (secondTier() && (V.terrain === "oceanic" || V.terrain === "marine")) { + if (V.SF.Squad.AircraftCarrier + V.SF.Squad.Sub + V.SF.Squad.HAT > 0 || mode === 'cheat') { + return true; + } + } + return false; + } +})(); + +App.SF.upgrades = (function() { + return { + total: total, + list: list, + max: max, + currentUnitMax: currentUnitMax, + }; + + function total() { + return Object.values(V.SF.Squad).reduce((a,b) => a+b); + } + + function list(completeView = '') { + let array = ['Armoury', 'Firebase', 'Drugs']; + const T1 = App.SF.unlocked.secondTier(); + + if (V.SF.Squad.Firebase >= 2 || completeView === 'all') { + array.push('Drones'); + } + + if (V.terrain !== "oceanic" && (V.SF.Squad.Firebase >= 1 || completeView === 'all')) { // Garage + array.push('AV', 'TV'); + if (completeView === 'all' || T1) { + array.push('PGT'); + } + } + + if (V.SF.Squad.Firebase >= 4 || completeView === 'all') { // Hangar + array.push('AA', 'TA'); + if (completeView === 'all' || T1) { + array.push('SpacePlane', 'GunS'); + } + } + + if (completeView === 'all' || T1) { // Launch Bay + array.push('Satellite'); + if (V.terrain !== "oceanic" && V.terrain !== "marine") { + array.push('GiantRobot', 'MissileSilo'); + } else if (V.terrain === "oceanic" || V.terrain === "marine") { // Naval Yard + array.push('AircraftCarrier', 'Sub', 'HAT'); + } + } + + return array; + } + + function max() { + return list('all').length * 10; + } + + function currentUnitMax(input) { + const T1 = App.SF.unlocked.secondTier(); + + if (T1 === false) { + if (['Armoury', 'Firebase', 'Drugs', 'Drones', 'AV', 'TV', 'AA', 'TA'].includes(input)) { + return 5; + } else { + return 0; + } + } else if (T1 === true) { + if (!['SpacePlane', 'GunS', 'Satellite', 'GiantRobot', 'MissileSilo', 'AircraftCarrier', 'Sub', 'HAT'].includes(input)) { + return 10; + } else { + if (V.PC.skill.warfare >= 75) { + return 10; + } else if (V.PC.skill.warfare >= 50) { + return 9; + } else { + return 8; + } + } + } + } +})(); + App.SF.Init = function() { if (passage() === "init" || passage() === "New Game Plus") { V.SF = {Active: -1, Toggle: 0}; @@ -12,62 +166,54 @@ App.SF.Init = function() { if (V.SF.Toggle && V.SF.Active >= 1) { Object.assign(V.SF, { - UC: {Assign: 0, lock: 0}, - Depravity: 0, - Size: 0, - Upgrade: 0, - Gift: 0, - ROE: "hold", - Target: "recruit", - Regs: "strict", - Lower: "the special force", - ArmySize: 40, - Squad: { - Armoury: 0, - Firebase: 0, - AV: 0, - TV: 0, - Drones: 0, - Drugs: 0, - PGT: 0, - AA: 0, - TA: 0, - SpacePlane: 0, - GunS: 0, - Satellite: { - lv: 0, - InOrbit: 0 + UC: {Assign: 0, lock: 0}, + Depravity: 0, + Size: 0, + Upgrade: 0, + Gift: 0, + ROE: "hold", + Target: "recruit", + Regs: "strict", + Lower: "the special force", + ArmySize: 40, + SatLaunched: 0, + Squad: {}, + Colonel: { + Core: "", + Talk: 0, + Fun: 0, + Status: 0 }, - GiantRobot: 0, - MissileSilo: 0, - AircraftCarrier: 0, - Sub: 0, - HAT: 0 - }, - Colonel: { - Core: "", - Talk: 0, - Fun: 0, - Status: 0 - }, - MercCon: { - History: 0, - CanAttend: 0, - Income: 0, - Revenue: 0, - Mercs: 0, - Menials: 0, - TotalMenials: 0, - TotalMercs: 0 - } + MercCon: { + History: 0, + CanAttend: 0, + Income: 0, + Revenue: 0, + Mercs: 0, + Menials: 0, + TotalMenials: 0, + TotalMercs: 0 + } }); + + for (let i = 0; i < App.SF.upgrades.list('all').length; i++) { + V.SF.Squad[App.SF.upgrades.list('all')[i]] = 0; + } + + const Revivalisms = ['Roman_Revivalism', 'Aztec_Revivalism', 'Egyptian_Revivalism', 'Edo_Revivalism', 'Arabian_Revivalism', 'Chinese_Revivalism', 'Multiculturalism']; + let FS_OPTIONS = ['Repopulation', 'Eugenics', 'Gender_radicalism', 'Gender_traditionalism', 'Paternalism', 'Degradationism', 'Body_Purism', 'Transformation_Fetishism', 'Youth_Preferentialism', 'Maturity_Preferentialism', 'Slimness_Enthusiasm', 'Asset_Expansionism', 'Slave_Pastoralism', 'Physical_Idealism', 'Hedonistic_Decadence', 'Chattel_Religionism']; + FS_OPTIONS = FS_OPTIONS.concat(Revivalisms); + for (let i = 0; i < FS_OPTIONS.length; i++) { + if (V.SF.FS[FS_OPTIONS[i]] === undefined) { + V.SF.FS[FS_OPTIONS[i]] = {lv: 0, vaildOption: 1, gift: 0}; + } + } } // V.arcologies[0].SFRaid = 1; V.arcologies[0].SFRaidTarget = -1; }; /* no-usedOnce */ App.SF.BC = function() { - function InitClean() { delete V.SFMODToggle; delete V.securityForceActive; @@ -149,7 +295,6 @@ App.SF.BC = function() { if (V.SF.Active >= 1) { Object.assign(V.SF, { Depravity: V.securityForceDepravity, - Size: V.SFAO, Upgrade: V.securityForceUpgradeToken, Gift: V.securityForceGiftToken, UC: {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock}, @@ -234,6 +379,8 @@ App.SF.BC = function() { V.SF.ArmySize = V.securityForcePersonnel; + V.SF.SatLaunched = 0; + V.SF.Squad = { Armoury: V.securityForceInfantryPower, Firebase: V.securityForceArcologyUpgrades, @@ -246,7 +393,7 @@ App.SF.BC = function() { TA: V.securityForceAircraftPower, SpacePlane: V.securityForceSpacePlanePower, GunS: V.securityForceAC130, - Satellite: {lv: V.securityForceSatellitePower, InOrbit: 0}, + Satellite: V.securityForceSatellitePower, GiantRobot: V.securityForceGiantRobot, MissileSilo: V.securityForceMissileSilo, AircraftCarrier: V.securityForceAircraftCarrier, @@ -258,10 +405,12 @@ App.SF.BC = function() { App.SF.Init(); } } else if (typeof V.SF === "object") { + V.SF.FS = V.SF.FS || {}; + V.SF.FS.Tension = V.SF.FS.Tension || -1; + if (V.SF.Toggle && V.SF.Active >= 1) { V.SF.UC = V.SF.UC || {}; V.SF.Depravity = V.SF.Depravity || 0; - V.SF.Size = V.SF.Size || 0; V.SF.Upgrade = V.SF.Upgrade || 0; V.SF.Gift = V.SF.Gift || 0; V.SF.UC.Assign = V.SF.UC.Assign || 0; @@ -274,26 +423,11 @@ App.SF.BC = function() { V.SF.ArmySize = V.SF.ArmySize || 40; V.SF.Squad = V.SF.Squad || {}; - V.SF.Squad.Armoury = V.SF.Squad.Armoury || 0; - V.SF.Squad.Firebase = V.SF.Squad.Firebase || 0; - V.SF.Squad.AV = V.SF.Squad.AV || 0; - V.SF.Squad.TV = V.SF.Squad.TV || 0; - V.SF.Squad.Drones = V.SF.Squad.Drones || 0; - V.SF.Squad.Drugs = V.SF.Squad.Drugs || 0; - V.SF.Squad.PGT = V.SF.Squad.PGT || 0; - V.SF.Squad.AA = V.SF.Squad.AA || 0; - V.SF.Squad.TA = V.SF.Squad.TA || 0; - V.SF.Squad.SpacePlane = V.SF.Squad.SpacePlane || 0; - V.SF.Squad.GunS = V.SF.Squad.GunS || 0; - - V.SF.Squad.Satellite = V.SF.Squad.Satellite || {}; - V.SF.Squad.Satellite.lv = V.SF.Squad.Satellite.lv || 0; - V.SF.Squad.Satellite.InOrbit = V.SF.Squad.Satellite.InOrbit || 0; - V.SF.Squad.GiantRobot = V.SF.Squad.GiantRobot || 0; - V.SF.Squad.MissileSilo = V.SF.Squad.MissileSilo || 0; - V.SF.Squad.AircraftCarrier = V.SF.Squad.AircraftCarrier || 0; - V.SF.Squad.Sub = V.SF.Squad.Sub || 0; - V.SF.Squad.HAT = V.SF.Squad.HAT || 0; + for (let i = 0; i < App.SF.upgrades.list('all').length; i++) { + V.SF.Squad[App.SF.upgrades.list('all')[i]] = V.SF.Squad[App.SF.upgrades.list('all')[i]] || 0; + } + + V.SF.SatLaunched = V.SF.SatLaunched || 0; V.SF.Colonel = V.SF.Colonel || {}; V.SF.Colonel.Core = V.SF.Colonel.Core || ""; @@ -313,98 +447,120 @@ App.SF.BC = function() { V.SF.MercCon.Menials = V.SF.MercCon.Menials || 0; V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalMenials || 0; V.SF.MercCon.TotalMercs = V.SF.MercCon.TotalMercs || 0; - } - } - delete V.SF.tour; delete V.SF.Caps; - if (_.get(V.SF, 'FS.upgrade')) { - delete V.SF.FS.upgrade; - } + if (typeof V.SF.Squad.Satellite === "object") { + if (V.SF.Squad.Satellite.InOrbit > 0) { + V.SF.SatLaunched = V.SF.Squad.Satellite.InOrbit; delete V.SF.Squad.Satellite.InOrbit; + } + V.SF.Squad.Satellite = V.SF.Squad.Satellite.lv; + } - if (jsDef(V.SF.Squad) && jsDef(V.SF.Squad.Troops)) { - V.SF.ArmySize = V.SF.Squad.Troops; - delete V.SF.Squad.Troops; - } + delete V.SF.FS.upgrade; delete V.SF.UC.num; - if (V.SF.MercCon !== undefined) { - if( V.SF.MercCon.View !== undefined) { - delete V.SF.MercCon.View; - } - if (V.SF.MercCon.Helots !== undefined) { - V.SF.MercCon.Menials = V.SF.MercCon.Helots; - delete V.SF.MercCon.Helots; - } - if (V.SF.MercCon.TotalHelots !== undefined) { - V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots; - delete V.SF.MercCon.TotalHelots; - } - } + if (jsDef(V.choice)) { + V.SF.Gift = V.choice; + } - if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) { - V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock}; - } - delete V.SF.SpecOps; - delete V.SF.SpecOpsLock; - if (V.SFUC !== undefined) { - V.SF.UC.num = V.SFUC || 0; + if (V.Tour !== undefined) { + V.SF.tour = V.Tour || 0; + } + + if (V.SF.Squad.Troops) { + V.SF.ArmySize = V.SF.Squad.Troops; + delete V.SF.Squad.Troops; + } + + if (V.SF.MercCon !== undefined) { + if( V.SF.MercCon.View !== undefined) { + delete V.SF.MercCon.View; + } + if (V.SF.MercCon.Helots !== undefined) { + V.SF.MercCon.Menials = V.SF.MercCon.Helots; + delete V.SF.MercCon.Helots; + } + if (V.SF.MercCon.TotalHelots !== undefined) { + V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots; + delete V.SF.MercCon.TotalHelots; + } + } + + if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) { + V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock}; + } + + if (V.SFUC !== undefined) { + V.SF.UC.num = V.SFUC || 0; + } + + if (V.SpecOpsLock !== undefined) { + V.SF.SpecOpsLock = V.SpecOpsLock; + } + + if (V.SF.U !== undefined) { + V.SF.Upgrade = V.SF.U || 0; + } + + if (V.SF.WG !== undefined) { + V.SF.Gift = V.SF.WG || 0; + } + + if (V.SF.Depravity < 0) { + V.SF.Depravity = 0; + } + + if (V.SFUnit !== undefined) { + if (V.SFUnit.AT !== undefined) { + V.SFUnitTA = 0; + } + if (V.SFTradeShow !== undefined) { + V.SF.MercCon = V.SFTradeShow; + } + delete V.SFTradeShow; + if (V.SFColonel !== undefined) { + V.SF.Colonel = V.SFColonel; + } + + if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) { + V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched}; + V.SF.Squad.Satellite = V.SF.Squad.Sat; + delete V.SF.Squad.Sat; + delete V.SatLaunched; + } + } + } // closes: V.SF.Toggle && V.SF.Active >= 1 } - delete V.SFUC; - if (V.SF.MWU !== undefined) { - delete V.SF.MWU; + delete V.Tour; delete V.SFColonel; delete V.SFUnit; + delete V.SF.tour; delete V.SF.Caps; delete V.SF.Size; delete V.choice; + delete V.SF.Units; delete V.SpecOpsLock; delete V.SF.U; delete V.SF.WG; + delete V.SF.Subsidy; delete V.SF.SpecOps; delete V.SF.SpecOpsLock; delete V.SFUC; + + if (V.SF.BadOutcome !== undefined) { + delete V.SF.BadOutcome; } - if (V.SpecOpsLock !== undefined) { - V.SF.SpecOpsLock = V.SpecOpsLock; + if (V.arcologies[0].SFRaid !== undefined) { + delete V.arcologies[0].SFRaid; } - delete V.SpecOpsLock; - if (V.SF.U !== undefined) { - V.SF.Upgrade = V.SF.U || 0; + if (V.arcologies[0].SFRaidTarget !== undefined) { + delete V.arcologies[0].SFRaidTarget; } - delete V.SF.U; - if (V.SF.WG !== undefined) { - V.SF.Gift = V.SF.WG || 0; + if (V.SF.Facility !== undefined) { + delete V.SF.Facility; } - delete V.SF.WG; + if (V.SF.MWU !== undefined) { + delete V.SF.MWU; + } if (V.SF.Bonus !== undefined) { delete V.SF.Bonus; } - if (V.SF.Depravity < 0) { - V.SF.Depravity = 0; - } - if (V.SF.Units !== undefined) { - V.SF.Size = V.SF.Units; - } - delete V.SF.Units; - if (V.SFUnit !== undefined) { - if (V.SFUnit.AT !== undefined) { - V.SFUnitTA = 0; - } - if (V.SFTradeShow !== undefined) { - V.SF.MercCon = V.SFTradeShow; - } - delete V.SFTradeShow; - if (V.SFColonel !== undefined) { - V.SF.Colonel = V.SFColonel; - } - delete V.SFColonel; - if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) { - V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched}; - V.SF.Squad.Satellite = V.SF.Squad.Sat; - delete V.SF.Squad.Sat; - delete V.SatLaunched; - delete V.SFUnit; - } - } + InitClean(); MainClean(); ColonelClean(); TradeShowClean(); UnitsClean(); - delete V.SF.Subsidy; - if (jsDef(V.SF.UC)) { - delete V.SF.UC.num; - } + if (V.week < 72 && V.SF.Active !== -1) { V.SF.Active = -1; } }; /* usedOnce */ @@ -2280,7 +2436,6 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100) { Active: -2, Toggle: V.SF.Toggle, ArmySize: V.SF.ArmySize, - Size: V.SF.Size, FS: { Tension: V.SF.FS.Tension, BadOutcome: BadOutcome @@ -2307,10 +2462,10 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100) { App.SF.AAR = function(endWeekCall = 1) { const - T = State.temporary, S = V.SF.Squad, target = 50000, - baseLine = 5000; + baseLine = 5000, + size = App.SF.upgrades.total(); let profit = 0, upkeep = 0, income = 0, @@ -2337,10 +2492,9 @@ App.SF.AAR = function(endWeekCall = 1) { unitCap = 2500, Trade = 0.025; let cost = {a: 0.01, b: 2.5}, - NO = 1 + (V.SF.Size / 5), - N1 = 1 + (V.SF.Size / 5); + NO = 1 + (size / 5), + N1 = 1 + (size / 5); - App.SF.Count(); let SFD = V.SF.Depravity; if (profit < 1) { cost.a = 10; @@ -2371,7 +2525,7 @@ App.SF.AAR = function(endWeekCall = 1) { upkeep += (V.SF.ArmySize * 25) / cost.a; if (V.secExpEnabled > 0 && endWeekCall > 0) { V.SecExp.core.authority += 25 * (Math.ceil(V.SF.ArmySize / 200)); - V.SecExp.core.authority += V.SF.Size * 10; + V.SecExp.core.authority += size * 10; V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000); } } @@ -2561,7 +2715,7 @@ App.SF.AAR = function(endWeekCall = 1) { } } - income += ((baseLine * (1 + Multiplier.troop / NO).toFixed(2) * (1 + Multiplier.unit / NO).toFixed(2) * (1 + Multiplier.action / NO).toFixed(2) * (1 + Multiplier.depravity / NO).toFixed(2)) - (upkeep * N1).toFixed(2)) / ((V.SF.Size / 2 + V.SF.ArmySize / 2) * 5); + income += ((baseLine * (1 + Multiplier.troop / NO).toFixed(2) * (1 + Multiplier.unit / NO).toFixed(2) * (1 + Multiplier.action / NO).toFixed(2) * (1 + Multiplier.depravity / NO).toFixed(2)) - (upkeep * N1).toFixed(2)) / ((size / 2 + V.SF.ArmySize / 2) * 5); if (V.SF.Target === "raiding") { income *= 1.25; } else { @@ -2663,7 +2817,7 @@ App.SF.AAR = function(endWeekCall = 1) { menialGiftsPerAttendee = 5, NewMercs = 0; let menialGifts = Math.ceil(jsRandom(1, ((tradeShowAttendes * menialGiftsPerAttendee) / 10))); - let TSProfit = Math.ceil(500000 * (1 + (V.SF.Size / 1000)) * (1 + (V.arcologies[0].prosperity / 1000)) * T.Env); + let TSProfit = Math.ceil(500000 * (1 + (size / 1000)) * (1 + (V.arcologies[0].prosperity / 1000)) * App.SF.env()); V.SF.MercCon.Menials += menialGifts; V.SF.MercCon.TotalMenials += menialGifts; @@ -2692,157 +2846,20 @@ App.SF.AAR = function(endWeekCall = 1) { } }; -App.SF.Count = function() { - const - T = State.temporary, - C = Math.clamp, // sure that's correct? // Yes it works as intended. - S = V.SF.Squad, - E = V.economy; - T.FU = 10; - S.Firebase = C(S.Firebase, 0, T.FU); - T.AU = 10; - S.Armoury = C(S.Armoury, 0, T.AU); - T.DrugsU = 10; - S.Drugs = C(S.Drugs, 0, T.DrugsU); - T.DU = 10; - S.Drones = C(S.Drones, 0, T.DU); - T.AVU = 10; - S.AV = C(S.AV, 0, T.AVU); - T.TVU = 10; - S.TV = C(S.TV, 0, T.TVU); - T.AAU = 10; - S.AA = C(S.AA, 0, T.AAU); - T.TAU = 10; - S.TA = C(S.TA, 0, T.TAU); - - if (V.PC.skill.warfare >= 75) { - T.PGTU = 10; - T.SPU = 10; - T.GunSU = 10; - T.SatU = 10; - T.GRU = 10; - T.MSU = 10; - T.ACU = 10; - T.SubU = 10; - T.HATU = 10; - } else if (V.PC.skill.warfare >= 50) { - T.PGTU = 9; - T.SPU = 9; - T.GunSU = 9; - T.SatU = 9; - T.GRU = 9; - T.MSU = 9; - T.ACU = 9; - T.SubU = 9; - T.HATU = 9; - } else { - T.PGTU = 8; - T.SPU = 8; - T.GunSU = 8; - T.SatU = 8; - T.GRU = 8; - T.MSU = 8; - T.ACU = 8; - T.SubU = 8; - T.HATU = 8; - } - - S.PGT = C(S.PGT, 0, T.PGTU); - S.SpacePlane = C(S.SpacePlane, 0, T.SPU); - S.GunS = C(S.GunS, 0, T.GunSU); - S.Satellite.lv = C(S.Satellite.lv, 0, T.SatU); - S.GiantRobot = C(S.GiantRobot, 0, T.GRU); - S.MissileSilo = C(S.MissileSilo, 0, T.MSU); - S.AircraftCarrier = C(S.AircraftCarrier, 0, T.ACU); - S.Sub = C(S.Sub, 0, T.SubU); - S.HAT = C(S.HAT, 0, T.HATU); - T.GU = T.AVU + T.TVU + T.PGTU; - T.G = S.AV + S.TV + S.PGT; - T.H = S.AA + S.TA + S.SpacePlane + S.GunS; - T.HU = T.AAU + T.TAU + T.SPU + T.GunSU; - T.LBU = T.SatU + T.MSU; - T.LB = S.Satellite.lv + S.MissileSilo; - T.Base = S.Firebase + S.Armoury + S.Drugs + S.Drones + T.H; - T.max = T.FU + T.AU + T.DrugsU + T.DU + T.HU; - // if (V.SF.Facility.Toggle > 0) T.Base + = 1; T.max + = 1; - - if (V.terrain !== "oceanic" && V.terrain !== "marine") { - T.LBU += T.GRU; - T.LB += S.GiantRobot; - T.Base += T.G; - T.max += T.GU; - 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); - T.T1 = 0; - - if (V.SF.FS.Tension === -1) { - const Revivalisms = ['Roman_Revivalism', 'Aztec_Revivalism', 'Egyptian_Revivalism', 'Edo_Revivalism', 'Arabian_Revivalism', 'Chinese_Revivalism', 'Multiculturalism']; - let FS_OPTIONS = ['Repopulation', 'Eugenics', 'Gender_radicalism', 'Gender_traditionalism', 'Paternalism', 'Degradationism', 'Body_Purism', 'Transformation_Fetishism', 'Youth_Preferentialism', 'Maturity_Preferentialism', 'Slimness_Enthusiasm', 'Asset_Expansionism', 'Slave_Pastoralism', 'Physical_Idealism', 'Hedonistic_Decadence', 'Chattel_Religionism']; - FS_OPTIONS = FS_OPTIONS.concat(Revivalisms); - for (let i = 0; i < FS_OPTIONS.length; i++) { - if (V.SF.FS[FS_OPTIONS[i]] === undefined) { - V.SF.FS[FS_OPTIONS[i]] = {lv: 0, vaildOption: 1, gift: 0}; - } - } - } - - if (E > 100) { - T.Env = 4; - } else if (E > 67) { - T.Env = 3; +App.SF.env = function() { + if (V.economy > 100) { + return 4; + } else if (V.economy > 67) { + return 3; } else { - T.Env = 2; - } - - if (V.SF.Size >= 30) { - T.T1 = 1; - } - - if (V.SF.IntroProgress > -1) { - delete V.SF.IntroProgress; - } - - if (V.SF.Size === T.max) { - delete V.SF.Upgrade; - } - - if (V.SF.BadOutcome !== undefined) { - delete V.SF.BadOutcome; - } - - if (V.Tour !== undefined) { - V.SF.tour = V.Tour || 0; - delete V.Tour; - } - V.SF.tour = V.SF.tour || 0; - - if (V.arcologies[0].SFRaid !== undefined) { - delete V.arcologies[0].SFRaid; - } - - if (V.arcologies[0].SFRaidTarget !== undefined) { - delete V.arcologies[0].SFRaidTarget; - } - - if (V.SF.Facility !== undefined) { - delete V.SF.Facility; + return 2; } }; App.SF.UpgradeCost = function(cost, unit) { "use strict"; - const - T = State.temporary, - S = V.SF.Squad; - let value = cost * T.Env * (1.15 + (V.SF.Size / 10)) * (1.15 + (unit / 100)); + const S = V.SF.Squad; + let value = cost * App.SF.env() * (1.15 + (App.SF.upgrades.total() / 10)) * (1.15 + (unit / 100)); if ([S.AircraftCarrier, S.Drones, S.GiantRobot, S.GunS, S.MissileSilo, S.Satellite.lv, S.SpacePlane, S.Sub].includes(unit)) { value *= V.HackingSkillMultiplier; } @@ -2855,7 +2872,7 @@ App.SF.progress = function(x, max) { z, i; if (max === undefined) { Math.clamp(x, 0, 10); - if (V.SF.Size < 30) { + if (App.SF.unlocked.secondTier() === false) { z = 5 - x; for (i = 0; i < x; i++) { out += `â–ˆâ`; @@ -2912,17 +2929,17 @@ App.SF.Interactions = function() { const C = V.SF.Colonel; if (V.SF.Gift > 0) { - if (V.choice === 1) { + if (V.SF.Gift === 1) { choice += `${App.SF.Caps()} is turning over spare capital in tribute this week. `; if (C.Talk + C.Fun !== 1) { - choice += `"I think I can find <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> for you, boss."`; + choice += `"I think I can find <span class='yellowgreen'>${cashFormat(App.SF.weeklyGift(1))}</span> for you, boss."`; } - } else if (V.choice === 2) { + } else if (V.SF.Gift === 2) { choice += `${App.SF.Caps()} will be throwing a military parade this week. `; if (C.Talk + C.Fun !== 1) { choice += `"I expect the <span class='green'>public to enjoy</span> the parade, boss."`; } - } else if (V.choice === 3) { + } else if (V.SF.Gift === 3) { choice += `${App.SF.Caps()} will be conducting corporate sabotage on rival arcologies' businesses. `; if (C.Talk + C.Fun !== 1) { choice += `"Our interests should see a <span class='yellowgreen'>big boost,</span> boss."`; @@ -3136,19 +3153,19 @@ App.SF.UnitText = function(input) { let loc2 = ``; if (V.week % 6 === 0) { - loc2 += `is`; - if (input !== 'HAT') { - loc2 += ` moored to`; - } else { - loc2 += ` parked on`; - } - loc2 += ` the pier in the Naval Yard`; - if (input === 'HAT') { - loc2 += `, ready to ferry ${tons} tons of soldiers and vehicles`; - } + loc2 += `is`; + if (input !== 'HAT') { + loc2 += ` moored to`; } else { - loc2 += `is patrolling the waters near ${V.arcologies[0].name}`; + loc2 += ` parked on`; + } + loc2 += ` the pier in the Naval Yard`; + if (input === 'HAT') { + loc2 += `, ready to ferry ${tons} tons of soldiers and vehicles`; } + } else { + loc2 += `is patrolling the waters near ${V.arcologies[0].name}`; + } switch (input) { case 'firebase': if (S.Firebase >= 0) { @@ -3598,7 +3615,7 @@ App.SF.UnitText = function(input) { if (S.Satellite.lv >= 1) { const text12 = `<br> <b>Satellite:</b>`; if (S.Satellite.lv >= 2) { - if (V.SF.Squad.Satellite.InOrbit < 1) { + if (V.SF.SatLaunched === 0) { loc1 = `The satellite is being worked on in the Launch Bay.`; } else { loc1 = `The satellite is in geosynchronous orbit, far above the arcology.`; diff --git a/src/Mods/SpecialForce/Upgrades.tw b/src/Mods/SpecialForce/Upgrades.tw index 93144aef4a84b4581149c4e5626e306dc542bcc3..539360722e394426fea40ade9708c406d31a3b4b 100644 --- a/src/Mods/SpecialForce/Upgrades.tw +++ b/src/Mods/SpecialForce/Upgrades.tw @@ -1,272 +1,278 @@ :: Upgrades [nobr] -<br><br> -Total upgrade progress: <<print App.SF.progress($SF.Size,_max)>> $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)*100>>%) <<if $SF.Size < 30>> <br>//<<print (30-$SF.Size)>> more upgrades is needed until the next tier unlocks.// <</if>> +<br>Which facility or equipment do you wish to upgrade this week? <br> -<<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(-(_cost), "specialForces")]] @@.red;<<print cashFormat(_cost)>>@@ +<<set _FU = App.SF.upgrades.currentUnitMax('Firebase')>> +<<if $SF.Squad.Firebase < _FU>> + <<set _cF = App.SF.UpgradeCost(100000,$SF.Squad.Firebase)>> + <<if $cash >= _cF>> <br> + [[Upgrade Firebase|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Firebase++, cashX(-(_cF), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Firebase.// + <</if>> + //Costs @@.red;<<print cashFormat(_cF)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Firebase)>> </span> <br> +<<elseif $SF.Squad.Firebase === _FU>> + //The Firebase has been fully upgraded.// <br> <</if>> -<<if ($SF.Size < 30 || $SF.Size !== _max) && $SF.Upgrade < 1>> -<br>Which facility or equipment do you wish to upgrade this week? <br> +<<set _AU = App.SF.upgrades.currentUnitMax('Armoury')>> +<<if $SF.Squad.Armoury < _AU>> + <<set _cA = App.SF.UpgradeCost(40000,$SF.Squad.Armoury)>> + <<if $cash >= _cA>> + [[Upgrade Armory|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Armoury++, cashX(-(_cA), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Armory.// + <</if>> + //Costs @@.red;<<print cashFormat(_cA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Armoury)>> </span> <br> +<<elseif $SF.Squad.Armoury === _AU>> + //The Armory has been fully upgraded.// <br> +<</if>> - <<if $SF.Squad.Firebase < 5||_T1 && $SF.Squad.Firebase < _FU>> - <<set _cF = App.SF.UpgradeCost(100000,$SF.Squad.Firebase)>> - <<if $cash >= _cF>> <br> - [[Upgrade Firebase|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Firebase++, cashX(-(_cF), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Firebase.// - <</if>> - //Costs @@.red;<<print cashFormat(_cF)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Firebase)>> </span> <br> - <<elseif $SF.Squad.Firebase === _FU>> - //The Firebase has been fully upgraded.// <br> +<<set _DrugsU = App.SF.upgrades.currentUnitMax('Drugs')>> +<<if $SF.Squad.Drugs < _DrugsU>> + <<set _cDrugs = App.SF.UpgradeCost(40000,$SF.Squad.Drugs)>> + <<if $cash >= _cDrugs>> + [[Upgrade Drug Lab|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drugs++, cashX(-(_cDrugs), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Drug Lab.// <</if>> + //Costs @@.red;<<print cashFormat(_cDrugs)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drugs)>> </span> <br> +<<elseif $SF.Squad.Drugs === _DrugsU>> + //The Drug Lab has been fully upgraded.// <br> +<</if>> - <<if $SF.Squad.Armoury < 5||_T1 && $SF.Squad.Armoury < _AU>> - <<set _cA = App.SF.UpgradeCost(40000,$SF.Squad.Armoury)>> - <<if $cash >= _cA>> - [[Upgrade Armory|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Armoury++, cashX(-(_cA), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Armory.// - <</if>> - //Costs @@.red;<<print cashFormat(_cA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Armoury)>> </span> <br> - <<elseif $SF.Squad.Armoury === _AU>> - //The Armory has been fully upgraded.// <br> +<<set _DU = App.SF.upgrades.currentUnitMax('Drones')>> +<<if $SF.Squad.Firebase >= 2 && $SF.Squad.Drones < _DU>> + <<set _cDrones = App.SF.UpgradeCost(45000,$SF.Squad.Drones)>> + <<if $cash >= _cDrones>> + [[Upgrade Drone Bay|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drones++, cashX(-(_cDrones), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Drone Bay.// <</if>> + //Costs @@.red;<<print cashFormat(_cDrones)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drones)>> </span> <br> +<<elseif $SF.Squad.Drones === _DU>> + //The Drone Bay has been fully upgraded.// <br> +<</if>> - <<if $SF.Squad.Drugs < 5||_T1 && $SF.Squad.Drugs < _DrugsU>> - <<set _cDrugs = App.SF.UpgradeCost(40000,$SF.Squad.Drugs)>> - <<if $cash >= _cDrugs>> - [[Upgrade Drug Lab|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drugs++, cashX(-(_cDrugs), "specialForces")]] +<<if App.SF.unlocked.garage()>> <br>''Garage''<br> + <div style="margin-left:2em"> + <<set _AVU = App.SF.upgrades.currentUnitMax('AV')>> + <<if $SF.Squad.AV < _AVU>> + <<set _cAV = App.SF.UpgradeCost(60000,$SF.Squad.AV)>> + <<if $cash >= _cAV>> + [[Upgrade Attack Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AV++, cashX(-(_cAV), "specialForces")]] <<else>> - //Cannot afford to upgrade the Drug Lab.// + //Cannot afford to upgrade the Attack Vehicle Fleet.// <</if>> - //Costs @@.red;<<print cashFormat(_cDrugs)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drugs)>> </span> <br> - <<elseif $SF.Squad.Drugs === _DrugsU>> - //The Drug Lab has been fully upgraded.// <br> + //Costs @@.red;<<print cashFormat(_cAV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AV)>> </span> <br> + <<elseif $SF.Squad.AV === _AVU>> + //The Attack Vehicle Fleet has been fully upgraded.// <br> <</if>> + </div> - <<if $SF.Squad.Firebase >= 2 && ($SF.Squad.Drones < 5 ||_T1 && $SF.Squad.Drones < _DU)>> - <<set _cDrones = App.SF.UpgradeCost(45000,$SF.Squad.Drones)>> - <<if $cash >= _cDrones>> - [[Upgrade Drone Bay|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drones++, cashX(-(_cDrones), "specialForces")]] + <div style="margin-left:2em"> + <<set _TVU = App.SF.upgrades.currentUnitMax('TV')>> + <<if $SF.Squad.TV < _TVU>> + <<set _cTV = App.SF.UpgradeCost(60000,$SF.Squad.TV)>> + <<if $cash >= _cTV>> + [[Upgrade Transport Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TV++, cashX(-(_cTV), "specialForces")]] <<else>> - //Cannot afford to upgrade the Drone Bay.// + //Cannot afford to upgrade Transport Vehicle Fleet.// <</if>> - //Costs @@.red;<<print cashFormat(_cDrones)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drones)>> </span> <br> - <<elseif $SF.Squad.Drones === _DU>> - //The Drone Bay has been fully upgraded.// <br> + //Costs @@.red;<<print cashFormat(_cTV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TV)>> </span> <br> + <<elseif $SF.Squad.TV === _TVU>> + //The Transport Vehicle Fleet has been fully upgraded.// <br> <</if>> + </div> - <<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 = App.SF.UpgradeCost(60000,$SF.Squad.AV)>> - <<if $cash >= _cAV>> - [[Upgrade Attack Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AV++, cashX(-(_cAV), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Attack Vehicle Fleet.// - <</if>> - //Costs @@.red;<<print cashFormat(_cAV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AV)>> </span> <br> - <<elseif $SF.Squad.AV === _AVU>> - //The Attack Vehicle Fleet has been fully upgraded.// <br> + <div style="margin-left:2em"> + <<set _PGTU = App.SF.upgrades.currentUnitMax('PGT')>> + <<if $SF.Squad.PGT < _PGTU>> + <<set _cPGT = App.SF.UpgradeCost(735000,$SF.Squad.PGT)>> + <<if $cash >= _cPGT>> + [[Upgrade Prototype Goliath tank|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.PGT++, cashX(-(_cPGT), "specialForces")]] + <<else>> + //Cannot afford to upgrade Prototype Goliath Tank.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cPGT)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br> + <<elseif $SF.Squad.PGT === _PGTU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br> + <<elseif $SF.Squad.PGT === _PGTU>> + //The Prototype Goliath Tank has been fully upgraded.// <br> + <</if>> + </div> +<</if>> /*Closes garage.*/ - <div style="margin-left:2em"> - <<if ($SF.Squad.TV < 5||_T1 && $SF.Squad.TV < _TVU)>> - <<set _cTV = App.SF.UpgradeCost(60000,$SF.Squad.TV)>> - <<if $cash >= _cTV>> - [[Upgrade Transport Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TV++, cashX(-(_cTV), "specialForces")]] - <<else>> - //Cannot afford to upgrade Transport Vehicle Fleet.// - <</if>> - //Costs @@.red;<<print cashFormat(_cTV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TV)>> </span> <br> - <<elseif $SF.Squad.TV === _TVU>> - //The Transport Vehicle Fleet has been fully upgraded.// <br> +<<if App.SF.unlocked.hangar()>>''Hangar''<br> + <div style="margin-left:2em"> + <<set _AAU = App.SF.upgrades.currentUnitMax('AA')>> + <<if $SF.Squad.AA < _AAU>> + <<set _cAA = App.SF.UpgradeCost(70000,$SF.Squad.AA)>> + <<if $cash >= _cAA>> + [[Upgrade Attack Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AA++, cashX(-(_cAA), "specialForces")]] + <<else>> + //Cannot afford to upgrade Attack Aircraft Fleet.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cAA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AA)>> </span> <br> + <<elseif $SF.Squad.AA === _AAU>> + //The Attack Aircraft Fleet has been fully upgraded.// <br> + <</if>> + </div> - <div style="margin-left:2em"> - <<if _T1 && $SF.Squad.PGT < _PGTU>> - <<set _cPGT = App.SF.UpgradeCost(735000,$SF.Squad.PGT)>> - <<if $cash >= _cPGT>> - [[Upgrade Prototype Goliath tank|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.PGT++, cashX(-(_cPGT), "specialForces")]] - <<else>> - //Cannot afford to upgrade Prototype Goliath Tank.// - <</if>> - //Costs @@.red;<<print cashFormat(_cPGT)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br> - <<elseif $SF.Squad.PGT === _PGTU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br> - <<elseif $SF.Squad.PGT === _PGTU>> - //The Prototype Goliath Tank has been fully upgraded.// <br> + <div style="margin-left:2em"> + <<set _TAU = App.SF.upgrades.currentUnitMax('TA')>> + <<if $SF.Squad.TA < _TAU>> + <<set _cTA = App.SF.UpgradeCost(70000,$SF.Squad.TA)>> + <<if $cash >= _cTA>> + [[Upgrade Transport Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TA++, cashX(-(_cTA), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Transport Aircraft Fleet.// <</if>> - </div> - <</if>> /*Closes garage.*/ + //Costs @@.red;<<print cashFormat(_cTA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TA)>> </span> <br> + <<elseif $SF.Squad.TA === _TAU>> + //The Transport Aircraft Fleet has been fully upgraded.// <br> + <</if>> + </div> - <<if $SF.Squad.Firebase >= 4>>''Hangar''<br> - <div style="margin-left:2em"> - <<if $SF.Squad.AA < 5||_T1 && $SF.Squad.AA < _AAU>> - <<set _cAA = App.SF.UpgradeCost(70000,$SF.Squad.AA)>> - <<if $cash >= _cAA>> - [[Upgrade Attack Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AA++, cashX(-(_cAA), "specialForces")]] - <<else>> - //Cannot afford to upgrade Attack Aircraft Fleet.// - <</if>> - //Costs @@.red;<<print cashFormat(_cAA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AA)>> </span> <br> - <<elseif $SF.Squad.AA === _AAU>> - //The Attack Aircraft Fleet has been fully upgraded.// <br> + <div style="margin-left:2em"> + <<set _SPU = App.SF.upgrades.currentUnitMax('SpacePlane')>> + <<if $SF.Squad.SpacePlane < _SPU>> + <<set _cSP = App.SF.UpgradeCost(250000,$SF.Squad.SpacePlane)>> + <<if $cash >= _cSP>> + [[Upgrade Spaceplane|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.SpacePlane++, cashX(-(_cSP), "specialForces")]] + <<else>> + //Cannot afford to upgrade the Spaceplane.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cSP)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br> + <<elseif $SF.Squad.SpacePlane === _SPU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br> + <<elseif $SF.Squad.SpacePlane === _SPU>> + //The Spaceplane has been fully upgraded.// <br> + <</if>> + </div> - <div style="margin-left:2em"> - <<if $SF.Squad.TA < 5||_T1 && $SF.Squad.TA < _TAU>> - <<set _cTA = App.SF.UpgradeCost(70000,$SF.Squad.TA)>> - <<if $cash >= _cTA>> - [[Upgrade Transport Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TA++, cashX(-(_cTA), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Transport Aircraft Fleet.// - <</if>> - //Costs @@.red;<<print cashFormat(_cTA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TA)>> </span> <br> - <<elseif $SF.Squad.TA === _TAU>> - //The Transport Aircraft Fleet has been fully upgraded.// <br> + <div style="margin-left:2em"> + <<set _GunSU = App.SF.upgrades.currentUnitMax('GunS')>> + <<if $SF.Squad.GunS < _GunSU>> + <<set _cGunS = App.SF.UpgradeCost(350000,$SF.Squad.GunS)>> + <<if $cash >= _cGunS>> + [[Upgrade Gunship|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GunS++, cashX(-(_cGunS), "specialForces")]] + <<else>> + //Cannot afford to upgrade Gunship.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cGunS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br> + <<elseif $SF.Squad.GunS === _GunSU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br> + <<elseif $SF.Squad.GunS === _GunSU>> + //The Gunship has been fully upgraded.// <br> + <</if>> + </div> +<</if>> /*Closes hangar.*/ - <div style="margin-left:2em"> - <<if _T1 && $SF.Squad.SpacePlane < _SPU>> - <<set _cSP = App.SF.UpgradeCost(250000,$SF.Squad.SpacePlane)>> - <<if $cash >= _cSP>> - [[Upgrade Spaceplane|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.SpacePlane++, cashX(-(_cSP), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Spaceplane.// - <</if>> - //Costs @@.red;<<print cashFormat(_cSP)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br> - <<elseif $SF.Squad.SpacePlane === _SPU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br> - <<elseif $SF.Squad.SpacePlane === _SPU>> - //The Spaceplane has been fully upgraded.// <br> +<<if App.SF.unlocked.launchBay()>>''Launch Bay'' + <div style="margin-left:2em"> + <<set _SatU = App.SF.upgrades.currentUnitMax('Satellite')>> + <<if $SF.Squad.Satellite < _SatU && $SF.SatLaunched < 1>> + <<set _cSat = App.SF.UpgradeCost(525000,$SF.Squad.Satellite)>> + <<if $cash >= _cSat>> + [[Upgrade Satellite|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Satellite++, cashX(-(_cSat), "specialForces")]] + <<else>> + //Cannot afford to upgrade Satellite.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cSat)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite)>> </span> <br> + <<elseif $SF.Squad.Satellite === _SatU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite)>> </span> <br> + <<else>> + //The Satellite has been fully upgraded.// <br> + <</if>> + </div> + <<if $terrain !== "oceanic">> <div style="margin-left:2em"> - <<if _T1 && $SF.Squad.GunS < _GunSU>> - <<set _cGunS = App.SF.UpgradeCost(350000,$SF.Squad.GunS)>> - <<if $cash >= _cGunS>> - [[Upgrade Gunship|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GunS++, cashX(-(_cGunS), "specialForces")]] + <<set _GRU = App.SF.upgrades.currentUnitMax('GiantRobot')>> + <<if $SF.Squad.GiantRobot < _GRU>> + <<set _cGR = App.SF.UpgradeCost(550000,$SF.Squad.GiantRobot)>> + <<if $cash >= _cGR>> + [[Upgrade Giant Robot|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GiantRobot++, cashX(-(_cGR), "specialForces")]] <<else>> - //Cannot afford to upgrade Gunship.// + //Cannot afford to upgrade the Giant Robot.// <</if>> - //Costs @@.red;<<print cashFormat(_cGunS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br> - <<elseif $SF.Squad.GunS === _GunSU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br> - <<elseif $SF.Squad.GunS === _GunSU>> - //The Gunship has been fully upgraded.// <br> + //Costs @@.red;<<print cashFormat(_cGR)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br> + <<elseif $SF.Squad.GiantRobot === _GRU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br> + <<else>> + //The Giant Robot has been fully upgraded.// <br> <</if>> </div> - <</if>> /*Closes hangar.*/ - <<if _T1>>''Launch Bay'' <div style="margin-left:2em"> - <<if $SF.Squad.Satellite.lv < _SatU && $SF.Squad.Satellite.InOrbit < 1>> - <<set _cSat = App.SF.UpgradeCost(525000,$SF.Squad.Satellite.lv)>> - <<if $cash >= _cSat>> - [[Upgrade Satellite|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Satellite.lv++, cashX(-(_cSat), "specialForces")]] + <<set _MSU = App.SF.upgrades.currentUnitMax('MissileSilo')>> + <<if $SF.Squad.MissileSilo < _MSU>> + <<set _cMS = App.SF.UpgradeCost(565000,$SF.Squad.MissileSilo)>> + <<if $cash >= _cMS>> + [[Upgrade Cruise Missile|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.MissileSilo++, cashX(-(_cMS), "specialForces")]] <<else>> - //Cannot afford to upgrade Satellite.// + //Cannot afford to upgrade Cruise Missile.// <</if>> - //Costs @@.red;<<print cashFormat(_cSat)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite.lv)>> </span> <br> - <<elseif $SF.Squad.Satellite.lv === _SatU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite.lv)>> </span> <br> + //Costs @@.red;<<print cashFormat(_cMS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br> + <<elseif $SF.Squad.MissileSilo === _MSU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br> <<else>> - //The Satellite has been fully upgraded.// <br> + //The Cruise Missile has been fully upgraded.// <br> <</if>> </div> + <</if>> +<</if>> /*Closes Launch Bay.*/ - <<if $terrain !== "oceanic">> - <div style="margin-left:2em"> - <<if $SF.Squad.GiantRobot < _GRU>> - <<set _cGR = App.SF.UpgradeCost(550000,$SF.Squad.GiantRobot)>> - <<if $cash >= _cGR>> - [[Upgrade Giant Robot|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GiantRobot++, cashX(-(_cGR), "specialForces")]] - <<else>> - //Cannot afford to upgrade the Giant Robot.// - <</if>> - //Costs @@.red;<<print cashFormat(_cGR)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br> - <<elseif $SF.Squad.GiantRobot === _GRU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br> - <<else>> - //The Giant Robot has been fully upgraded.// <br> - <</if>> - </div> - - <div style="margin-left:2em"> - <<if $SF.Squad.MissileSilo < _MSU>> - <<set _cMS = App.SF.UpgradeCost(565000,$SF.Squad.MissileSilo)>> - <<if $cash >= _cMS>> - [[Upgrade Cruise Missile|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.MissileSilo++, cashX(-(_cMS), "specialForces")]] - <<else>> - //Cannot afford to upgrade Cruise Missile.// - <</if>> - //Costs @@.red;<<print cashFormat(_cMS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br> - <<elseif $SF.Squad.MissileSilo === _MSU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br> - <<else>> - //The Cruise Missile has been fully upgraded.// <br> - <</if>> - </div> - <</if>> /*Closes Launch Bay.*/ - - <<if _T1 && ($terrain == "oceanic" || $terrain == "marine")>>''Naval Yard''<br> - <div style="margin-left:2em"> - <<if $SF.Squad.AircraftCarrier < _ACU>> - <<set _cAC = App.SF.UpgradeCost(650000,$SF.Squad.AircraftCarrier)>> - <<if $cash >= _cAC>> - [[Upgrade Aircraft Carrier|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AircraftCarrier++, cashX(-(_cAC), "specialForces")]] - <<else>> - //Cannot afford to upgrade Aircraft Carrier.// - <</if>> - //Costs @@.red;<<print cashFormat(_cAC)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br> - <<elseif $SF.Squad.AircraftCarrier === _ACU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br> +<<if App.SF.unlocked.navalYard()>>''Naval Yard''<br> + <div style="margin-left:2em"> + <<set _ACU = App.SF.upgrades.currentUnitMax('AircraftCarrier')>> + <<if $SF.Squad.AircraftCarrier < _ACU>> + <<set _cAC = App.SF.UpgradeCost(650000,$SF.Squad.AircraftCarrier)>> + <<if $cash >= _cAC>> + [[Upgrade Aircraft Carrier|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AircraftCarrier++, cashX(-(_cAC), "specialForces")]] <<else>> - //The Aircraft Carrier has been fully upgraded.// <br> + //Cannot afford to upgrade Aircraft Carrier.// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cAC)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br> + <<elseif $SF.Squad.AircraftCarrier === _ACU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br> + <<else>> + //The Aircraft Carrier has been fully upgraded.// <br> + <</if>> + </div> - <div style="margin-left:2em"> - <<if $SF.Squad.Sub < _SubU>> - <<set _cSub = App.SF.UpgradeCost(700000,$SF.Squad.Sub)>> - <<if $cash >= _cSub>> - [[Upgrade Submarine|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Sub++, cashX(-(_cSub), "specialForces")]] - <<else>> - //Cannot afford to upgrade Submarine// - <</if>> - //Costs @@.red;<<print cashFormat(_cSub)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span> - <<elseif $SF.Squad.Sub === _SubU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span> + <div style="margin-left:2em"> + <<set _SubU = App.SF.upgrades.currentUnitMax('Sub')>> + <<if $SF.Squad.Sub < _SubU>> + <<set _cSub = App.SF.UpgradeCost(700000,$SF.Squad.Sub)>> + <<if $cash >= _cSub>> + [[Upgrade Submarine|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Sub++, cashX(-(_cSub), "specialForces")]] <<else>> - //The Submarine has been fully upgraded.// <br> + //Cannot afford to upgrade Submarine// <</if>> - </div> + //Costs @@.red;<<print cashFormat(_cSub)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span> + <<elseif $SF.Squad.Sub === _SubU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.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 = App.SF.UpgradeCost(665000,$SF.Squad.HAT)>> - <<if $cash >= _cHAT>> - [[Upgrade Amphibious Transport|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.HAT++, cashX(-(_cHAT), "specialForces")]] - <<else>> - //Cannot afford to upgrade Amphibious Transport.// - <</if>> - //Costs @@.red;<<print cashFormat(_cHAT)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> - <<elseif $SF.Squad.HAT === _HATU && $PC.skill.warfare < 75>> - //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> <br> + <div style="margin-left:2em"> + <<set _HATU = App.SF.upgrades.currentUnitMax('HAT')>> + <<if $SF.Squad.HAT < _HATU>> + <<set _cHAT = App.SF.UpgradeCost(665000,$SF.Squad.HAT)>> + <<if $cash >= _cHAT>> + [[Upgrade Amphibious Transport|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.HAT++, cashX(-(_cHAT), "specialForces")]] <<else>> - //The Amphibious Transport has been fully upgraded.// <br> + //Cannot afford to upgrade Amphibious Transport.// <</if>> - </div> - <</if>> /*Closes Naval Yard.*/ - -<</if>> -<</if>> \ No newline at end of file + //Costs @@.red;<<print cashFormat(_cHAT)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> + <<elseif $SF.Squad.HAT === _HATU && $PC.skill.warfare < 75>> + //Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> <br> + <<else>> + //The Amphibious Transport has been fully upgraded.// <br> + <</if>> + </div> +<</if>> /*Closes Naval Yard.*/ \ No newline at end of file diff --git a/src/Mods/SpecialForce/WeeklyChoices.tw b/src/Mods/SpecialForce/WeeklyChoices.tw index d33b39eda5a8a62ef3c713f556aff5b86e559ded..8f5291b74c888b550e073325231c90fdb486edc4 100644 --- a/src/Mods/SpecialForce/WeeklyChoices.tw +++ b/src/Mods/SpecialForce/WeeklyChoices.tw @@ -1,9 +1,18 @@ :: WC [nobr] -<<set _colonelTalkTensionRuction = $SF.FS.Tension !== -1 ? 5 : 0>> +<<set _Env = App.SF.env(), _size = App.SF.upgrades.total(), _colonelTalkTensionRuction = $SF.FS.Tension !== -1 ? 5 : 0>> + +<<switch _Env>> +<<case 4>> + <<set _EnvCash2 = 450,_EnvCash3 = 200,_EnvCash4 = 100>> +<<case 3>> + <<set _EnvCash2 = 500,_EnvCash3 = 250,_EnvCash4 = 150>> +<<case 2>> + <<set _EnvCash2 = 550,_EnvCash3 = 300,_EnvCash4 = 200>> +<</switch>> <<if $SF.Gift === 0>> - <<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>> + <<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>> The Colonel looks down a list on her tablet. "There's some things we can do to help you out, boss. <br>We've had some good prizes turn up, that's made us some extra money we could turn over. <<else>> @@ -11,44 +20,38 @@ <br> <<= App.SF.Caps()>> can spare some profits from our recent operations. <</if>> | <<link "Request cash" "Firebase">> - /*<<set $CashGift = ((Math.ceil((Math.abs($cash)*0.05)*(Math.max(0.99,$SF.Size))))*($arcologies[0].prosperity/100))*_Env>> OLD*/ - <<set $CashGift = Math.ceil(25000*($SF.Size/10)*_Env),$SF.Gift = 1,$choice = 1>> - <<set $CashGift = ($CashGift > 5000 ? $CashGift : 5000)>> - <<run cashX($CashGift, "specialForces")>> + <<run cashX(App.SF.weeklyGift(1), "specialForces")>> <</link>> <<if $rep < 20000>> - <<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>> + <<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>> <br>If you want we could throw a quick military parade, get the people feeling extra patriotic. <<else>> <br>We can set some units aside for a ceremonial march through the arcology. <</if>> | <<link "Request military parade" "Firebase">> - <<set $GoodWords1 += 50*(Math.ceil($SF.Size*0.03*_Env))>> - <<set $GoodWords1 = (Number($GoodWords1) ? $GoodWords1 : 500),$SF.Gift = 1>> - <<set $choice = 2>> - <<run repX($GoodWords1, "specialForces")>> + <<run repX(App.SF.weeklyGift(2), "specialForces")>> <</link>> <</if>> <<if $arcologies[0].prosperity < $AProsperityCap>> - <<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>> + <<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>> <br>Or we could hit some businesses that rival the ones in $arcologies[0].name with some sabotage. <<else>> <br>Or we can target rival businesses for sabotage. <</if>> | <<link "Request sabotage" "Firebase">> - <<set $GoodWords2 = _EnvProsp+(Math.ceil($SF.Size/100*_Env)),$SF.Gift = 1,$choice = 3>> - <<if $arcologies[0].prosperity + $GoodWords2 * 0.8 > $AProsperityCap>> + <<set _GoodWords2 = App.SF.weeklyGift(3)>> + <<if $arcologies[0].prosperity + _GoodWords2 * 0.8 > $AProsperityCap>> <<set $arcologies[0].prosperity = $AProsperityCap>> <<else>> - <<set $arcologies[0].prosperity += Math.ceil($GoodWords2*0.8)>> + <<set $arcologies[0].prosperity += Math.ceil(_GoodWords2 * 0.8)>> <</if>> <</link>> <</if>> <</if>> -<<if $SF.Colonel.Talk === 0 && $SF.Colonel.Fun === 0>> +<<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>> <span id="result0"> <br>"If you need me for anything else, let me know." diff --git a/src/Mods/SpecialForce/editSF.tw b/src/Mods/SpecialForce/editSF.tw new file mode 100644 index 0000000000000000000000000000000000000000..14a4c0b768707548323d54c143d1b4822ef7e976 --- /dev/null +++ b/src/Mods/SpecialForce/editSF.tw @@ -0,0 +1,56 @@ +:: editSF [nobr] + +<<script>> +for (let i in V.SF.Squad) { + V.SF.Squad[i] = Math.clamp(V.SF.Squad[i], 0, App.SF.upgrades.currentUnitMax('V.SF.Squad[i]')); +} +<</script>> + +<<set _max = App.SF.upgrades.max(), _T1 = App.SF.unlocked.secondTier(), _size = App.SF.upgrades.total(), +$nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", _options = new App.UI.OptionsGroup()>> + +__Upgrades__: _size/_max(<<= (_size/_max).toFixed(2)>>%) +<<run _options.addOption("''Firebase: ''", "Firebase", V.SF.Squad).showTextBox()>> +<<run _options.addOption("''Armoury: ''", "Armoury", V.SF.Squad).showTextBox()>> +<<run _options.addOption("''Drugs: ''", "Drugs", V.SF.Squad).showTextBox()>> + +<<if $SF.Squad.Firebase >= 2>> + <<run _options.addOption("''Drones: ''", "Drones", V.SF.Squad).showTextBox()>> +<</if>> + +<<if App.SF.unlocked.garage('cheat')>> + <<run _options.addOption("''Garage:''<br> ''Attack Vehicles: ''", "AV", V.SF.Squad).showTextBox()>> + <<run _options.addOption(" ''Transport Vehicles: ''", "TV", V.SF.Squad).showTextBox()>> + <<if _T1>> + <<run _options.addOption(" ''Prototype Goliath Tank: ''", "PGT", V.SF.Squad).showTextBox()>> + <</if>> +<</if>> + +<<if App.SF.unlocked.hangar('cheat')>> + <<run _options.addOption("''Hangar:''<br> ''Attack Planes: ''", "AA", V.SF.Squad).showTextBox()>> + <<run _options.addOption(" ''Transport Planes: ''", "TA", V.SF.Squad).showTextBox()>> + <<if _T1>> + <<run _options.addOption(" ''Spaceplane: ''", "SpacePlane", V.SF.Squad).showTextBox()>> + <<run _options.addOption(" ''Gunship: ''", "GunS", V.SF.Squad).showTextBox()>> + <</if>> +<</if>> + +<<if App.SF.unlocked.launchBay('cheat')>> + <<run _options.addOption("''Launch Bay:''<br> ''Satellite: ''", "Satellite", V.SF.Squad).showTextBox()>> + <<if $terrain != "oceanic">> + <<run _options.addOption(" ''Giant Robot: ''", "GiantRobot", V.SF.Squad).showTextBox()>> + <</if>> + <<run _options.addOption(" ''Cruise Missile: ''", "MissileSilo", V.SF.Squad).showTextBox()>> +<</if>> + +<<if App.SF.unlocked.navalYard('cheat')>> + <<run _options.addOption("<br><br>''Naval Yard:''<br> ''Aircraft Carrier: ''", "AircraftCarrier", V.SF.Squad).showTextBox()>> + <<run _options.addOption(" ''Submarine: ''", "Sub", V.SF.Squad).showTextBox()>> + <<run _options.addOption(" ''Amphibious Transport: ''", "HAT", V.SF.Squad).showTextBox()>> +<</if>> + +<<includeDOM _options.render()>> + +<<if $SF.FS.Tension !== -1>> + <br><br>The Colonel's current Tension: <<textbox "$SF.FS.Tension" $SF.FS.Tension "editSF">> +<</if>> \ No newline at end of file diff --git a/src/endWeek/servantsQuartersReport.js b/src/endWeek/servantsQuartersReport.js index f17e25d68f296bac8cf2608ec4466ba58712d52e..8cbdc81ae4c02f7acef7c8d093d3907213d21188 100644 --- a/src/endWeek/servantsQuartersReport.js +++ b/src/endWeek/servantsQuartersReport.js @@ -183,28 +183,6 @@ App.EndWeek.servantsQuartersReport = function() { return r.join(' '); } - /** Generate (and return, if not silent) the "standard" part of the slave report - * @param {App.Entity.SlaveState} slave - * @param {boolean} silent - * @returns {HTMLElement|null} - */ - function standardSlaveReport(slave, silent) { - const clothes = App.SlaveAssignment.choosesOwnClothes(slave); - tired(slave); - const rules = App.UI.DOM.renderPassage("SA rules"); - const diet = App.UI.DOM.renderPassage("SA diet"); - const ltEffects = App.UI.DOM.renderPassage("SA long term effects"); - const drugs = App.SlaveAssignment.drugs(slave); - const relationships = App.UI.DOM.renderPassage("SA relationships"); - const rivalries = App.UI.DOM.renderPassage("SA rivalries"); - const devotion = App.UI.DOM.renderPassage("SA devotion"); - if (!silent) { - const content = App.UI.DOM.makeElement("div", '', "indent"); - $(content).append(clothes, rules, diet, ltEffects, drugs, relationships, rivalries, document.createElement('br'), devotion); - return content; - } - } - const stewardessEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent"); $(stewardessEffects).append(stewardessText()); @@ -233,9 +211,9 @@ App.EndWeek.servantsQuartersReport = function() { App.UI.DOM.appendNewElement("div", stewardessEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); } $(stewardessEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> is serving as your Stewardess.`); - $(stewardessEntry).append(standardSlaveReport(slave, false)); + $(stewardessEntry).append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { - standardSlaveReport(slave, true); + App.SlaveAssignment.standardSlaveReport(slave, true); } } @@ -323,7 +301,7 @@ App.EndWeek.servantsQuartersReport = function() { SQMilk += V.milk; SQMilkSale += V.milkSale; } - $(slaveEntry).append(standardSlaveReport(slave, false)); + $(slaveEntry).append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { // discard return values silently App.SlaveAssignment.servant(slave, stewardessBonus); @@ -332,7 +310,7 @@ App.EndWeek.servantsQuartersReport = function() { SQMilk += V.milk; SQMilkSale += V.milkSale; } - standardSlaveReport(slave, true); + App.SlaveAssignment.standardSlaveReport(slave, true); } } diff --git a/src/endWeek/standardSlaveReport.js b/src/endWeek/standardSlaveReport.js new file mode 100644 index 0000000000000000000000000000000000000000..7e669a80033415724c8b4042da1fad0d3fcad487 --- /dev/null +++ b/src/endWeek/standardSlaveReport.js @@ -0,0 +1,28 @@ +/** + * Generates (and returns if not silent) a standard slave report + * @param {App.Entity.SlaveState} slave + * @param {boolean} silent + * @returns {HTMLElement|null} + */ + App.SlaveAssignment.standardSlaveReport = function(slave, silent=false) { + const + clothes = App.SlaveAssignment.choosesOwnClothes(slave); + tired(slave); + + const + rules = App.UI.DOM.renderPassage("SA rules"), + diet = App.UI.DOM.renderPassage("SA diet"), + ltEffects = App.UI.DOM.renderPassage("SA long term effects"), + drugs = App.SlaveAssignment.drugs(slave), + relationships = App.UI.DOM.renderPassage("SA relationships"), + rivalries = App.UI.DOM.renderPassage("SA rivalries"), + devotion = App.UI.DOM.renderPassage("SA devotion"); + + if (!silent) { + const content = App.UI.DOM.makeElement("div", '', "indent"); + + $(content).append(clothes, rules, diet, ltEffects, drugs, relationships, rivalries, document.createElement('br'), devotion); + + return content; + } + } diff --git a/src/facilities/nursery/widgets/reports/nurseryReport.js b/src/facilities/nursery/widgets/reports/nurseryReport.js index 8721c47382f70c336d153ccd18b3ed3d90c447c5..bf6eaddf9380117027bd0d29b1b276bb749a006f 100644 --- a/src/facilities/nursery/widgets/reports/nurseryReport.js +++ b/src/facilities/nursery/widgets/reports/nurseryReport.js @@ -113,35 +113,6 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() { } } - /** - * Generates (and returns if not silent) a standard slave report - * @param {App.Entity.SlaveState} slave - * @param {boolean} silent - * @returns {HTMLElement|null} - */ - function standardSlaveReport(slave, silent) { - const - clothes = App.SlaveAssignment.choosesOwnClothes(slave); - tired(slave); - - const - rules = App.UI.DOM.renderPassage("SA rules"), - diet = App.UI.DOM.renderPassage("SA diet"), - ltEffects = App.UI.DOM.renderPassage("SA long term effects"), - drugs = App.SlaveAssignment.drugs(slave), - relationships = App.UI.DOM.renderPassage("SA relationships"), - rivalries = App.UI.DOM.renderPassage("SA rivalries"), - devotion = App.UI.DOM.renderPassage("SA devotion"); - - if (!silent) { - const content = App.UI.DOM.makeElement("div", '', "indent"); - - $(content).append(clothes, rules, diet, ltEffects, drugs, relationships, rivalries, document.createElement('br'), devotion); - - return content; - } - } - const matronEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent"); @@ -182,9 +153,9 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() { } $(matronEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> is serving as your Matron.`); - $(matronEntry).append(standardSlaveReport(slave, false)); + $(matronEntry).append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { - standardSlaveReport(slave, true); + App.SlaveAssignment.standardSlaveReport(slave, true); } } @@ -258,10 +229,10 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() { $(nannyContent).append(`${He} ${App.SlaveAssignment.nanny(slave, matronBonus)}`); - $(slaveEntry).append(standardSlaveReport(slave, false)); + $(slaveEntry).append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { // silently discard return values App.SlaveAssignment.nanny(slave, matronBonus); - standardSlaveReport(slave, true); + App.SlaveAssignment.standardSlaveReport(slave, true); } } diff --git a/src/js/economyJS.js b/src/js/economyJS.js index 5b6d18c7797da9f233a9fdd70c574ca796ed4f62..c7cef1c5abddb08932c3c954a3190690265fbb8b 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -813,11 +813,11 @@ globalThis.calculateCosts = (function() { return Math.trunc(cost); } - function getSFCosts(costs = 0) { + function getSFCosts() { if (V.SF.Toggle && V.SF.Active >= 1 && App.SF.AAR(0)) { - costs += Math.ceil(5000 * (1 + ((V.SF.ArmySize / 100) + (V.SF.Size / 100)))); + return Math.ceil(5000 * (1 + ((V.SF.ArmySize / 100) + (App.SF.upgrades.total() / 100)))); } - return costs; + return 0; } function getWeatherCosts() { diff --git a/src/npc/surgery/organs.js b/src/npc/surgery/organs.js index 7c000bcade7c0906160a566cb64298618abe4cae..4861d11cc80f5dc7ed0214eb84de400eecf4acb7 100644 --- a/src/npc/surgery/organs.js +++ b/src/npc/surgery/organs.js @@ -4,7 +4,7 @@ * * @type {string[]} */ -App.Medicine.OrganFarm.organDisplayOrder = ["penis", "testicles", "scrotum", "pigTesticles", "dogTesticles", "horseTesticles", "cowTesticles", "foreskin", "prostate", "ovaries", "asexualReproOvaries", "pigOvaries", "dogOvaries", "horseOvaries", "cowOvaries", "freshOvaries", "leftEye", "rightEye", "ears", "topEars", "cochleae", "voicebox", "mpreg", "mpregPig", "mpregDog", "mpregHorse", "mpregCow"]; +App.Medicine.OrganFarm.organDisplayOrder = ["penis", "testicles", "scrotum", "pigTesticles", "dogTesticles", "horseTesticles", "cowTesticles", "foreskin", "prostate", "ovaries", "asexualReproOvaries", "pigOvaries", "dogOvaries", "horseOvaries", "cowOvaries", "freshOvaries", "leftEye", "rightEye", "ears", "topEars", "cochleae", "voicebox", "hair", "mpreg", "mpregPig", "mpregDog", "mpregHorse", "mpregCow"]; App.Medicine.OrganFarm.init = function() { new App.Medicine.OrganFarm.Organ({ @@ -385,4 +385,72 @@ App.Medicine.OrganFarm.init = function() { }) ] }); + + new App.Medicine.OrganFarm.Organ({ + type: "hair", name: "Hair Follicles", cost: 500, time: 2, + actions: [ + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Scalp", healthImpact: 10, surgeryType: "restoreHairHead", + canImplant: s => (s.bald), + implantError: () => "This slave already has hair.", + implant: s => { + s.bald = 0; + s.hLength = 1; + s.hair = "neat"; + s.hColor = s.origHColor; + } + }), + /* + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Ears", healthImpact: 5, + surgeryType: "addHairEarsH", autoImplant: false, + canImplant: s => (s.earShape !== "normal"), + implantError: s => getRightEyeVision(s) !== 0 ? "Slave has a working right eye." : "", + implant: s => { + s.earShape = "normal"; + } + }), + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Ears", healthImpact: 5, + surgeryType: "addHairEarsS", autoImplant: false, + canImplant: s => (s.earShape !== "normal"), + implantError: s => getRightEyeVision(s) !== 0 ? "Slave has a working right eye." : "", + implant: s => { + s.earShape = "normal"; + } + }), + */ + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Brow", healthImpact: 5, + surgeryType: "restoreHairBrow", autoImplant: false, + canImplant: s => (s.eyebrowHStyle === "bald"), + implantError: () => "This slave already has eyebrows.", + implant: s => { + s.eyebrowHStyle = "natural"; + s.eyebrowFullness = "natural"; + s.eyebrowHColor = s.origHColor; + } + }), + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Axillary", healthImpact: 5, + surgeryType: "restoreHairPits", autoImplant: false, + canImplant: s => (s.underArmHStyle === "bald" || s.underArmHStyle === "hairless"), + implantError: () => "This slave already has underarm hair.", + implant: s => { + s.underArmHStyle = "bushy"; + s.underArmHColor = s.origHColor; + } + }), + new App.Medicine.OrganFarm.OrganImplantAction({ + name: "Pubic", healthImpact: 5, + surgeryType: "restoreHairPubes", autoImplant: false, + canImplant: s => (s.pubicHStyle === "bald" || s.pubicHStyle === "hairless"), + implantError: () => "This slave already has pubic hair.", + implant: s => { + s.pubicHStyle = "very bushy"; + s.pubicHColor = s.origHColor; + } + }) + ] + }); }; diff --git a/src/pregmod/reMaleCitizenHookup.tw b/src/pregmod/reMaleCitizenHookup.tw index e1b36899be8d5896db1c6a4367b5ee96d0d7ba02..1e98d3871f96f0e16cae5ca729a9abae2c57ce9e 100644 --- a/src/pregmod/reMaleCitizenHookup.tw +++ b/src/pregmod/reMaleCitizenHookup.tw @@ -264,9 +264,9 @@ He's clearly attracted to you; even the most consummate actor would have difficu an inhumanly enormous ass to counterbalance those enormous balls and a semi-hard cock, unable to become fully erect. You have to struggle to get him onto your bed. You tease him as you remove your evening dress, crawl over him and <<if $PC.newVag == 1>> impale yourself on his monster shaft as far as you can, quivering in joy at its girth filling you. - <<elseif $PC.vigina > 3>> + <<elseif $PC.vagina > 3>> impale yourself on his monster shaft as far as you can, quivering in joy at its girth filling you like nothing does lately. - <<elseif $PC.vigina > 2>> + <<elseif $PC.vagina > 2>> impale yourself on his monster shaft as far as you can, quivering in joy at how full you are. <<elseif $PC.vagina > 1>> barely manage to get his cockhead into your pussy. diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw index 52b080ce98944d9ba398a2d0852689a58410d8b8..88a48ef5e84ef45824e61bd536465e111c243957 100644 --- a/src/uncategorized/nextWeek.tw +++ b/src/uncategorized/nextWeek.tw @@ -348,9 +348,7 @@ <<script>>Save.autosave.save("Week Start Autosave")<</script>> <</if>> -<<if $SF.Toggle && $SF.Active >= 1>> - <<= App.SF.Count()>> -<<elseif $SF.Toggle && $SF.FS.Tension > 100>> +<<if $SF.Toggle && $SF.FS.Tension > 100>> <<if ($rep > 17500)>> <<set $rep = 17500>> <</if>> <</if>> <<set $NaNArray = findNaN()>> diff --git a/src/uncategorized/reputation.tw b/src/uncategorized/reputation.tw index 20088a7451ac9783c1f7ce0bf1022b0a6dbe16c4..5e99ce9a76f37bea098ddef72ec0967e549cd8fa 100644 --- a/src/uncategorized/reputation.tw +++ b/src/uncategorized/reputation.tw @@ -323,7 +323,7 @@ _enduringRep = $enduringRep>> <<run repX(_value, "specialForces")>> <br> <<elseif $SF.FS.BadOutcome === "ISOLATION">> <br>Your citizens are @@.red;very displeased@@ that you are hosting a legion of heavily armed squatters in your basement. - <<run repX(forceNeg($SF.ArmySize+$SF.Size), "specialForces")>> + <<run repX(forceNeg($SF.ArmySize + App.SF.upgrades.total()), "specialForces")>> <</if>> <<if $arcologies[0].FSSupremacist != "unset">> diff --git a/src/uncategorized/seRaiding.tw b/src/uncategorized/seRaiding.tw index 590a995e83d4e1cf270dcc456a7eb37b7df767db..5c478147c7fe12dd61e5b23b9c44e2cf67e2fefe 100644 --- a/src/uncategorized/seRaiding.tw +++ b/src/uncategorized/seRaiding.tw @@ -3,19 +3,19 @@ <<set $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $nextButton = "Continue", $raided = $week>> The leader of your $mercenariesTitle has contacted you from the world outside your arcology. It seems that your $mercenariesTitle have enjoyed a profitable series of raids in their time outside the arcology and have decided to push their luck by plundering one last location on their way back to the arcology. As their nominal leader, they ask your opinion of a small number of potential targets. Given the distance from the arcology and the time sensitivity of conducting such a mission, you have little to base your decision on besides a brief description. -<<if $SF.Toggle && $SF.Active >= 1 && (($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) || $SF.Squad.SpacePlane >= 1)>> +<<if $SF.Toggle && $SF.Active >= 1 && (($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) || $SF.Squad.SpacePlane >= 1)>> By having access to the use of $SF.Lower's - <<if $SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0>> + <<if $SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0>> satellite <</if>> <<if $SF.Squad.SpacePlane >= 1>> space plane <</if>> - <<if ($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) && $SF.Squad.SpacePlane >= 1>> + <<if ($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) && $SF.Squad.SpacePlane >= 1>> satellite and space plane <</if>> it is - <<if ($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) && $SF.Squad.SpacePlane >= 1>> + <<if ($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) && $SF.Squad.SpacePlane >= 1>> even <</if>> less likely that the target will escape. diff --git a/src/uncategorized/seRaidingAssault.tw b/src/uncategorized/seRaidingAssault.tw index 2d7683b1f4a65e325c852315442d74f4264fe178..040822015dae56613eecd8df0d0d3a82c4477b8c 100644 --- a/src/uncategorized/seRaidingAssault.tw +++ b/src/uncategorized/seRaidingAssault.tw @@ -6,7 +6,7 @@ You make your selection and direct your $mercenariesTitle to attack the target. <<set _raidescapeL = 1,_raidescapeU = 3>> <<if $SF.Toggle && $SF.Active >= 1>> - <<if $SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0>> + <<if $SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0>> <<set _MercCaptureL += 1,_MercCaptureU += 1>> <<set _raidescapeL -= 1,_raidescapeU -= 1>> <</if>> diff --git a/src/uncategorized/surgeryDegradation.tw b/src/uncategorized/surgeryDegradation.tw index b05da6946cf664dc26d7a17a5dcf4809535d962f..ea91b902be936fcf1f073f7a4aac7ec332f39665 100644 --- a/src/uncategorized/surgeryDegradation.tw +++ b/src/uncategorized/surgeryDegradation.tw @@ -121,6 +121,8 @@ As the remote surgery's long recovery cycle completes, your new Fuckdoll <<if (hasAnyLegs(getSlave($AS)))>>stumbles<<else>>is carried<</if>> out of the surgery room. The only <<if getSlave($AS).vagina > -1>>areas of skin visible are those around its vulva and anus<<else>>area of skin visible is that around its anus<</if>><<if getSlave($AS).lips > 95>>, though its lips are also visible as its facepussy makes the standard Fuckdoll mouth insert unnecessary<</if>>. You can see it starting to struggle against the constricting material of the Fuckdoll suit as the sedation wears off. Other than the tiny area of exposed skin and the slight movement, there's no indication that the sex doll in front of you is alive at all. <<elseif $surgeryType == "fuckdollExtraction">> <<= getSlave($AS).slaveName>> <<if !hasAnyLegs(getSlave($AS))>>is carried<<elseif canWalk(getSlave($AS))>>walks<<else>>is escorted<</if>> out of the surgery room. +<<elseif ["restoreHairHead", "restoreHairBrow", "restoreHairPits", "restoreHairPubes"].includes($surgeryType)>> + <<= getSlave($AS).slaveName>> begins to stir. <<else>> <<= getSlave($AS).slaveName>> <<if !hasAnyLegs(getSlave($AS))>>is carried<<elseif canWalk(getSlave($AS))>>walks<<else>>is escorted<</if>> out of the surgery room<<if canSee(getSlave($AS))>> and catches sight of $himself in the floor-length mirror outside the door<<else>> and is detailed the modifications done to $his body, assuming $he hasn't already realized them<</if>>. <</if>> @@ -2636,6 +2638,79 @@ As the remote surgery's long recovery cycle completes, <</if>> <br><br>As this was a non-invasive procedure, $his health was not affected. +<<case "restoreHairHead" "restoreHairBrow" "restoreHairPits" "restoreHairPubes">> + $He awakens from surgery to an unfamiliar, rather irritating, itch + <<if $surgeryType == "restoreHairHead">> + coming from the top of $his head. + <<elseif $surgeryType == "restoreHairBrow">> + above $his eyes. + <<elseif $surgeryType == "restoreHairPits">> + <<if hasAnyArms(getSlave($AS))>> + under $his arm<<if hasBothArms(getSlave($AS))>>s<</if>> + <<else>> + below where $his arms used to be. + <</if>> + <<elseif $surgeryType == "restoreHairPubes">> + above $his crotch. + <</if>> + <<if hasAnyArms(getSlave($AS))>> + As $he reaches to scratch it, + <<elseif canSee(getSlave($AS))>> + <<if $surgeryType != "restoreHairPubes">> + When $he investigates, + <<else>> + When $he looks in the mirror, + <</if>> + <<else>> + As $he struggles to rub it against something, + <</if>> + <<if $surgeryType == "restoreHairHead">> + <<if getSlave($AS).fetish != "mindbroken">> + $he is @@.hotpink;delighted@@ to find $he now has hair. + <<set getSlave($AS).devotion += 2>> + <<else>> + $he fails to realize $he now has a head of short hair. + <</if>> + <<elseif $surgeryType == "restoreHairBrow">> + <<if getSlave($AS).fetish != "mindbroken">> + $he is @@.hotpink;delighted@@ to find $he now has eyebrows. + <<set getSlave($AS).devotion += 2>> + <<else>> + $he fails to realize $he now has eyebrows. + <</if>> + <<elseif $surgeryType == "restoreHairPits">> + <<if getSlave($AS).fetish != "mindbroken">> + <<set _pubertyAge = Math.min(getSlave($AS).pubertyAgeXX, getSlave($AS).pubertyAgeXY)>> + <<if (getSlave($AS).physicalAge < _pubertyAge - 2)>> + $he finds nothing unusual; $his hair is still growing in. + <<elseif (getSlave($AS).physicalAge < _pubertyAge - 1)>> + $he is surprised to find a few new hairs. + <<elseif (getSlave($AS).physicalAge < _pubertyAge)>> + $he is surprised to find two patches of hair. + <<else>> + $he is shocked to find two dense patches of hair; a trip to the autosalon to manage it may be in order. + <</if>> + <<else>> + $he fails to realize $he now has underarm hair. + <</if>> + <<elseif $surgeryType == "restoreHairPubes">> + <<if getSlave($AS).fetish != "mindbroken">> + <<set _pubertyAge = Math.min(getSlave($AS).pubertyAgeXX, getSlave($AS).pubertyAgeXY)>> + <<if (getSlave($AS).physicalAge < _pubertyAge - 2)>> + $he finds nothing unusual; $his hair is still growing in. + <<elseif (getSlave($AS).physicalAge < _pubertyAge - 1)>> + $he is surprised to find a few new hairs. + <<elseif (getSlave($AS).physicalAge < _pubertyAge)>> + $he is surprised to find a patch of pubic hair. + <<else>> + $he is shocked to find a dense bush of hair trailing up to $his navel; a trip to the autosalon to style $his new pubes may be in order. + <</if>> + <<else>> + $he fails to realize $he now has pubic hair. + <</if>> + <</if>> + As with all surgery @@.red;$his health has been slightly affected.@@ + <<case "womb">> It's not immediately apparent to $him what kind of surgery $he received, since all $he's left with is a terrible nonspecific ache in $his lower belly. As with all invasive surgery @@.red;$his health has been greatly affected.@@