diff --git a/Changelog.txt b/Changelog.txt index ae020e11c9a30261b7dbf27702f14b198e7b5a60..891453b0899067481407012147907a19d283c889 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -17,7 +17,7 @@ Pregmod 11/21/2019 0 - + -added FS Intellectual Dependency -added FS Slave Professionalism -added FS Statuesque Glorification @@ -29,7 +29,7 @@ Pregmod 0.10.7.1-2.9.x 11/09/2019 - + 2 -sugarcube updated to 2.30.0 @@ -38,7 +38,7 @@ Pregmod -various minor fixes and cleaning 10/28/2019 - + 1 -beta 3.0.0 work (schoolroom remodel) -added ability to reject delivered custom slaves without closing the order @@ -48,7 +48,7 @@ Pregmod -saTakeClasses JSification 10/15/2019 - + 0 -corporation overhauling -some minor ui settings diff --git a/devNotes/Useful JS Function Documentation.txt b/devNotes/Useful JS Function Documentation.txt index c81a21482a1e8738082c31ad56d50cbe39141efb..07d0905355e2e932d3430659a61ba7e6deb1a3eb 100644 --- a/devNotes/Useful JS Function Documentation.txt +++ b/devNotes/Useful JS Function Documentation.txt @@ -86,9 +86,7 @@ canBreed(slave1, slave2) - Returns if slave1 and slave2 are capable of breeding canImpreg(slave1, slave2) - Returns if slave2 can impregnate slave1. PC works as an argument as well. -isFertile(slave) - Returns if the slave is capable of having children. - -isPlayerFertile(PC) - Returns if the player can get pregnant. +isFertile(slave) - Returns if the actor is capable of having children. canAchieveErection(slave) - Returns if the slave can get an erection. (Not blocked by chastity.) diff --git a/src/002-config/sugarCubeConfig.js b/src/002-config/sugarCubeConfig.js index bd8bc1e80925d720fd94bcc99e9ce0d6117c0890..43711f8918b3b59977af30039d5d8c6f693fa320 100644 --- a/src/002-config/sugarCubeConfig.js +++ b/src/002-config/sugarCubeConfig.js @@ -6,11 +6,11 @@ Config.passages.start = "init"; /* Set description used by Save, for all passages, to give some decent information about game state. */ Config.passages.descriptions = function () { - let sv = State.variables; - if (sv.arcologies === undefined || sv.arcologies.length === 0) - return "New Game Setup, Week 0"; // no arcology yet... - else - return sv.arcologies[0].name + ", Week " + sv.week + ", " + sv.slaves.length + " Slaves, " + cashFormat(sv.cash); + let sv = State.variables; + if (sv.arcologies === undefined || sv.arcologies.length === 0) + return "New Game Setup, Week 0"; // no arcology yet... + else + return sv.arcologies[0].name + ", Week " + sv.week + ", " + sv.slaves.length + " Slaves, " + cashFormat(sv.cash); }; /* Disable forward/back buttons in panel. */ diff --git a/src/Corporation/corporate-constants.js b/src/Corporation/corporate-constants.js index 5117176df8fbae2c14ccd1e309bf2f211c855b92..d10a3590f6f15ff5161d5ce1c4e4d52ced36167a 100644 --- a/src/Corporation/corporate-constants.js +++ b/src/Corporation/corporate-constants.js @@ -1,541 +1,541 @@ App.Corporate.InitConstants = function () { - App.Corporate.payoutMinimumCash = 1000000; - App.Corporate.payoutCorpValueMultiplier = 0.05; - App.Corporate.dividendOptions = [0.75, 0.5, 0.25, 0.1, 0.05]; - App.Corporate.stockSplits = [ - { - 'newStocks': 3, - 'oldStocks': 2, - 'weeks': 1, - 'cost': 7.5 - }, - { - 'newStocks': 2, - 'weeks': 1, - 'cost': 10 - }, - { - 'newStocks': 3, - 'weeks': 2, - 'cost': 12.5 - }, - { - 'newStocks': 4, - 'weeks': 3, - 'cost': 15 - }, - { - 'oldStocks': 4, - 'weeks': 1, - 'cost': 15 - }, - { - 'oldStocks': 10, - 'weeks': 2, - 'cost': 25 - }, - ]; - /* - center/range object: The center value is the average or center value of the property, while range is the value range (centered on center). So if center is 1 and range is 0.5, the value can be anything from 0.75 to 1.25. + App.Corporate.payoutMinimumCash = 1000000; + App.Corporate.payoutCorpValueMultiplier = 0.05; + App.Corporate.dividendOptions = [0.75, 0.5, 0.25, 0.1, 0.05]; + App.Corporate.stockSplits = [ + { + 'newStocks': 3, + 'oldStocks': 2, + 'weeks': 1, + 'cost': 7.5 + }, + { + 'newStocks': 2, + 'weeks': 1, + 'cost': 10 + }, + { + 'newStocks': 3, + 'weeks': 2, + 'cost': 12.5 + }, + { + 'newStocks': 4, + 'weeks': 3, + 'cost': 15 + }, + { + 'oldStocks': 4, + 'weeks': 1, + 'cost': 15 + }, + { + 'oldStocks': 10, + 'weeks': 2, + 'cost': 25 + }, + ]; + /* + center/range object: The center value is the average or center value of the property, while range is the value range (centered on center). So if center is 1 and range is 0.5, the value can be anything from 0.75 to 1.25. - == Base == - id: The variable ID for identifying the department. - name: The display name of the department. - focusDescription: The descriptive phrase of what the department does: - The department focuses on {breaking slaves}. + == Base == + id: The variable ID for identifying the department. + name: The display name of the department. + focusDescription: The descriptive phrase of what the department does: + The department focuses on {breaking slaves}. - sizeCost: How much a single development of the department costs in thousands. - maintenance: (object) Defines the amount paid each week. - linear: How much a single development costs to maintain each week in thousands. - quadratic: Development maintenance increases quadratically; this is the multiplier on the squared development component. - category: Which division maintenance category this division belongs to. Multiple divisions in a category increase overhead costs exponentially. - founding: (object) Defines information regarding the founding of the division. - corporateCash: Defines how much it costs the player to *found the corporation* with this department with a 2-to-1 split, in thousands. This will be the corporation's starting cash, from which the development and slaves will be purchased. - startingSize: How developed the department is upon founding, including how many active slaves the department starts with (Note that acquiring divisions don't start with slaves) - merger: A list of companies that can be purchased during the merger event. The event will collect all of these company objects associated with owned divisions and pick some at random. - name: The generic name of the company that is being purchased. This will have "the" put in front of it, so it must fit with the sentance "The {name} will be bought." - cost: How much, in thousands, it will cost to purchase this company. Default: 50. - text: An object with the flavor text of the event. - trouble: A description of the company and its troubles. Will be in the sentence "The first company is {trouble}" - acquire: The text that will be shown when the player chooses to acquire the company. Will be in the sentence "You acquire the {name}{acquire}". - result: The functional result of acquiring this company. - development: The number of developments that will be added to this division. - slaves: the number of activeSlaves that will be added to this division. If the division doesn't have enough room to store them you will have to purchase more development by the end of the week or they will be sold off. *WARNING* Do not provide this property if the division cannot have activeSlave set (Acquiring divisions, for example) + sizeCost: How much a single development of the department costs in thousands. + maintenance: (object) Defines the amount paid each week. + linear: How much a single development costs to maintain each week in thousands. + quadratic: Development maintenance increases quadratically; this is the multiplier on the squared development component. + category: Which division maintenance category this division belongs to. Multiple divisions in a category increase overhead costs exponentially. + founding: (object) Defines information regarding the founding of the division. + corporateCash: Defines how much it costs the player to *found the corporation* with this department with a 2-to-1 split, in thousands. This will be the corporation's starting cash, from which the development and slaves will be purchased. + startingSize: How developed the department is upon founding, including how many active slaves the department starts with (Note that acquiring divisions don't start with slaves) + merger: A list of companies that can be purchased during the merger event. The event will collect all of these company objects associated with owned divisions and pick some at random. + name: The generic name of the company that is being purchased. This will have "the" put in front of it, so it must fit with the sentance "The {name} will be bought." + cost: How much, in thousands, it will cost to purchase this company. Default: 50. + text: An object with the flavor text of the event. + trouble: A description of the company and its troubles. Will be in the sentence "The first company is {trouble}" + acquire: The text that will be shown when the player chooses to acquire the company. Will be in the sentence "You acquire the {name}{acquire}". + result: The functional result of acquiring this company. + development: The number of developments that will be added to this division. + slaves: the number of activeSlaves that will be added to this division. If the division doesn't have enough room to store them you will have to purchase more development by the end of the week or they will be sold off. *WARNING* Do not provide this property if the division cannot have activeSlave set (Acquiring divisions, for example) - == Acquiring == - An acquiring division generates new slaves. It can always sell to the market but cannot buy from the market. - slaveValue: How much value is added to a slave when it becomes a Held slave. - acquiring: (center/range) The percentage of development that can acquire a slave each week. - mercenaryHelp: (object) If present, defines how and when your mercenaries (not SF) assist this division in acquiring slaves. - level: What level the mercenaries must be above in order to assist. - cost: How much each level of mercenary above level costs the department for this assistance, in thousands. - nextDivision: (list) The ids of the divisions that acquired slaves can be sent directly to. Note that if any of these divisions can send slaves to a listed division, that division will block this division from sending to it. For example, if A->[B,C] and B->C, then A->C can only happen if B *has not* been founded. Once B is founded, slaves from A must proceed A->B->C and cannot skip to C. + == Acquiring == + An acquiring division generates new slaves. It can always sell to the market but cannot buy from the market. + slaveValue: How much value is added to a slave when it becomes a Held slave. + acquiring: (center/range) The percentage of development that can acquire a slave each week. + mercenaryHelp: (object) If present, defines how and when your mercenaries (not SF) assist this division in acquiring slaves. + level: What level the mercenaries must be above in order to assist. + cost: How much each level of mercenary above level costs the department for this assistance, in thousands. + nextDivision: (list) The ids of the divisions that acquired slaves can be sent directly to. Note that if any of these divisions can send slaves to a listed division, that division will block this division from sending to it. For example, if A->[B,C] and B->C, then A->C can only happen if B *has not* been founded. Once B is founded, slaves from A must proceed A->B->C and cannot skip to C. - ==Processing== - A processing division enhances the value of slaves. It can always buy from the market and sell to the market. - addedValue: How much value is added to a slave when it becomes a Held slave. - processing: (center/range) The percentage of active slaves that become held slaves each week. - slaveProcessType: (text object) The verb used for the completion of the processing done on slaves. It will be used to explain when a slave moves from processed to held. - present: The department can {break} 5 slaves. - past:The department {broke} 5 slaves. - slaveProcessDescription: The descriptive phrase for what sort of processing is being done to the division's slaves. - present: the department is {breaking} 5 slaves. - future: the department will {break} 5 slaves. - past: Over the past week, the department {broke} 5 slaves. - market: The department bought {fresh slaves} from the market. - nextDivision: (list) The ids of the divisions that improved slaves can be sent directly to. Note that if any of these divisions can send slaves to a listed division, that division will block this division from sending to it. For example, if A->[B,C] and B->C, then A->C can only happen if B *has not* been founded. Once B is founded, slaves from A must proceed A->B->C and cannot skip to C. + ==Processing== + A processing division enhances the value of slaves. It can always buy from the market and sell to the market. + addedValue: How much value is added to a slave when it becomes a Held slave. + processing: (center/range) The percentage of active slaves that become held slaves each week. + slaveProcessType: (text object) The verb used for the completion of the processing done on slaves. It will be used to explain when a slave moves from processed to held. + present: The department can {break} 5 slaves. + past:The department {broke} 5 slaves. + slaveProcessDescription: The descriptive phrase for what sort of processing is being done to the division's slaves. + present: the department is {breaking} 5 slaves. + future: the department will {break} 5 slaves. + past: Over the past week, the department {broke} 5 slaves. + market: The department bought {fresh slaves} from the market. + nextDivision: (list) The ids of the divisions that improved slaves can be sent directly to. Note that if any of these divisions can send slaves to a listed division, that division will block this division from sending to it. For example, if A->[B,C] and B->C, then A->C can only happen if B *has not* been founded. Once B is founded, slaves from A must proceed A->B->C and cannot skip to C. - ==Working== - A working division produces revenue by working slaves. It can always buy from the market but cannot sell to the market. - attrition: (center/range) The percentage of active slaves that become no longer workable - revenue: (center/range) The amount of money generated by a slave. - slaveProcessDescription: The descriptive phrase for what sort of work is being done by the division's slaves and how they are removed from the workforce. - present: the department is {exploiting} 5 slaves. - future: the department will {exploit} 5 slaves. - past: Over the past week, the department {wore out} 5 slaves. - market: The department bought {menials} from the market. + ==Working== + A working division produces revenue by working slaves. It can always buy from the market but cannot sell to the market. + attrition: (center/range) The percentage of active slaves that become no longer workable + revenue: (center/range) The amount of money generated by a slave. + slaveProcessDescription: The descriptive phrase for what sort of work is being done by the division's slaves and how they are removed from the workforce. + present: the department is {exploiting} 5 slaves. + future: the department will {exploit} 5 slaves. + past: Over the past week, the department {wore out} 5 slaves. + market: The department bought {menials} from the market. - */ - App.Corporate.divisionList = [ - new App.Corporate.Division.Acquiring( { - 'id':'Extra', - 'name':'Extralegal Enslavement', - 'focusDescription':'capturing and enslaving prisoners', - 'sizeCost': 20, - 'slaveValue':10, - 'acquiring': { - 'center':1, - 'range': 0.8, - }, - 'maintenance':{ - 'linear': 7.5, - 'quadratic': 5, - 'category':'acquision', - }, - 'founding':{ - 'corporateCash':100, - }, - 'mercenaryHelp': { - 'level': 2, - 'cost': 0.05 - }, - 'nextDivision': [ - "Break", - "Arcade" - ], - 'merger':[ - { - 'name': 'mercenary company', - 'cost': 50, - 'text': { - 'trouble':'a troubled mercenary company. After a spate of failed operations, the rank and file deposed their management and are now looking to merge with a better-run organization. The old leadership did not engage in enslavement activities, but the mercenaries have decided to turn their talents towards slaving for profit in conflict zones.', - 'acquire':' and ease their transition to conflict zone slaving.' - }, - 'result': { - 'development': 5 - } - } - ] - }), - new App.Corporate.Division.Acquiring( { - 'id': 'Legal', - 'name': 'Legal Enslavement', - 'focusDescription': 'legal enslavement', - 'sizeCost': 25, - 'slaveValue':15, - 'acquiring': { - 'center':1, - 'range': 0.5, - }, - 'maintenance':{ - 'linear': 12, - 'quadratic': 6, - 'category':'acquision', - }, - 'founding':{ - 'corporateCash':125, - }, - 'nextDivision': [ - "Train", - "Menial", - "Surgery" - ], - 'merger':[ - { - 'name':'telemarketing firm', - 'cost': 50, - 'text': { - 'trouble':'an old world telemarketing firm. In an attempt to survive in the changing economy, it turned its focus towards convincing desperate, ignorant, or stupid people from the old world to accept voluntary enslavement, through a variety of entrapment procedures. It failed to make the transition successfully, but you could certainly continue its operations under your aegis.', - 'acquire':' and clean out the deadwood, getting the business in Free Cities shape.' - }, - 'result': { - 'development':5 - } - } - ] - }), - new App.Corporate.Division.Processing( { - 'id': 'Break', - 'name': 'Slave Breaking', - 'focusDescription': 'breaking slaves', - 'sizeCost': 10, - 'addedValue': 5, - 'processing': { - 'center':0.3, - 'range':0.3, - }, - 'maintenance':{ - 'linear': 0.45, - 'quadratic': 0.6, - 'category':'processing', - }, - 'founding':{ - 'corporateCash':25, - }, - 'slaveProcessType':{ - 'present':'break', - 'past':'broke' - }, - 'slaveProcessDescription':{ - 'present':'attempting to break', - 'future':'break', - 'past':'broken', - 'market': { - single: 'slave that needs breaking', - plural: 'slaves that need breaking' - } - }, - 'nextDivision': [ - "Train", - "Menial", - "Surgery" - ], - 'merger':[ - { - 'name': 'slave breaking facility', - 'cost': 50, - 'text': { - 'trouble':'a small slave breaking firm. Despite a great need for obedient slaves the owner of this little establishment was unable to turn a profit. The facility has everything a respecting slave breaking could ever need, it seems the owner simply lacked the right character to apply effective breaking techniques. Your corporation knows perfectly well what it takes to achieve obedience and the assets can be put to great use.', - 'acquire':' and staff it with qualified personnel to make use of the new assets.' - }, - 'result': { - 'development':5, - 'slaves':5 - } - } - ] - }), - new App.Corporate.Division.Processing( { - 'id': 'Surgery', - 'name': 'Slave Modifications', - 'focusDescription': 'physical slave modifications', - 'sizeCost': 20, - 'addedValue':8, - 'processing': { - 'center':0.5, - 'range':0.2, - }, - 'maintenance':{ - 'linear': 2.4, - 'quadratic': 1, - 'category':'processing', - }, - 'founding':{ - 'corporateCash':55, - }, - 'slaveProcessType':{ - 'present':'modify', - 'past':'finished working on' - }, - 'slaveProcessDescription':{ - 'present':'working on', - 'future':'work on', - 'past':'improved', - 'market': { - single: 'slave that could use some work done to their body', - plural: 'slaves that could use some work done to their bodies' - } - }, - 'nextDivision': [ - "Train", - "Dairy" - ], - 'merger':[ - { - 'name': 'medical clinic', - 'cost': 50, - 'text': { - 'trouble':"a small medical clinic. Medical malpractice continues to be a major source of trouble for surgeons in the old world. A plastic surgeon has just suffered defeat in a major legal case over implant ruptures. He's looking to make the transition to a more enlightened area, along with his inventory and staff.", - 'acquire':" and the surgeon decides to retire on the proceeds of the sale, wishing your corporation well. It was a smart decision; he can retire to the Free Cities on that sum of money, and remote surgery is killing surgeons' wages." - }, - 'result': { - 'development': 3, - 'slaves':3 - } - } - ] - }), - new App.Corporate.Division.Processing( { - 'id': 'Train', - 'name': 'Slave Training', - 'focusDescription': 'training slaves', - 'sizeCost': 25, - 'addedValue': 11, - 'processing': { - 'center':0.2, - 'range':0.3, - }, - 'maintenance':{ - 'linear': 0.7, - 'quadratic': 1, - 'category':'processing', - }, - 'founding':{ - 'corporateCash':50, - }, - 'slaveProcessType':{ - 'present':'train', - 'past':'trained' - }, - 'slaveProcessDescription':{ - 'present':'training', - 'future':'train', - 'past':'trained', - 'market': { - single: 'slave that needs slave training', - plural: 'slaves that need slave training' - } - }, - 'nextDivision': [ - "Whore" - ], - 'merger':[ - { - 'name': 'slave training firm', - 'cost': 50, - 'text': { - 'trouble':"a small slave training firm. Slave training is a notoriously difficult business, since the maturation times on the merchandise can be extremely long, and the improvement in price can be marginal if the training does not prove highly successful. There's nothing inherently wrong with the business, they've simply hit a cash flow bottleneck and need to merge with a cash-rich organization like yours.", - 'acquire':". The previous owners are happy they'll be able to continue operations under the aegis of a better-run, richer corporation." - }, - 'result': { - 'development': 3, - 'slaves':3 - } - } - ] - }), - new App.Corporate.Division.Working( { - 'id': 'Arcade', - 'name': 'Sex Arcades', - 'focusDescription': 'operating sex arcades', - 'sizeCost': 5, - 'attrition': { - 'center':0.05, - 'range':0.2, - }, - 'maintenance':{ - 'linear': 0.2, - 'quadratic': 0.125, - 'category':'working', - }, - 'revenue':{ - 'center':1000, - 'range':0.1 - }, - 'founding':{ - 'corporateCash':15, - 'startingSize':20, - }, - 'slaveWorkDescription':{ - 'present':'exploiting', - 'future':'exploit', - 'past':'wore out', - 'market': 'fresh slave' - }, - 'merger':[ - { - 'name': 'café', - 'cost': 50, - 'text': { - 'trouble':"a quaint maid café. The prime location together with a popular concept should make for a bustling business and yet the owner is looking to get out of the business hoping to salvage some of his savings. Sadly there was a lack of capital to employ attractive servant slave maids. While someone might very well be more than willing to come in and invest in some better slaves, the place is so cheap you could easily replace the furniture and use the current assets to create a new arcade location for your corporation instead.", - 'acquire':". The old owner wishes his slaves luck under the new management, not knowing your plans for the place. A new sex arcade under your corporate umbrella will open shortly." - }, - 'result': { - 'development':5, - 'slaves':5 - } - } - ] - }), - new App.Corporate.Division.Working( { - 'id': 'Menial', - 'name': 'Menial Services', - 'focusDescription': 'offering menial services', - 'sizeCost': 6.5, - 'attrition': { - 'center':0.05, - 'range':0.2, - }, - 'maintenance':{ - 'linear': 0.2, - 'quadratic': 0.1, - 'category':'working', - }, - 'revenue':{ - 'center':1250, - 'range':0.2 - }, - 'founding':{ - 'corporateCash':20, - 'startingSize':20, - }, - 'slaveWorkDescription':{ - 'present':'exploiting', - 'future':'exploit', - 'past':'wore out', - 'market':'menial slave' - }, - 'merger':[ - { - 'name': 'slaveholding firm', - 'cost': 50, - 'text': { - 'trouble':"a minor slaveholding company. A major deal with a troubled government just fell through, and they had depended on it going through to an unwise degree. They need to merge with a larger slaving concern immediately, but there's nothing at all wrong with their significant inventory of slaves.", - 'acquire':", cash out its hapless staff, and absorb its stock into your corporation." - }, - 'result': { - 'development':5, - 'slaves':5 - } - } - ] - }), - new App.Corporate.Division.Working( { - 'id': 'Dairy', - 'name': 'Dairy', - 'focusDescription': 'milking slaves', - 'sizeCost': 15, - 'attrition': { - 'center':0.05, - 'range':0.2, - }, - 'maintenance':{ - 'linear': 0.85, - 'quadratic': 0.4, - 'category':'working', - }, - 'revenue':{ - 'center':3000, - 'range':0.2 - }, - 'founding':{ - 'corporateCash':25, - }, - 'slaveWorkDescription':{ - 'present':'milking', - 'future':'milk', - 'past':'ran dry', - 'market': 'cow' - }, - 'merger':[ - { - 'name': 'farm', - 'cost': 50, - 'text': { - 'trouble':"a dairy farm. Why a conventional dairy farm popped up as target confused you for a moment, but it quickly became clear the entire family was so deep in debt it would be a no brainer to buy the farm and start milking the large-uddered farmer's daughters as a great addition to your corporate dairy.", - 'acquire':" and your new slaves for the corporation. The family is not happy with your plans, but their approval is not required, you care only for their fluids." - }, - 'result': { - 'development':3, - 'slaves':3 - } - } - ] - }), - new App.Corporate.Division.Working( { - 'id': 'Whore', - 'name': 'Escort Service', - 'focusDescription': 'whoring out slaves', - 'sizeCost': 20, - 'attrition': { - 'center':0.05, - 'range':0.2, - }, - 'maintenance':{ - 'linear': 0.7, - 'quadratic': 0.25, - 'category':'working', - }, - 'revenue':{ - 'center':3000, - 'range':0.1 - }, - 'founding':{ - 'corporateCash':50, - }, - 'slaveWorkDescription':{ - 'present':'whoring out', - 'future':'whore out', - 'past':'lost their appeal', - 'market': 'trained whore' - }, - 'merger':[ - { - 'name': 'brothel', - 'cost': 50, - 'text': { - 'trouble':"a little brothel. With slave whores becoming the dominant force in sexual services the current madam lost her passion for the business. She's getting up there in age and has run a tight ship for many years so she deemed it the right time to bow out. All you need to do to add a new brothel location for your corporation is sign at the dotted line before anyone else has a chance to bite.", - 'acquire':" before anyone else can make an offer. The madam is surprised by your speed, but happily signs over the brothel." - }, - 'result': { - 'development':3, - 'slaves':3 - } - } - ] - }) - ]; - //divisionCategoriesList: Division maintenance categories are used to calculate the overhead that occurs from having multiple divisions within the same category. - // id: The identifier that will be used in division.maintenance.category - // freeDivisions: How many divisions must appear in this category before the overhead cost comes into play. For example, if this is 1, then the second division will cost divisionCost, and the third will bring the overhead up to four times divisionCost. - // divisionCost: How much to multiply the overhead by in cash. The first division past the free divisions will cost this much, but the value will increase exponentially. - // freeDevelopment: How many developments, totaled across all divisions in the category, are ignored by this category before overhead comes into play. Note: freeDivisions does *not* affect this; if freeDevelopment is 100 and freeDivisions is 1, if you only have a single division with 110 developments, you will be charged for the 10 developments over. - // developmentCost: How much to multiply the squared developments by, in cash. The first development past the ignored value will cost this much, but the cost increases exponentially. - //corporate: The corporate-wide overhead for divisions, beyond the individual categories. - // freeDivisions: How many total divisions, across all categories, are ignored before charging corporate level overhead. - // divisionCost: How much to multiply the square of counted divisions in cash. The first counted division will cost this much, but the value increases exponentially. - //Equations: - // divisionBaseOverhead = (divisions - freeDivisions) ^ 2 * divisionCost - // divisionOperationOverhead = (sum(development) - freeDevelopment) ^ 2 * developmentCost - // corpOverhead = (divisions - 2) ^ 2 * 10000 - App.Corporate.maintenance = { - divisionCategoriesList: [ - { - id:'acquision', - freeDivisions: 0, - divisionCost: 25000, - freeDevelopment: 100, - developmentCost: 2 - }, - { - id:'processing', - freeDivisions: 0, - divisionCost: 25000, - freeDevelopment: 200, - developmentCost: 1 - }, - { - id:'working', - freeDivisions: 1, - divisionCost: 15000, - freeDevelopment: 800, - developmentCost: 0.1 - }, - ], - corporate: { - freeDivisions: 2, - divisionCost: 10000 - } - }; + */ + App.Corporate.divisionList = [ + new App.Corporate.Division.Acquiring( { + 'id':'Extra', + 'name':'Extralegal Enslavement', + 'focusDescription':'capturing and enslaving prisoners', + 'sizeCost': 20, + 'slaveValue':10, + 'acquiring': { + 'center':1, + 'range': 0.8, + }, + 'maintenance':{ + 'linear': 7.5, + 'quadratic': 5, + 'category':'acquision', + }, + 'founding':{ + 'corporateCash':100, + }, + 'mercenaryHelp': { + 'level': 2, + 'cost': 0.05 + }, + 'nextDivision': [ + "Break", + "Arcade" + ], + 'merger':[ + { + 'name': 'mercenary company', + 'cost': 50, + 'text': { + 'trouble':'a troubled mercenary company. After a spate of failed operations, the rank and file deposed their management and are now looking to merge with a better-run organization. The old leadership did not engage in enslavement activities, but the mercenaries have decided to turn their talents towards slaving for profit in conflict zones.', + 'acquire':' and ease their transition to conflict zone slaving.' + }, + 'result': { + 'development': 5 + } + } + ] + }), + new App.Corporate.Division.Acquiring( { + 'id': 'Legal', + 'name': 'Legal Enslavement', + 'focusDescription': 'legal enslavement', + 'sizeCost': 25, + 'slaveValue':15, + 'acquiring': { + 'center':1, + 'range': 0.5, + }, + 'maintenance':{ + 'linear': 12, + 'quadratic': 6, + 'category':'acquision', + }, + 'founding':{ + 'corporateCash':125, + }, + 'nextDivision': [ + "Train", + "Menial", + "Surgery" + ], + 'merger':[ + { + 'name':'telemarketing firm', + 'cost': 50, + 'text': { + 'trouble':'an old world telemarketing firm. In an attempt to survive in the changing economy, it turned its focus towards convincing desperate, ignorant, or stupid people from the old world to accept voluntary enslavement, through a variety of entrapment procedures. It failed to make the transition successfully, but you could certainly continue its operations under your aegis.', + 'acquire':' and clean out the deadwood, getting the business in Free Cities shape.' + }, + 'result': { + 'development':5 + } + } + ] + }), + new App.Corporate.Division.Processing( { + 'id': 'Break', + 'name': 'Slave Breaking', + 'focusDescription': 'breaking slaves', + 'sizeCost': 10, + 'addedValue': 5, + 'processing': { + 'center':0.3, + 'range':0.3, + }, + 'maintenance':{ + 'linear': 0.45, + 'quadratic': 0.6, + 'category':'processing', + }, + 'founding':{ + 'corporateCash':25, + }, + 'slaveProcessType':{ + 'present':'break', + 'past':'broke' + }, + 'slaveProcessDescription':{ + 'present':'attempting to break', + 'future':'break', + 'past':'broken', + 'market': { + single: 'slave that needs breaking', + plural: 'slaves that need breaking' + } + }, + 'nextDivision': [ + "Train", + "Menial", + "Surgery" + ], + 'merger':[ + { + 'name': 'slave breaking facility', + 'cost': 50, + 'text': { + 'trouble':'a small slave breaking firm. Despite a great need for obedient slaves the owner of this little establishment was unable to turn a profit. The facility has everything a respecting slave breaking could ever need, it seems the owner simply lacked the right character to apply effective breaking techniques. Your corporation knows perfectly well what it takes to achieve obedience and the assets can be put to great use.', + 'acquire':' and staff it with qualified personnel to make use of the new assets.' + }, + 'result': { + 'development':5, + 'slaves':5 + } + } + ] + }), + new App.Corporate.Division.Processing( { + 'id': 'Surgery', + 'name': 'Slave Modifications', + 'focusDescription': 'physical slave modifications', + 'sizeCost': 20, + 'addedValue':8, + 'processing': { + 'center':0.5, + 'range':0.2, + }, + 'maintenance':{ + 'linear': 2.4, + 'quadratic': 1, + 'category':'processing', + }, + 'founding':{ + 'corporateCash':55, + }, + 'slaveProcessType':{ + 'present':'modify', + 'past':'finished working on' + }, + 'slaveProcessDescription':{ + 'present':'working on', + 'future':'work on', + 'past':'improved', + 'market': { + single: 'slave that could use some work done to their body', + plural: 'slaves that could use some work done to their bodies' + } + }, + 'nextDivision': [ + "Train", + "Dairy" + ], + 'merger':[ + { + 'name': 'medical clinic', + 'cost': 50, + 'text': { + 'trouble':"a small medical clinic. Medical malpractice continues to be a major source of trouble for surgeons in the old world. A plastic surgeon has just suffered defeat in a major legal case over implant ruptures. He's looking to make the transition to a more enlightened area, along with his inventory and staff.", + 'acquire':" and the surgeon decides to retire on the proceeds of the sale, wishing your corporation well. It was a smart decision; he can retire to the Free Cities on that sum of money, and remote surgery is killing surgeons' wages." + }, + 'result': { + 'development': 3, + 'slaves':3 + } + } + ] + }), + new App.Corporate.Division.Processing( { + 'id': 'Train', + 'name': 'Slave Training', + 'focusDescription': 'training slaves', + 'sizeCost': 25, + 'addedValue': 11, + 'processing': { + 'center':0.2, + 'range':0.3, + }, + 'maintenance':{ + 'linear': 0.7, + 'quadratic': 1, + 'category':'processing', + }, + 'founding':{ + 'corporateCash':50, + }, + 'slaveProcessType':{ + 'present':'train', + 'past':'trained' + }, + 'slaveProcessDescription':{ + 'present':'training', + 'future':'train', + 'past':'trained', + 'market': { + single: 'slave that needs slave training', + plural: 'slaves that need slave training' + } + }, + 'nextDivision': [ + "Whore" + ], + 'merger':[ + { + 'name': 'slave training firm', + 'cost': 50, + 'text': { + 'trouble':"a small slave training firm. Slave training is a notoriously difficult business, since the maturation times on the merchandise can be extremely long, and the improvement in price can be marginal if the training does not prove highly successful. There's nothing inherently wrong with the business, they've simply hit a cash flow bottleneck and need to merge with a cash-rich organization like yours.", + 'acquire':". The previous owners are happy they'll be able to continue operations under the aegis of a better-run, richer corporation." + }, + 'result': { + 'development': 3, + 'slaves':3 + } + } + ] + }), + new App.Corporate.Division.Working( { + 'id': 'Arcade', + 'name': 'Sex Arcades', + 'focusDescription': 'operating sex arcades', + 'sizeCost': 5, + 'attrition': { + 'center':0.05, + 'range':0.2, + }, + 'maintenance':{ + 'linear': 0.2, + 'quadratic': 0.125, + 'category':'working', + }, + 'revenue':{ + 'center':1000, + 'range':0.1 + }, + 'founding':{ + 'corporateCash':15, + 'startingSize':20, + }, + 'slaveWorkDescription':{ + 'present':'exploiting', + 'future':'exploit', + 'past':'wore out', + 'market': 'fresh slave' + }, + 'merger':[ + { + 'name': 'café', + 'cost': 50, + 'text': { + 'trouble':"a quaint maid café. The prime location together with a popular concept should make for a bustling business and yet the owner is looking to get out of the business hoping to salvage some of his savings. Sadly there was a lack of capital to employ attractive servant slave maids. While someone might very well be more than willing to come in and invest in some better slaves, the place is so cheap you could easily replace the furniture and use the current assets to create a new arcade location for your corporation instead.", + 'acquire':". The old owner wishes his slaves luck under the new management, not knowing your plans for the place. A new sex arcade under your corporate umbrella will open shortly." + }, + 'result': { + 'development':5, + 'slaves':5 + } + } + ] + }), + new App.Corporate.Division.Working( { + 'id': 'Menial', + 'name': 'Menial Services', + 'focusDescription': 'offering menial services', + 'sizeCost': 6.5, + 'attrition': { + 'center':0.05, + 'range':0.2, + }, + 'maintenance':{ + 'linear': 0.2, + 'quadratic': 0.1, + 'category':'working', + }, + 'revenue':{ + 'center':1250, + 'range':0.2 + }, + 'founding':{ + 'corporateCash':20, + 'startingSize':20, + }, + 'slaveWorkDescription':{ + 'present':'exploiting', + 'future':'exploit', + 'past':'wore out', + 'market':'menial slave' + }, + 'merger':[ + { + 'name': 'slaveholding firm', + 'cost': 50, + 'text': { + 'trouble':"a minor slaveholding company. A major deal with a troubled government just fell through, and they had depended on it going through to an unwise degree. They need to merge with a larger slaving concern immediately, but there's nothing at all wrong with their significant inventory of slaves.", + 'acquire':", cash out its hapless staff, and absorb its stock into your corporation." + }, + 'result': { + 'development':5, + 'slaves':5 + } + } + ] + }), + new App.Corporate.Division.Working( { + 'id': 'Dairy', + 'name': 'Dairy', + 'focusDescription': 'milking slaves', + 'sizeCost': 15, + 'attrition': { + 'center':0.05, + 'range':0.2, + }, + 'maintenance':{ + 'linear': 0.85, + 'quadratic': 0.4, + 'category':'working', + }, + 'revenue':{ + 'center':3000, + 'range':0.2 + }, + 'founding':{ + 'corporateCash':25, + }, + 'slaveWorkDescription':{ + 'present':'milking', + 'future':'milk', + 'past':'ran dry', + 'market': 'cow' + }, + 'merger':[ + { + 'name': 'farm', + 'cost': 50, + 'text': { + 'trouble':"a dairy farm. Why a conventional dairy farm popped up as target confused you for a moment, but it quickly became clear the entire family was so deep in debt it would be a no brainer to buy the farm and start milking the large-uddered farmer's daughters as a great addition to your corporate dairy.", + 'acquire':" and your new slaves for the corporation. The family is not happy with your plans, but their approval is not required, you care only for their fluids." + }, + 'result': { + 'development':3, + 'slaves':3 + } + } + ] + }), + new App.Corporate.Division.Working( { + 'id': 'Whore', + 'name': 'Escort Service', + 'focusDescription': 'whoring out slaves', + 'sizeCost': 20, + 'attrition': { + 'center':0.05, + 'range':0.2, + }, + 'maintenance':{ + 'linear': 0.7, + 'quadratic': 0.25, + 'category':'working', + }, + 'revenue':{ + 'center':3000, + 'range':0.1 + }, + 'founding':{ + 'corporateCash':50, + }, + 'slaveWorkDescription':{ + 'present':'whoring out', + 'future':'whore out', + 'past':'lost their appeal', + 'market': 'trained whore' + }, + 'merger':[ + { + 'name': 'brothel', + 'cost': 50, + 'text': { + 'trouble':"a little brothel. With slave whores becoming the dominant force in sexual services the current madam lost her passion for the business. She's getting up there in age and has run a tight ship for many years so she deemed it the right time to bow out. All you need to do to add a new brothel location for your corporation is sign at the dotted line before anyone else has a chance to bite.", + 'acquire':" before anyone else can make an offer. The madam is surprised by your speed, but happily signs over the brothel." + }, + 'result': { + 'development':3, + 'slaves':3 + } + } + ] + }) + ]; + //divisionCategoriesList: Division maintenance categories are used to calculate the overhead that occurs from having multiple divisions within the same category. + // id: The identifier that will be used in division.maintenance.category + // freeDivisions: How many divisions must appear in this category before the overhead cost comes into play. For example, if this is 1, then the second division will cost divisionCost, and the third will bring the overhead up to four times divisionCost. + // divisionCost: How much to multiply the overhead by in cash. The first division past the free divisions will cost this much, but the value will increase exponentially. + // freeDevelopment: How many developments, totaled across all divisions in the category, are ignored by this category before overhead comes into play. Note: freeDivisions does *not* affect this; if freeDevelopment is 100 and freeDivisions is 1, if you only have a single division with 110 developments, you will be charged for the 10 developments over. + // developmentCost: How much to multiply the squared developments by, in cash. The first development past the ignored value will cost this much, but the cost increases exponentially. + //corporate: The corporate-wide overhead for divisions, beyond the individual categories. + // freeDivisions: How many total divisions, across all categories, are ignored before charging corporate level overhead. + // divisionCost: How much to multiply the square of counted divisions in cash. The first counted division will cost this much, but the value increases exponentially. + //Equations: + // divisionBaseOverhead = (divisions - freeDivisions) ^ 2 * divisionCost + // divisionOperationOverhead = (sum(development) - freeDevelopment) ^ 2 * developmentCost + // corpOverhead = (divisions - 2) ^ 2 * 10000 + App.Corporate.maintenance = { + divisionCategoriesList: [ + { + id:'acquision', + freeDivisions: 0, + divisionCost: 25000, + freeDevelopment: 100, + developmentCost: 2 + }, + { + id:'processing', + freeDivisions: 0, + divisionCost: 25000, + freeDevelopment: 200, + developmentCost: 1 + }, + { + id:'working', + freeDivisions: 1, + divisionCost: 15000, + freeDevelopment: 800, + developmentCost: 0.1 + }, + ], + corporate: { + freeDivisions: 2, + divisionCost: 10000 + } + }; }; diff --git a/src/Corporation/corporate-divisionAcquiring.js b/src/Corporation/corporate-divisionAcquiring.js index bdf5a516446dc6e42096050d5c1e62bb7676316d..af87a640601ab0a7e477b3c6354d1da8ba60e0dd 100644 --- a/src/Corporation/corporate-divisionAcquiring.js +++ b/src/Corporation/corporate-divisionAcquiring.js @@ -1,89 +1,89 @@ App.Corporate.Init_DivisionAcquiring = function(shared) { - App.Corporate.Division.Acquiring = class extends App.Corporate.Division.Base { - constructor({slaveValue, acquiring, mercenaryHelp, nextDivision}) { - super(arguments[0]); - this._const.slaveValue = slaveValue; - this._const.acquiring = new averageRange(acquiring); - this._const.nextDivisions = nextDivision; - if(mercenaryHelp != null) { - this._const.mercenaryHelp = { - level: mercenaryHelp.level, - cost: mercenaryHelp.cost - } - } - } - //abstract virtual definitions - get fromMarket() { return false; } - get toMarket() { return true; } - get heldSlaves() { return this.getStored("Slaves"); } - set heldSlaves(value) { this.setStored("Slaves",Math.trunc(value)); } - get activeSlaves() { return 0; } - set activeSlaves(value) { throw "Cannot set active slaves for acquiring divisions"; } - get processRate() { return this._const.acquiring.center; } - get purchasedSlaveValue() { return null; } - get initialSlaveValue() { return this.soldSlaveValue; } - get soldSlaveValue() { return this._const.slaveValue; } - get nounFinishedSlave() { return "slave"; } - get nounSlaveFromMarket() { return "slave"; } - messageSlaveCount() { - return `It averages <span class="green">${numberWithPluralNonZero(this.developmentCount, "new slave")}</span> each week.`; - } - messageSlaveOutput() { - return shared.MessageSlaveToMarket(this); - } - message_endWeek_Slaves(divLedger) { - let newSlaves = divLedger.slaves.value; - if(newSlaves > 0) { - return `<span class="green">acquired ${numberWithPlural(newSlaves, "slave")}</span>` - + (this.hadMercenaryHelp ? " with the help of your mercenaries" : ""); - } - else { - return `<span class="red">failed to acquire any slaves</span>` - + (this.hadMercenaryHelp ? " even with the help of your mercenaries" : ""); - } - } - endWeek_Slaves(divLedger) { - let slaves = shared.EndWeekProcessing_Slaves(this.developmentCount, this._const.acquiring); - this.heldSlaves += slaves.value; - return divLedger.slaves.apply(slaves); - } - //virtual overrides - get purchasedSlaveValue() { - return null; - } - get nextDivisions() { return this._const.nextDivisions; } - dissolve() { - App.Corporate.sellSlaves(this, this.heldSlaves); - super.dissolve(); - delete V[`${this._const.corpId}Slaves`]; - } - getAutoBuyFromMarket() { - return false; - } - setAutoBuyFromMarket(value) { - throw "Acquiring divisions cannot acquire from the market"; - } + App.Corporate.Division.Acquiring = class extends App.Corporate.Division.Base { + constructor({slaveValue, acquiring, mercenaryHelp, nextDivision}) { + super(arguments[0]); + this._const.slaveValue = slaveValue; + this._const.acquiring = new averageRange(acquiring); + this._const.nextDivisions = nextDivision; + if(mercenaryHelp != null) { + this._const.mercenaryHelp = { + level: mercenaryHelp.level, + cost: mercenaryHelp.cost + } + } + } + //abstract virtual definitions + get fromMarket() { return false; } + get toMarket() { return true; } + get heldSlaves() { return this.getStored("Slaves"); } + set heldSlaves(value) { this.setStored("Slaves",Math.trunc(value)); } + get activeSlaves() { return 0; } + set activeSlaves(value) { throw "Cannot set active slaves for acquiring divisions"; } + get processRate() { return this._const.acquiring.center; } + get purchasedSlaveValue() { return null; } + get initialSlaveValue() { return this.soldSlaveValue; } + get soldSlaveValue() { return this._const.slaveValue; } + get nounFinishedSlave() { return "slave"; } + get nounSlaveFromMarket() { return "slave"; } + messageSlaveCount() { + return `It averages <span class="green">${numberWithPluralNonZero(this.developmentCount, "new slave")}</span> each week.`; + } + messageSlaveOutput() { + return shared.MessageSlaveToMarket(this); + } + message_endWeek_Slaves(divLedger) { + let newSlaves = divLedger.slaves.value; + if(newSlaves > 0) { + return `<span class="green">acquired ${numberWithPlural(newSlaves, "slave")}</span>` + + (this.hadMercenaryHelp ? " with the help of your mercenaries" : ""); + } + else { + return `<span class="red">failed to acquire any slaves</span>` + + (this.hadMercenaryHelp ? " even with the help of your mercenaries" : ""); + } + } + endWeek_Slaves(divLedger) { + let slaves = shared.EndWeekProcessing_Slaves(this.developmentCount, this._const.acquiring); + this.heldSlaves += slaves.value; + return divLedger.slaves.apply(slaves); + } + //virtual overrides + get purchasedSlaveValue() { + return null; + } + get nextDivisions() { return this._const.nextDivisions; } + dissolve() { + App.Corporate.sellSlaves(this, this.heldSlaves); + super.dissolve(); + delete V[`${this._const.corpId}Slaves`]; + } + getAutoBuyFromMarket() { + return false; + } + setAutoBuyFromMarket(value) { + throw "Acquiring divisions cannot acquire from the market"; + } - get availableRoom() { return 0; } - get maintenanceSlaves() { return this.developmentCount; } - get maintenanceCost() { - //If it makes sense to have mercenaries help with other types of divisions, this code and the mercenaryHelp property will need to be moved into the super class. - let baseCost = super.maintenanceCost; + get availableRoom() { return 0; } + get maintenanceSlaves() { return this.developmentCount; } + get maintenanceCost() { + //If it makes sense to have mercenaries help with other types of divisions, this code and the mercenaryHelp property will need to be moved into the super class. + let baseCost = super.maintenanceCost; - if(this.hadMercenaryHelp) { - const mercHelpCost = Math.trunc((V.mercenaries - this.mercenaryHelp.level) * this.mercenaryHelp.cost * 1000); - baseCost += mercHelpCost; - } - return baseCost; - } + if(this.hadMercenaryHelp) { + const mercHelpCost = Math.trunc((V.mercenaries - this.mercenaryHelp.level) * this.mercenaryHelp.cost * 1000); + baseCost += mercHelpCost; + } + return baseCost; + } - create() { - super.create(); - this.heldSlaves = 0; - shared.FoundingSetupAutoSell(this); - } + create() { + super.create(); + this.heldSlaves = 0; + shared.FoundingSetupAutoSell(this); + } - get hadMercenaryHelp() { return this.mercenaryHelp != null && V.mercenaries > this.mercenaryHelp.level;} - }; + get hadMercenaryHelp() { return this.mercenaryHelp != null && V.mercenaries > this.mercenaryHelp.level;} + }; } diff --git a/src/Corporation/corporate-divisionBase.js b/src/Corporation/corporate-divisionBase.js index 90de97fd5715b016bd0eccdc3e8aa1d621a13739..871978c60ae42dddb6c41583269ef8f65c6b7f3b 100644 --- a/src/Corporation/corporate-divisionBase.js +++ b/src/Corporation/corporate-divisionBase.js @@ -1,204 +1,204 @@ App.Corporate.Init_DivisionBase = function(shared) { - App.Corporate.Division.Base = class { - constructor({id, name, focusDescription, sizeCost, maintenance, founding, merger}) { - this._const = {}; - this._const.id = id; - this._const.corpId = `corpDiv${capFirstChar(id)}`; - this._const.cost = sizeCost; - this._const.name = name; - this._const.focusDescription = focusDescription; - this._const.maintenance = { - quadratic: maintenance.quadratic, - linear: maintenance.linear, - category: maintenance.category - }; - if(founding != null) { - this._const.founding = new shared.FoundingType(this, founding); - } - if(merger != null && _.isObject(merger) || (Array.isArray(merger) && merger.length > 0)) { - if(!Array.isArray(merger)) { - merger = [merger]; - } - this._const.merger = merger; - } - this.relatedDivisions = new shared.RelatedDivisionType(); - } - //initialized data - get id() { return this._const.id; } - get sizeCost() { return this._const.cost; } - get name() { return this._const.name; } - get focusDescription() { return this._const.focusDescription; } - get founding() { return this._const.founding; } - get nextDivisions() { return null; } - get hasMergers() { return this._const.merger != null; } - get mergerChoices() { return this._const.merger; } - get maintenanceCategory() { return this._const.maintenance.category; } + App.Corporate.Division.Base = class { + constructor({id, name, focusDescription, sizeCost, maintenance, founding, merger}) { + this._const = {}; + this._const.id = id; + this._const.corpId = `corpDiv${capFirstChar(id)}`; + this._const.cost = sizeCost; + this._const.name = name; + this._const.focusDescription = focusDescription; + this._const.maintenance = { + quadratic: maintenance.quadratic, + linear: maintenance.linear, + category: maintenance.category + }; + if(founding != null) { + this._const.founding = new shared.FoundingType(this, founding); + } + if(merger != null && _.isObject(merger) || (Array.isArray(merger) && merger.length > 0)) { + if(!Array.isArray(merger)) { + merger = [merger]; + } + this._const.merger = merger; + } + this.relatedDivisions = new shared.RelatedDivisionType(); + } + //initialized data + get id() { return this._const.id; } + get sizeCost() { return this._const.cost; } + get name() { return this._const.name; } + get focusDescription() { return this._const.focusDescription; } + get founding() { return this._const.founding; } + get nextDivisions() { return null; } + get hasMergers() { return this._const.merger != null; } + get mergerChoices() { return this._const.merger; } + get maintenanceCategory() { return this._const.maintenance.category; } - //stored variables - get founded() { return this.getStored('') == 1; } - get foundedDate() { return this.getStored('Founded');} - get developmentCount() { return this.getStored("Dev"); } - set developmentCount(value) { - if(value < 0) throw "Cannot set development count to less than 0"; - //dissolve is the only function that sets founded to false. - if(value == 0 && this.founded) throw "Cannot set development count to 0; use dissolve instead."; - this.setStored("Dev", value); - } + //stored variables + get founded() { return this.getStored('') == 1; } + get foundedDate() { return this.getStored('Founded');} + get developmentCount() { return this.getStored("Dev"); } + set developmentCount(value) { + if(value < 0) throw "Cannot set development count to less than 0"; + //dissolve is the only function that sets founded to false. + if(value == 0 && this.founded) throw "Cannot set development count to 0; use dissolve instead."; + this.setStored("Dev", value); + } - //calculated - get availableRoom() { return Math.max(0, this.developmentCount - this.activeSlaves); } - get maintenanceCost() { - return Math.trunc( this._const.maintenance.linear * 1000 * this.developmentCount - + this._const.maintenance.quadratic * Math.pow(this.activeSlaves, 2)); - } - get foundingCostDivision() { return this._const.founding.size * this.sizeCost; } - get foundingCost() { return this.foundingCostDivision; } - get canFoundCorporation() { return this._const.founding != null; } - get foundingCash() { - if(!this.canFoundCorporation) throw `${this.name} is not set up found a corporation` - return 1000 * this._const.founding.startingPrice; - } - get value() { - const developmentValue = this.developmentCount * this.sizeCost * 800; - let slaveProcValue = 0; - let slaveHeldValue = 0; + //calculated + get availableRoom() { return Math.max(0, this.developmentCount - this.activeSlaves); } + get maintenanceCost() { + return Math.trunc( this._const.maintenance.linear * 1000 * this.developmentCount + + this._const.maintenance.quadratic * Math.pow(this.activeSlaves, 2)); + } + get foundingCostDivision() { return this._const.founding.size * this.sizeCost; } + get foundingCost() { return this.foundingCostDivision; } + get canFoundCorporation() { return this._const.founding != null; } + get foundingCash() { + if(!this.canFoundCorporation) throw `${this.name} is not set up found a corporation` + return 1000 * this._const.founding.startingPrice; + } + get value() { + const developmentValue = this.developmentCount * this.sizeCost * 800; + let slaveProcValue = 0; + let slaveHeldValue = 0; - if(this.activeSlaves > 0) - slaveProcValue = this.activeSlaves * this.purchasedSlaveValue * 1000; - if(this.heldSlaves > 0) - slaveHeldValue = this.heldSlaves * this.soldSlaveValue * 1000; + if(this.activeSlaves > 0) + slaveProcValue = this.activeSlaves * this.purchasedSlaveValue * 1000; + if(this.heldSlaves > 0) + slaveHeldValue = this.heldSlaves * this.soldSlaveValue * 1000; - return developmentValue + slaveProcValue + slaveHeldValue; - } + return developmentValue + slaveProcValue + slaveHeldValue; + } - //abstract virtual - get fromMarket() { throw "Must be defined"; } - get toMarket() { throw "Must be defined"; } - get heldSlaves() { throw "Must be defined"; } - set heldSlaves(value) { throw "Must be defined"; } - get activeSlaves() { throw "Must be defined"; } - set activeSlaves(value) { throw "Must be defined"; } - get processRate() { throw "Must be defined"; } - get initialSlaveValue() { throw "Must be defined"; } - get soldSlaveValue() { throw "Must be defined"; } - get slaveAction() { throw "Must be defined"; } - get nounFinishedSlave() { throw "Must be defined"; } - get nounSlaveFromMarket() { throw "Must be defined"; } - messageSlaveCount() { throw "Must be defined"; } - messageSlaveOutput() { throw "Must be defined"; } - message_endWeek_Slaves(divLedger) { throw "Must be defined"; } - endWeek_Slaves(ledger, divLedger) { throw "Must be defined"; } + //abstract virtual + get fromMarket() { throw "Must be defined"; } + get toMarket() { throw "Must be defined"; } + get heldSlaves() { throw "Must be defined"; } + set heldSlaves(value) { throw "Must be defined"; } + get activeSlaves() { throw "Must be defined"; } + set activeSlaves(value) { throw "Must be defined"; } + get processRate() { throw "Must be defined"; } + get initialSlaveValue() { throw "Must be defined"; } + get soldSlaveValue() { throw "Must be defined"; } + get slaveAction() { throw "Must be defined"; } + get nounFinishedSlave() { throw "Must be defined"; } + get nounSlaveFromMarket() { throw "Must be defined"; } + messageSlaveCount() { throw "Must be defined"; } + messageSlaveOutput() { throw "Must be defined"; } + message_endWeek_Slaves(divLedger) { throw "Must be defined"; } + endWeek_Slaves(ledger, divLedger) { throw "Must be defined"; } - //The value of a slave ignoring enhancements from founded divisions - //The actual value of a slave after all improvements - get purchasedSlaveValue() { - let cheapest = { 'value':Number.MAX_VALUE, 'div': null}; - let expensive = { 'value': 0 , 'div': null}; - for(let fromDiv of this.relatedDivisions.from) { - let initialValue = fromDiv.initialSlaveValue; - if(initialValue < cheapest.value) { - cheapest.value = initialValue; - cheapest.div = fromDiv; - } - if(fromDiv.founded) { - let soldValue = fromDiv.soldSlaveValue; - if(soldValue > expensive.value) { - expensive.value = soldValue; - expensive.div = fromDiv; - } - } - } - if(expensive.div != null && expensive.value != cheapest.value) { - //The added value of an owned intermediary takes time to work its way through this division to the next - let expensiveDiv = expensive.div; - let valueDiff = expensive.value - cheapest.value; - let weeksSinceFounding = V.week - (expensiveDiv.foundedDate || 0); - let weeksToProcess = 10 * expensiveDiv.processRate; - let multiplier = Math.min(weeksSinceFounding / weeksToProcess, 1); - let finalAddedValue = valueDiff * multiplier; - return cheapest.value + finalAddedValue; - } - else if(cheapest.div != null) { - return cheapest.value; - } - throw "No route to acquisition found."; - } - get maintenanceSlaves() { return this.activeSlaves * this.processRate; } - getDisplayMaintenanceCost() { - const cost = this.maintenanceCost; - const processedCount = this.maintenanceSlaves; + //The value of a slave ignoring enhancements from founded divisions + //The actual value of a slave after all improvements + get purchasedSlaveValue() { + let cheapest = { 'value':Number.MAX_VALUE, 'div': null}; + let expensive = { 'value': 0 , 'div': null}; + for(let fromDiv of this.relatedDivisions.from) { + let initialValue = fromDiv.initialSlaveValue; + if(initialValue < cheapest.value) { + cheapest.value = initialValue; + cheapest.div = fromDiv; + } + if(fromDiv.founded) { + let soldValue = fromDiv.soldSlaveValue; + if(soldValue > expensive.value) { + expensive.value = soldValue; + expensive.div = fromDiv; + } + } + } + if(expensive.div != null && expensive.value != cheapest.value) { + //The added value of an owned intermediary takes time to work its way through this division to the next + let expensiveDiv = expensive.div; + let valueDiff = expensive.value - cheapest.value; + let weeksSinceFounding = V.week - (expensiveDiv.foundedDate || 0); + let weeksToProcess = 10 * expensiveDiv.processRate; + let multiplier = Math.min(weeksSinceFounding / weeksToProcess, 1); + let finalAddedValue = valueDiff * multiplier; + return cheapest.value + finalAddedValue; + } + else if(cheapest.div != null) { + return cheapest.value; + } + throw "No route to acquisition found."; + } + get maintenanceSlaves() { return this.activeSlaves * this.processRate; } + getDisplayMaintenanceCost() { + const cost = this.maintenanceCost; + const processedCount = this.maintenanceSlaves; - return { cost, perUnit: cost / processedCount }; - } - getAutoSendToDivision(division) { - return !App.Corporate.ownsIntermediaryDivision(this, division) - && this.getStored(`To${division.id}`) == 1; - } - setAutoSendToDivision(division, value) { - this.setStored(`To${division.id}`, value ? 1 : 0); - } - getAutoSendToMarket() { - return this.getStored("ToMarket") == 1; - } - setAutoSendToMarket(value) { - this.setStored("ToMarket", value ? 1 : 0); - } - getAutoBuyFromMarket() { - return this.getStored("FromMarket"); - } - setAutoBuyFromMarket(value) { - this.setStored("FromMarket", value ? 1 : 0); - } - endweek_Revenue(divLedger) { - //Unless otherwise specified, divisions don't produce revenue directly. - } - endWeek_Transfer(divLedger) { - let transferRetval = { total:0 }; - let divisions = []; - for(let otherDiv of this.relatedDivisions.to.filter(div=> div.founded && this.getAutoSendToDivision(div))) { - const otherLedger = divLedger.weekLedger.getDivision(otherDiv); + return { cost, perUnit: cost / processedCount }; + } + getAutoSendToDivision(division) { + return !App.Corporate.ownsIntermediaryDivision(this, division) + && this.getStored(`To${division.id}`) == 1; + } + setAutoSendToDivision(division, value) { + this.setStored(`To${division.id}`, value ? 1 : 0); + } + getAutoSendToMarket() { + return this.getStored("ToMarket") == 1; + } + setAutoSendToMarket(value) { + this.setStored("ToMarket", value ? 1 : 0); + } + getAutoBuyFromMarket() { + return this.getStored("FromMarket"); + } + setAutoBuyFromMarket(value) { + this.setStored("FromMarket", value ? 1 : 0); + } + endweek_Revenue(divLedger) { + //Unless otherwise specified, divisions don't produce revenue directly. + } + endWeek_Transfer(divLedger) { + let transferRetval = { total:0 }; + let divisions = []; + for(let otherDiv of this.relatedDivisions.to.filter(div=> div.founded && this.getAutoSendToDivision(div))) { + const otherLedger = divLedger.weekLedger.getDivision(otherDiv); - const room = otherDiv.availableRoom - otherLedger.transfer.in; - if(room == 0) continue; - divisions.push({division: otherDiv, room}); - } - const fillDivisions = evenFillArray(divisions, this.heldSlaves, pair=>pair.room); - for(const filled of fillDivisions) { - const division = filled.item.division; - const value = filled.value; - divLedger.transfer.addDivision(division, value); - } + const room = otherDiv.availableRoom - otherLedger.transfer.in; + if(room == 0) continue; + divisions.push({division: otherDiv, room}); + } + const fillDivisions = evenFillArray(divisions, this.heldSlaves, pair=>pair.room); + for(const filled of fillDivisions) { + const division = filled.item.division; + const value = filled.value; + divLedger.transfer.addDivision(division, value); + } - } - endWeek_Market(divLedger) { - if(this.getAutoSendToMarket()) { - divLedger.market.sell = this.heldSlaves - divLedger.transfer.total; - } - if(this.getAutoBuyFromMarket()) { - divLedger.market.buy = this.availableRoom - divLedger.transfer.in; - } - shared.SellUnhousedSlaves(this, divLedger, this.processRate); - } + } + endWeek_Market(divLedger) { + if(this.getAutoSendToMarket()) { + divLedger.market.sell = this.heldSlaves - divLedger.transfer.total; + } + if(this.getAutoBuyFromMarket()) { + divLedger.market.buy = this.availableRoom - divLedger.transfer.in; + } + shared.SellUnhousedSlaves(this, divLedger, this.processRate); + } - create() { - if(this.founded) throw `${this.name} has already been founded.`; + create() { + if(this.founded) throw `${this.name} has already been founded.`; - App.Corporate.expandedDivision(); - App.Corporate.chargeAsset(this.foundingCostDivision * 1000, "development"); - this.setStored('', 1); - this.developmentCount = this._const.founding.size; - this.setStored('Founded', V.week); - } - dissolve() { - this.setStored('', 0); - App.Corporate.sellDevelopment(this); - App.Corporate.dissolvedDivision(); - this.relatedDivisions.to.forEach(nextDep => delete V[`${this._const.corpId}To${nextDep.id}`]); - } + App.Corporate.expandedDivision(); + App.Corporate.chargeAsset(this.foundingCostDivision * 1000, "development"); + this.setStored('', 1); + this.developmentCount = this._const.founding.size; + this.setStored('Founded', V.week); + } + dissolve() { + this.setStored('', 0); + App.Corporate.sellDevelopment(this); + App.Corporate.dissolvedDivision(); + this.relatedDivisions.to.forEach(nextDep => delete V[`${this._const.corpId}To${nextDep.id}`]); + } - //private helpers - getStored(key ) { return V[this._const.corpId + key]; } - setStored(key, value) { V[this._const.corpId + key] = value; } - }; + //private helpers + getStored(key ) { return V[this._const.corpId + key]; } + setStored(key, value) { V[this._const.corpId + key] = value; } + }; } diff --git a/src/Corporation/corporate-divisionProcessing.js b/src/Corporation/corporate-divisionProcessing.js index a5870ac1cb2d82c71067774ecc44a8ea783b16e6..28f72f12475f7fe720f57b83deda9652b9cd5a4f 100644 --- a/src/Corporation/corporate-divisionProcessing.js +++ b/src/Corporation/corporate-divisionProcessing.js @@ -1,93 +1,93 @@ App.Corporate.Init_DivisionProcessing = function(shared) { - App.Corporate.Division.Processing = class extends App.Corporate.Division.Base { - constructor({founding, addedValue, processing, nextDivision, slaveProcessType, slaveProcessDescription}) { - super(arguments[0]); - this._const.addedValue = addedValue; - this._const.processing = new averageRange(processing); - this._const.nextDivisions = nextDivision; - this._const.slaveProcessType = slaveProcessType; - this._const.slaveProcessDescription = slaveProcessDescription; - } + App.Corporate.Division.Processing = class extends App.Corporate.Division.Base { + constructor({founding, addedValue, processing, nextDivision, slaveProcessType, slaveProcessDescription}) { + super(arguments[0]); + this._const.addedValue = addedValue; + this._const.processing = new averageRange(processing); + this._const.nextDivisions = nextDivision; + this._const.slaveProcessType = slaveProcessType; + this._const.slaveProcessDescription = slaveProcessDescription; + } - //abstract virtual definitions - get fromMarket() { return true; } - get toMarket() { return true; } - get heldSlaves() { return this.getStored("Slaves2" ); } - set heldSlaves(value) { this.setStored("Slaves2", Math.trunc(value)); } - get activeSlaves() { return this.getStored("Slaves" ); } - set activeSlaves(value) { this.setStored("Slaves" , Math.trunc(value)); } - get processRate() { return this._const.processing.center; } - get soldSlaveValue() { - //TODO: find a way to cache this. - return this.purchasedSlaveValue + this._const.addedValue; - } - get slaveAction() { - return this._const.slaveProcessDescription; - } - get nounFinishedSlave() { return `${this._const.slaveProcessDescription.past} slave`; } - get nounSlaveFromMarket() { return this._const.slaveProcessDescription.market; } - messageSlaveCount() { - return shared.MessageProcessedSlaves(this, `can ${this._const.slaveProcessType.present}`, 'green'); - } - messageSlaveOutput() { - return shared.MessageSlaveToMarket(this); - } - message_endWeek_Slaves(divLedger) { - let newSlaves = divLedger.slaves.value; - //The division - let retval = this._const.slaveProcessType.past; //exploited - if(newSlaves <= 0) { - retval += " <span class='red'>none of its slaves</span>"; - } - else { - retval += ` <span class="green">${numberWithPlural(newSlaves, 'slave')}</span>`; - } - retval += ". The division "; - if(this.activeSlaves) { - retval += `is still ${this._const.slaveProcessDescription.present} ${numberWithPlural(this.activeSlaves, "slave")}`; - } - else { - retval += `doesn't have any slaves to ${this._const.slaveProcessDescription.future}`; - } - return retval; - } - endWeek_Slaves(divLedger) { - let slaves = shared.EndWeekProcessing_Slaves(this.activeSlaves, this._const.processing); - this.activeSlaves -= slaves.value; - this.heldSlaves += slaves.value; - return divLedger.slaves.apply(slaves); - } - get initialSlaveValue() { - const values = this.relatedDivisions.from - .map(fromDiv => fromDiv.initialSlaveValue); - if(values.length == 0) throw "No route to acquisition found."; - return Math.min(...values) + this._const.addedValue; - } - //virtual override - get nextDivisions() { return this._const.nextDivisions; } - get developmentCount() { return super.developmentCount; } - set developmentCount(value) { - super.developmentCount = value; - shared.SellOverflowSlaves(this); - } - dissolve() { - App.Corporate.sellSlaves(this, this.heldSlaves); - super.dissolve(); - delete V[this._const.corpId + "Slaves"]; - delete V[this._const.corpId + "Slaves2"]; - } + //abstract virtual definitions + get fromMarket() { return true; } + get toMarket() { return true; } + get heldSlaves() { return this.getStored("Slaves2" ); } + set heldSlaves(value) { this.setStored("Slaves2", Math.trunc(value)); } + get activeSlaves() { return this.getStored("Slaves" ); } + set activeSlaves(value) { this.setStored("Slaves" , Math.trunc(value)); } + get processRate() { return this._const.processing.center; } + get soldSlaveValue() { + //TODO: find a way to cache this. + return this.purchasedSlaveValue + this._const.addedValue; + } + get slaveAction() { + return this._const.slaveProcessDescription; + } + get nounFinishedSlave() { return `${this._const.slaveProcessDescription.past} slave`; } + get nounSlaveFromMarket() { return this._const.slaveProcessDescription.market; } + messageSlaveCount() { + return shared.MessageProcessedSlaves(this, `can ${this._const.slaveProcessType.present}`, 'green'); + } + messageSlaveOutput() { + return shared.MessageSlaveToMarket(this); + } + message_endWeek_Slaves(divLedger) { + let newSlaves = divLedger.slaves.value; + //The division + let retval = this._const.slaveProcessType.past; //exploited + if(newSlaves <= 0) { + retval += " <span class='red'>none of its slaves</span>"; + } + else { + retval += ` <span class="green">${numberWithPlural(newSlaves, 'slave')}</span>`; + } + retval += ". The division "; + if(this.activeSlaves) { + retval += `is still ${this._const.slaveProcessDescription.present} ${numberWithPlural(this.activeSlaves, "slave")}`; + } + else { + retval += `doesn't have any slaves to ${this._const.slaveProcessDescription.future}`; + } + return retval; + } + endWeek_Slaves(divLedger) { + let slaves = shared.EndWeekProcessing_Slaves(this.activeSlaves, this._const.processing); + this.activeSlaves -= slaves.value; + this.heldSlaves += slaves.value; + return divLedger.slaves.apply(slaves); + } + get initialSlaveValue() { + const values = this.relatedDivisions.from + .map(fromDiv => fromDiv.initialSlaveValue); + if(values.length == 0) throw "No route to acquisition found."; + return Math.min(...values) + this._const.addedValue; + } + //virtual override + get nextDivisions() { return this._const.nextDivisions; } + get developmentCount() { return super.developmentCount; } + set developmentCount(value) { + super.developmentCount = value; + shared.SellOverflowSlaves(this); + } + dissolve() { + App.Corporate.sellSlaves(this, this.heldSlaves); + super.dissolve(); + delete V[this._const.corpId + "Slaves"]; + delete V[this._const.corpId + "Slaves2"]; + } - get foundingCostSlaves() { return this._const.founding.size * this.purchasedSlaveValue; } - get foundingCost() { return this.foundingCostDivision + this.foundingCostSlaves; } - create() { - super.create(); - App.Corporate.chargeAsset(this.foundingCostSlaves * 1000, "slaves"); - this.activeSlaves = this._const.founding.size; - this.heldSlaves = 0; - shared.FoundingSetupAutoBuy(this); - shared.FoundingSetupAutoSell(this); - } - }; + get foundingCostSlaves() { return this._const.founding.size * this.purchasedSlaveValue; } + get foundingCost() { return this.foundingCostDivision + this.foundingCostSlaves; } + create() { + super.create(); + App.Corporate.chargeAsset(this.foundingCostSlaves * 1000, "slaves"); + this.activeSlaves = this._const.founding.size; + this.heldSlaves = 0; + shared.FoundingSetupAutoBuy(this); + shared.FoundingSetupAutoSell(this); + } + }; } diff --git a/src/Corporation/corporate-divisionWorking.js b/src/Corporation/corporate-divisionWorking.js index 1cbd33e232a6621060f31696f41bf2d7034d1ffb..7059f8bcdb92cbc1db7cc26c1c0609fce7a5bb16 100644 --- a/src/Corporation/corporate-divisionWorking.js +++ b/src/Corporation/corporate-divisionWorking.js @@ -1,95 +1,95 @@ App.Corporate.Init_DivisionWorking = function(shared) { - App.Corporate.Division.Working = class extends App.Corporate.Division.Base { - constructor({founding, attrition, revenue, slaveWorkDescription}) { - super(arguments[0]); - this._const.attrition = new averageRange(attrition); - this._const.revenue = new averageRange(revenue); - this._const.slaveWorkDescription = slaveWorkDescription; - } + App.Corporate.Division.Working = class extends App.Corporate.Division.Base { + constructor({founding, attrition, revenue, slaveWorkDescription}) { + super(arguments[0]); + this._const.attrition = new averageRange(attrition); + this._const.revenue = new averageRange(revenue); + this._const.slaveWorkDescription = slaveWorkDescription; + } - //abstract virtual definitions - get fromMarket() { return true; } - get toMarket() { return false; } - get heldSlaves() { return 0; } - set heldSlaves(value) { throw "Cannot set held slaves of working division"; } - get activeSlaves() { return this.getStored("Slaves"); } - set activeSlaves(value) { this.setStored("Slaves", Math.trunc(value)); } - get processRate() { return this._const.attrition.center; } - get initialSlaveValue() { return null; } - get soldSlaveValue() { return null; } - get slaveAction() { - return this._const.slaveWorkDescription; - } - get nounFinishedSlave() { throw "Cannot get finished slave in working division, since they don't produce finished slaves."; } - get nounSlaveFromMarket() { return this._const.slaveWorkDescription.market; } - messageSlaveCount() { - return shared.MessageProcessedSlaves(this, `has to replace`, 'red'); - } - messageSlaveOutput() { - /* TODO: originally some divisions had a slight description for what the work was; ie, "the escorts generate" */ - return `The division generates <span class="yellowgreen">${cashFormat(this.slaveRevenue)}</span> per slave on average.`; - } - endWeek_Slaves(divLedger) { - let slaves = shared.EndWeekProcessing_Slaves(this.activeSlaves, this._const.attrition); - this.activeSlaves -= slaves.value; - return divLedger.slaves.apply(slaves); - } - message_endWeek_Slaves(divLedger) { - let lostSlaves = divLedger.slaves.value; - let retval = '';//The division - if(this.activeSlaves <= 0) { - retval += `has <span class="red">no slaves</span> to ${this._const.slaveWorkDescription.future}`; - } - else { - retval += `is ${this._const.slaveWorkDescription.present} <span class="green">${numberWithPlural(this.activeSlaves, 'slave')}</span>`; - } - if(lostSlaves > 0) { - retval += `. During operations <span class="red">${numberWithPlural(lostSlaves, 'slave')}</span> ${this._const.slaveWorkDescription.past}`; - } - return retval; - } + //abstract virtual definitions + get fromMarket() { return true; } + get toMarket() { return false; } + get heldSlaves() { return 0; } + set heldSlaves(value) { throw "Cannot set held slaves of working division"; } + get activeSlaves() { return this.getStored("Slaves"); } + set activeSlaves(value) { this.setStored("Slaves", Math.trunc(value)); } + get processRate() { return this._const.attrition.center; } + get initialSlaveValue() { return null; } + get soldSlaveValue() { return null; } + get slaveAction() { + return this._const.slaveWorkDescription; + } + get nounFinishedSlave() { throw "Cannot get finished slave in working division, since they don't produce finished slaves."; } + get nounSlaveFromMarket() { return this._const.slaveWorkDescription.market; } + messageSlaveCount() { + return shared.MessageProcessedSlaves(this, `has to replace`, 'red'); + } + messageSlaveOutput() { + /* TODO: originally some divisions had a slight description for what the work was; ie, "the escorts generate" */ + return `The division generates <span class="yellowgreen">${cashFormat(this.slaveRevenue)}</span> per slave on average.`; + } + endWeek_Slaves(divLedger) { + let slaves = shared.EndWeekProcessing_Slaves(this.activeSlaves, this._const.attrition); + this.activeSlaves -= slaves.value; + return divLedger.slaves.apply(slaves); + } + message_endWeek_Slaves(divLedger) { + let lostSlaves = divLedger.slaves.value; + let retval = '';//The division + if(this.activeSlaves <= 0) { + retval += `has <span class="red">no slaves</span> to ${this._const.slaveWorkDescription.future}`; + } + else { + retval += `is ${this._const.slaveWorkDescription.present} <span class="green">${numberWithPlural(this.activeSlaves, 'slave')}</span>`; + } + if(lostSlaves > 0) { + retval += `. During operations <span class="red">${numberWithPlural(lostSlaves, 'slave')}</span> ${this._const.slaveWorkDescription.past}`; + } + return retval; + } - //virtual override - get developmentCount() { return super.developmentCount; } - set developmentCount(value) { - super.developmentCount = value; - shared.SellOverflowSlaves(this); - } - dissolve() { - super.dissolve(); - delete V[this._const.corpId + "Slaves"]; - } - getAutoSendToMarket() { - return false; - } - setAutoSendToMarket(value) { - throw "Working divisions cannot sell to market"; - } - endweek_Revenue(divLedger) { - let {roll, value} = this._const.revenue.roll(); - let revenue = Math.trunc(this.activeSlaves * value); - divLedger.revenue.apply({value: revenue, efficiency: roll }); - } - endWeek_Transfer(divLedger) { - //Working divisions don't do transfers - } + //virtual override + get developmentCount() { return super.developmentCount; } + set developmentCount(value) { + super.developmentCount = value; + shared.SellOverflowSlaves(this); + } + dissolve() { + super.dissolve(); + delete V[this._const.corpId + "Slaves"]; + } + getAutoSendToMarket() { + return false; + } + setAutoSendToMarket(value) { + throw "Working divisions cannot sell to market"; + } + endweek_Revenue(divLedger) { + let {roll, value} = this._const.revenue.roll(); + let revenue = Math.trunc(this.activeSlaves * value); + divLedger.revenue.apply({value: revenue, efficiency: roll }); + } + endWeek_Transfer(divLedger) { + //Working divisions don't do transfers + } - get slaveRevenue() { - return this._const.revenue.center; - } - get maintenanceSlaves() { - //maintenance is paid on working slaves, not worked slaves. - return this.activeSlaves; - } + get slaveRevenue() { + return this._const.revenue.center; + } + get maintenanceSlaves() { + //maintenance is paid on working slaves, not worked slaves. + return this.activeSlaves; + } - get foundingCostSlaves() { return this._const.founding.size * this.purchasedSlaveValue; } - get foundingCost() { return this.foundingCostDivision + this.foundingCostSlaves; } - create() { - super.create(); - App.Corporate.chargeAsset(this.foundingCostSlaves * 1000, "slaves"); - this.activeSlaves = this._const.founding.size; - shared.FoundingSetupAutoBuy(this); - } - }; + get foundingCostSlaves() { return this._const.founding.size * this.purchasedSlaveValue; } + get foundingCost() { return this.foundingCostDivision + this.foundingCostSlaves; } + create() { + super.create(); + App.Corporate.chargeAsset(this.foundingCostSlaves * 1000, "slaves"); + this.activeSlaves = this._const.founding.size; + shared.FoundingSetupAutoBuy(this); + } + }; } diff --git a/src/Corporation/corporate.js b/src/Corporation/corporate.js index 2822a20d57dca1a57af28ad0c5596b63a649c984..2900cc9d8f0c8497002dcb452e9ff0262d507ad3 100644 --- a/src/Corporation/corporate.js +++ b/src/Corporation/corporate.js @@ -1,908 +1,908 @@ window.averageRange = class { - constructor({center, range}) { - this._const = { - center, - range - }; - } - get center() { return this._const.center; } - get range() { return this._const.range; } - roll() { - let roll = Math.clamp(gaussianPair(0, 0.2)[0], -0.5, 0.5); - return { roll, value: (roll * this.range) + this.center}; - } - rollInt() { - let retval = this.roll(); - retval.value = Math.trunc(retval.value); - return retval; - } + constructor({center, range}) { + this._const = { + center, + range + }; + } + get center() { return this._const.center; } + get range() { return this._const.range; } + roll() { + let roll = Math.clamp(gaussianPair(0, 0.2)[0], -0.5, 0.5); + return { roll, value: (roll * this.range) + this.center}; + } + rollInt() { + let retval = this.roll(); + retval.value = Math.trunc(retval.value); + return retval; + } } window.evenFillArray = function(array, amount, lookupAmount) { - let perItem, changed; - let retval = []; - do { - let newArray = []; - changed = false; - perItem = Math.trunc(amount / array.length); - for(let item of array) { - let itemValue = lookupAmount(item); - if(itemValue >= perItem) { - newArray.push(item); - continue; - } - - amount -= itemValue; - retval.push({item, value:itemValue}); - changed = true; - } - array = newArray; - } while (changed); - let remainder = amount % array.length; - for(let item of array) { - let extra = 0; - if(remainder > 0) { - remainder--; - extra = 1; - } - retval.push({item, value: perItem + extra }); - } - return retval; + let perItem, changed; + let retval = []; + do { + let newArray = []; + changed = false; + perItem = Math.trunc(amount / array.length); + for(let item of array) { + let itemValue = lookupAmount(item); + if(itemValue >= perItem) { + newArray.push(item); + continue; + } + + amount -= itemValue; + retval.push({item, value:itemValue}); + changed = true; + } + array = newArray; + } while (changed); + let remainder = amount % array.length; + for(let item of array) { + let extra = 0; + if(remainder > 0) { + remainder--; + extra = 1; + } + retval.push({item, value: perItem + extra }); + } + return retval; } window.typeHiddenMembers = class { - constructor() { - this._const = {}; - this._var = {}; - this._cache = {}; - } + constructor() { + this._const = {}; + this._var = {}; + this._cache = {}; + } } App.Corporate.Init = function() { - const Ledger = class { - constructor(corp, suffix="") { - this.corp = corp; - this.suffix = suffix; - this.clear(); - } - get operations( ) { return this.getStored('OpCost' ); } - set operations(value) { return this.setStored('OpCost' , value); } - - get localRevenue( ) { return this.getStored('Rev' ); } - set localRevenue(value) { return this.setStored('Rev' , value); } - - get development( ) { return this.getStored('AssetsDev' ); } - set development(value) { return this.setStored('AssetsDev' , value); } - - get slaves( ) { return this.getStored('AssetsSlave' ); } - set slaves(value) { return this.setStored('AssetsSlave' , value); } - - get overhead( ) { return this.getStored('Overhead' ); } - set overhead(value) { return this.setStored('Overhead' , value); } - - get economicBoost( ) { return this.getStored('EconBonus' ); } - set economicBoost(value) { return this.setStored('EconBonus' , value); } - - get economy( ) { return this.getStored('Econ' ); } - set economy(value) { return this.setStored('Econ' , value); } - - get foreignRevenue( ) { return this.getStored('NeighborBonus' ); } - set foreignRevenue(value) { return this.setStored('NeighborBonus', value); } - - copy(ledger) { - this.operations = ledger.operations; - this.localRevenue = ledger.localRevenue; - this.foreignRevenue = ledger.foreignRevenue; - this.development = ledger.development; - this.slaves = ledger.slaves; - this.overhead = ledger.overhead; - this.economicBoost = ledger.economicBoost; - this.economy = ledger.economy; - } - clear() { - this.operations = 0; - this.localRevenue = 0; - this.foreignRevenue = 0; - this.development = 0; - this.slaves = 0; - this.overhead = 0; - this.economicBoost = 0; - this.economy = 0; - } - release() { - this.deleteStored('OpCost'); - this.deleteStored('Rev'); - this.deleteStored('AssetsDev'); - this.deleteStored('AssetsSlave'); - this.deleteStored('Overhead'); - this.deleteStored('EconBonus'); - this.deleteStored('Econ'); - this.deleteStored('NeighborBonus'); - } - get profit() { - return this.revenue + this.economicBoost - - this.development - this.slaves - this.overhead - this.operations; - } - get revenue() { - return this.localRevenue + this.foreignRevenue; - } - setEconomy(economy) { - this.economy = economy; - - //NOTE: Set economicBoost to 0 so it doesn't affect this.profit! - this.economicBoost = 0; // <-- DO NOT delete - this.economicBoost = Math.trunc(this.profit * (economy - 100) / 100); - } - //private access - getStored(key) { - return this.corp.getStored(key + this.suffix); - } - setStored(key, value) { - return this.corp.setStored(key + this.suffix, value); - } - deleteStored(key){ - this.corp.deleteStored(key + this.suffix); - } - }; - const WeekProcessingEffeciencyLine = class { - constructor() { - this.value = 0; - this.efficiency = 0; - } - apply(pair) { - this.value = pair.value; - this.efficiency = pair.efficiency; - } - }; - const WeekProcessingTransfer = class extends typeHiddenMembers { - constructor(divLedger) { - super(); - this._const.divLedger = divLedger; - this._var.divisions = []; - this._var.in = 0; - this._var.out = 0; - } - addDivision(division, fill) { - const otherLedger = this._const.divLedger.weekLedger.getDivision(division); - - this._var.out += fill; - otherLedger.transfer.in += fill; - - this._var.divisions.push({division, fill}); - } - get in() { - return this._var.in; - } - set in(value) { - if(value == this._var.in) return; - if(this._const.divLedger.market.canBuy) { - this._const.divLedger.market.buy -= value - this._var.in; - } - this._var.in = value; - } - get total() { - return this._var.out; - } - get divisions() { - return this._var.divisions; - } - } - const WeekProcessingMarket = class extends typeHiddenMembers { - constructor(divLedger) { - super(); - - this._const.divLedger = divLedger; - this._var.canBuy = false; - this._var.buy = 0; - this._var.sell = 0; - } - get buy() { - return this._var.buy; - } - set buy(value) { - //Note: canBuy merely means we've set buy to some value, even 0. - //Setting to 0 after setting to another value happens when we tried to buy some number, but couldn't afford it. - this._var.canBuy = true; - this._var.buy = value; - this._cache.buyValue = null; - } - get sell() { - return this._var.sell; - } - set sell(value) { - this._var.sell = value; - this._cache.sellValue = null; - } - get sellValue() { - if(this._cache.sellValue == null) - this._cache.sellValue = App.Corporate.slaveMarketSellValue(this.division, this.sell); - return this._cache.sellValue; - } - get buyValue() { - if(this._cache.buyValue == null) - this._cache.buyValue = App.Corporate.slaveMarketPurchaseValue(this.division, this.buy); - return this._cache.buyValue; - } - get canBuy() { - return this._var.canBuy; - } - - get divisionLedger() { - return this._const.divLedger; - } - get division() { - return this.divisionLedger.division; - } - }; - const WeekProcessingDivision = class extends typeHiddenMembers { - constructor(division, weekLedger) { - super(); - - this._const.division = division; - this._const.ledger = weekLedger; - this._var.slaves = new WeekProcessingEffeciencyLine(); - this._var.revenue = new WeekProcessingEffeciencyLine(); - this._var.transfer = new WeekProcessingTransfer(this); - this._var.market = new WeekProcessingMarket(this); - } - get slaves() { - return this._var.slaves; - } - get revenue() { - return this._var.revenue; - } - get transfer() { - return this._var.transfer; - } - get market() { - return this._var.market; - } - get division() { - return this._const.division; - } - get weekLedger() { - return this._const.ledger; - } - } - const WeekProcessingOverheadCategory = class extends typeHiddenMembers { - constructor(categoryId) { - super(); - - this._const.category = App.Corporate.maintenance.divisionCategories[categoryId]; - if(this._const.category == null) { debugger; throw new "Invalid category id: " + categoryId; } - this._var.divisions = []; - } - addDivision(division) { - this._var.divisions.push(division); - } - get cost() { - const category = this._const.category; - const ownedDivisionCount = this._var.divisions.length - category.freeDivisions; - const developmentCount = this._var.divisions.reduce((r, div) => r + div.developmentCount, 0) - category.freeDevelopment; - - const divisionCost = Math.trunc(Math.pow(Math.max(ownedDivisionCount, 0), 2) * category.divisionCost ); - const developmentCost = Math.trunc(Math.pow(Math.max(developmentCount , 0), 2) * category.developmentCost); - - return divisionCost + developmentCost; - } - }; - const WeekProcessingLedger = class extends typeHiddenMembers { - constructor() { - super(); - - this._var.divisions = {}; - this._var.maintenanceCategories = {}; - this._var.operatingCost = 0; - this._var.canExpandNow = false; - this._var.canSpecializeNow = false; - this._var.dividend = 0; - this._var.payout = 0; - } - - getDivision(division) { - if(!(division.id in this._var.divisions)) { - this._var.divisions[division.id] = new WeekProcessingDivision(division, this); - } - return this._var.divisions[division.id]; - } - get divisionLedgers() { - return this._var.divisions; - } - - registerMaintenanceForDivision(division) { - let categoryId = division.maintenanceCategory; - if(!(categoryId in this._var.maintenanceCategories)) { - this._var.maintenanceCategories[categoryId] = new WeekProcessingOverheadCategory(categoryId); - } - let category = this._var.maintenanceCategories[categoryId]; - category.addDivision(division); - } - get maintenanceCategories() { - return this._var.maintenanceCategories; - } - - get operatingCost() { - return this._var.operatingCost; - } - set operatingCost(value) { - if(!Number.isFinite(value)) { debugger; throw "Operating cost wasn't finite "; } - this._var.operatingCost = Math.trunc(value); - } - get overhead() { - const divCount = App.Corporate.numDivisions; - if(divCount <= 1) return 0; - - const divisionOverhead = Object.values(this.maintenanceCategories).reduce((r, categoryLedger) => r + categoryLedger.cost, 0); - const corpMaintInfo = App.Corporate.maintenance.corporate; - let corpOverhead = Math.pow(Math.max(divCount - corpMaintInfo.freeDivisions, 0), 2) * corpMaintInfo.divisionCost; - let retval = (divisionOverhead + corpOverhead) * 1 - (5 - State.variables.baseDifficulty) / 8; - return Math.trunc(retval); - } - get canExpandNow() { return this._var.canExpandNow; } - set canExpandNow(value) { this._var.canExpandNow = value; } - - get hasDividend() { return this._var.dividend > 0; } - get dividend() { return this._var.dividend; } - set dividend(value) { this._var.dividend = value; } - - get hasPayout() { return this._var.payout > 0; } - get payout() { return this._var.payout; } - set payout(value) { this._var.payout = value; } - - get canSpecializeNow() { return this._var.canSpecializeNow; } - set canSpecializeNow(value) { this._var.canSpecializeNow = value; } - } - App.Corporate.Division = {}; - const shared = { - RelatedDivisionType: class { - constructor() { - this._var = { - to: [], - from: [], - all: [] - }; - } - get to() { return this._var.to ; } - get from() { return this._var.from; } - get all() { return this._var.all ; } - addTo(value) { - this._var.to.push(value); - this._var.all.push(value); - } - addFrom(value) { - this._var.from.push(value); - this._var.all.push(value); - } - get anyFounded() { return this.all.some(div=>div.founded); } - }, - FoundingType: class { - constructor(division, {corporateCash, startingSize = 10}) { - this._const = { - division, - cash: corporateCash, - size: startingSize - }; - } - get cash() { return this._const.cash; } - get size() { return this._const.size; } - get startingPrice() { - let div = this._const.division; - return this._const.cash + div.foundingCost; - } - }, - SellOverflowSlaves: function(division) { - const slavesToSell = division.activeSlaves - division.developmentCount; - if(slavesToSell > 0) { - const slaveProcCost = Math.trunc(App.Corporate.slaveMarketPurchaseValue(division, -slavesToSell)); - App.Corporate.chargeAsset(slaveProcCost, "slaves"); - division.activeSlaves -= slavesToSell; - V.menialDemandFactor -= slavesToSell; - } - }, - SellUnhousedSlaves: function(division, divLedger, rate) { - if(divLedger.market.sell != 0) return; - - let housing = 2 * rate * division.developmentCount; - let unhoused = division.heldSlaves - housing; - if(unhoused <= 0) return; - - divLedger.market.sell = unhoused; - }, - MessageProcessedSlaves: function(division, verbPhrase, color) { - let procCount = Math.trunc(division.developmentCount * division.processRate); - let slaveCountedNoun = numberWithPluralNonZero(procCount, "slave"); - - return `It ${verbPhrase} approximately <span class="${color}">${slaveCountedNoun}</span> each week when operating at capacity (${division.developmentCount})`; - }, - MessageSlaveToMarket: function(division) { - return `The slaves from this division can be sold for <span class='yellowgreen'>${cashFormat(Math.trunc(division.soldSlaveValue * menialSlaveCost()))}</span> each.`; - }, - EndWeekProcessing_Slaves: function(processingCount, rate) { - const perDevPair = rate.roll(); - let slaveIncrease = perDevPair.value * processingCount; - if(slaveIncrease < 1) { - slaveIncrease = (slaveIncrease > Math.random() ? 1 : 0); - } - return {efficiency: perDevPair.roll, value: Math.trunc(slaveIncrease) }; - }, - FoundingSetupAutoBuy: function(division) { - let foundedFrom = division.relatedDivisions.from.filter(div=>div.founded); - if(foundedFrom.length == 0) { - division.setAutoBuyFromMarket(true); - } - else { - for(let otherDiv of foundedFrom) { - if(otherDiv.getAutoSendToMarket()) { - otherDiv.setAutoSendToDivision(division, true); - } - } - } - - }, - FoundingSetupAutoSell: function(division) { - let foundedTo = division.relatedDivisions.to.filter(div=>div.founded); - if(foundedTo.length == 0) { - division.setAutoSendToMarket(true); - } - else { - for(let otherDiv of foundedTo) { - if(otherDiv.getAutoBuyFromMarket()) { - division.setAutoSendToDivision(otherDiv, true); - } - } - } - } - }; - App.Corporate.Init_DivisionBase(shared); - App.Corporate.Init_DivisionAcquiring(shared); - App.Corporate.Init_DivisionProcessing(shared); - App.Corporate.Init_DivisionWorking(shared); - - App.Corporate.InitConstants(); - let divisions = App.Corporate.divisions = mapIdList(App.Corporate.divisionList); - App.Corporate.maintenance.divisionCategories = mapIdList(App.Corporate.maintenance.divisionCategoriesList); - - for(const divInfo of App.Corporate.divisionList.filter(div=>div.nextDivisions != null)) { - const div = divisions[divInfo.id]; - for(const nextDepId of divInfo.nextDivisions) { - let nextDiv = divisions[nextDepId]; - div.relatedDivisions.addTo(nextDiv); - nextDiv.relatedDivisions.addFrom(div); - } - } - let asDivision = function(division) { - if(_.isObject(division)) return division; - return App.Corporate.divisions[division]; - } - App.Corporate.getStored = function(key ) { return V[`corp${key}`]; } - App.Corporate.setStored = function(key, value) { V[`corp${key}`] = value; } - App.Corporate.deleteStored = function(key ) { delete V[`corp${key}`]; } - - //Integer properties starting with corp - const propertyToStoryInt = { - cash: "Cash", - numDivisions: 'Div', - foundedDate: 'Founded', - dividend: "Dividend", - specializations: "Spec", - specializationTokens: "SpecToken", - specializationTimer: "SpecTimer", - } - for(const property in propertyToStoryInt) { - const key = propertyToStoryInt[property]; - Object.defineProperty(App.Corporate, property, { - get: function( ) { return this.getStored(key); }, - set: function(value) { - if(!Number.isFinite(value)) throw "Unreal number " + key; - this.setStored(key, Math.trunc(value)); - } - }); - } - - //Boolean properties starting with corp (true == 1, false == 0) - const propertyToStoryBool = { - founded: "Incorporated", - hasMarket: "Market", - payoutCash: "CashDividend", - canExpand: 'ExpandToken', - } - for(const property in propertyToStoryBool) { - const key = propertyToStoryBool[property]; - Object.defineProperty(App.Corporate, property, { - get: function( ) { return this.getStored(key) === 1; }, - set: function(value) { this.setStored(key, value == true ? 1 : 0); } - }); - } - - //Abnormal properties - Object.defineProperty(App.Corporate, "value", { - get: function() { - if(!this.founded) return 0; - let corpAssets = App.Corporate.divisionList - .filter(div=>div.founded) - .reduce((v, div)=>v + div.value, 0); - return corpAssets + this.dividend + this.cash; - } - }); - Object.defineProperty(App.Corporate, "dividendRatio", { - get: function( ) { return V.dividendRatio ; }, - set: function(value) { V.dividendRatio = value; } - }); - Object.defineProperty(App.Corporate, "dividendTimer", { - get: function( ) { return V.dividendTimer ; }, - set: function(value) { V.dividendTimer = value; } - }); - Object.defineProperty(App.Corporate, "payoutAfterCash", { - get: function() { - return Math.max(Math.trunc(this.payoutCorpValueMultiplier * this.value), this.payoutMinimumCash); - } - }); - - const SharesType = class { - get personal() { return V.personalShares ; } - set personal(value) { V.personalShares = value; } - get public() { return V.publicShares ; } - set public(value) { V.publicShares = value; } - get total() { return this.personal + this.public; } - }; - App.Corporate.shares = new SharesType(); - App.Corporate.ledger = { - current: new Ledger(App.Corporate), - old: new Ledger(App.Corporate, "Old"), - swap: function() { - this.old.copy(this.current); - this.current.clear(); - }, - clear: function() { - this.old.clear(); - this.current.clear(); - }, - release: function() { - this.old.release(); - this.current.release(); - } - }; - App.Corporate.foundingCostToPlayer = function(division, personalShares, publicShares) { - division = asDivision(division); - let costToPlayer = Math.trunc((division.foundingCash / (personalShares + publicShares)) * personalShares); - return costToPlayer; - } - App.Corporate.create = function(division, personalShares, publicShares) { - this.shares.personal = personalShares; - this.shares.public = publicShares; - V.dividendTimer = 13; - this.founded = true; - this.foundedDate = V.week; - this.dividend = 0; - this.dividendRatio = 0; - this.specializationTimer = 4; - - this.ledger.clear(); - - //this will be updated by division.create - this.numDivisions = 0; - this.expansionTokens = 1; - - division = asDivision(division); - cashX(forceNeg(App.Corporate.foundingCostToPlayer(division, personalShares, publicShares)), 'stocksTraded'); - this.cash = division.foundingCash; - - division.create(this); - App.Corporate.ledger.swap(); - }; - App.Corporate.dissolve = function() { - for(let division of this.divisionList.filter(x=>x.founded)) { - division.dissolve(); - } - this.founded = false; - this.numDivisions = 0; - this.expansionTokens = 0; - this.setStored("Expand", 0); - this.specializations = 0; - this.specializationTokens = 0; - this.setStored("SpecRaces", []); - this.ledger.release(); - - // Some of these will need to be refactored into App.Corporate.Specialization - const toDelete = [ - "corpCash", - "personalShares", - "publicShares", - "corpDividend", - "dividendTimer", - "corpSpecAccent", - "corpSpecAge", - "corpSpecAmputee", - "corpSpecBalls", - "corpSpecDevotion", - "corpSpecDick", - "corpSpecEducation", - "corpSpecGender", - "corpSpecGenitalia", - "corpSpecWeight", - "corpSpecHeight", - "corpSpecHormones", - "corpSpecImplants", - "corpSpecInjection", - "corpSpecIntelligence", - "corpSpecMilk", - "corpSpecMuscle", - "corpSpecPussy", - "corpSpecSexEd", - "corpSpecTrust", - "corpSpecVirgin" - ]; - toDelete.forEach(id => delete V[id]); - - if(this.hasMarket) { - let corporateMarketIndex = V.sectors.findIndex(sector => sector.type === "CorporateMarket"); - V.sectors[corporateMarketIndex].type = "Markets"; - this.hasMarket = false; - } - }; - App.Corporate.expandedDivision = function() { - this.numDivisions += 1; - this.canExpand = false; - }; - App.Corporate.dissolvedDivision = function() { - this.numDivisions -= 1; - }; - App.Corporate.chargeAsset = function(cost, type) { - if(!Number.isFinite(cost)) throw "The cost provided was not a real number"; - cost = Math.trunc(cost); - if(!(type in this.ledger.current)) throw `Ledger doesn't record '${type}' category.`; - if(cost == 0) return; - - this.ledger.current[type] += cost; - this.cash -= cost; - }; - App.Corporate.earnRevenue = function(cost, locality) { - if(!Number.isFinite(cost)) throw "The cost provided was not real"; - cost = Math.trunc(cost); - let current = this.ledger.current; - let key = `${locality}Revenue`; - if(!(key in current)) throw `Unknown locality '${locality}'`; - current[key] += cost; - this.cash += cost; - }; - App.Corporate.chargeDividend = function(cost, weekLedger) { - if(!Number.isFinite(cost)) throw "The cost provided was not real"; - cost = Math.trunc(cost); - if(weekLedger == null) { - debugger; - throw "No weekLedger provided"; - } - this.dividend += cost; - this.cash -= cost; - weekLedger.dividend += cost; - } - App.Corporate.creditEconomy = function() { - this.ledger.current.setEconomy(V.localEcon); - this.cash += this.ledger.current.economicBoost; - } - /* Need to prevent skipping intermediaries if they exist, ie break->surgery->train, you can skip surgery only if you don't have it.*/ - App.Corporate.ownsIntermediaryDivision = function(fromDivision, toDivision) { - for(let intermediateDiv of toDivision.relatedDivisions - .from - .filter(iDep => iDep.id != fromDivision.id - && fromDivision.relatedDivisions.to.includes(iDep))) { - if(intermediateDiv.founded) return true; - } - return false; - }; - App.Corporate.slaveMarketPurchaseValue = function(division, count) { - division = asDivision(division); - let slaveValue = division.purchasedSlaveValue; - let totalValue = slaveValue * count * menialSlaveCost(count); - return Math.trunc(totalValue); - }; - App.Corporate.slaveMarketSellValue = function(division, count) { - division = asDivision(division); - let slaveValue = division.soldSlaveValue; - let totalValue = slaveValue * count * menialSlaveCost(count); - return Math.trunc(totalValue); - }; - App.Corporate.buySlaves = function(division, count) { - if(count <= 0) return 0; - - division = asDivision(division); - let purchasePrice = this.slaveMarketPurchaseValue(division, count); - if(this.cash < purchasePrice) { - throw "Attempted purchase without enough money"; - } - - this.chargeAsset(purchasePrice, "slaves"); - division.activeSlaves += count; - V.menialSupplyFactor -= count; - return purchasePrice; - }; - App.Corporate.sellSlaves = function(division, count) { - if(count <= 0) return 0; - - division = asDivision(division); - if(division.heldSlaves < count) { throw "Attempted to sell more slaves than held."; } - - let sellPrice = this.slaveMarketSellValue(division, count); - this.earnRevenue(sellPrice, "local"); - division.heldSlaves -= count; - V.menialDemandFactor -= count; - return sellPrice; - }; - App.Corporate.transferSlaves = function(fromDivision, toDivision, count) { - fromDivision = asDivision(fromDivision); - toDivision = asDivision(toDivision); - // TODO: validate the from and to departments are directly connected. - - if(fromDivision.heldSlaves < count) throw `Tried to move ${count} slaves out of ${fromDivision.name}, but it only had ${fromDivision.heldSlaves}`; - - fromDivision.heldSlaves -= count; - toDivision.activeSlaves += count; - }; - - App.Corporate.buyDevelopment = function(division, count) { - division = asDivision(division); - - let cost = Math.trunc(division.sizeCost * count * 1000); - - this.chargeAsset(cost, "development"); - division.developmentCount += count; - }; - App.Corporate.sellDevelopment = function(division, count) { - division = asDivision(division); - - const devCount = division.developmentCount; - count = count || devCount; - if(count > devCount) throw `Attempted to sell more of a division ${division.id} than exists (${count} of ${devCount})`; - const developmentCost = Math.trunc(count * division.sizeCost * 800); - this.chargeAsset(-developmentCost, "development"); - division.developmentCount -= count; - }; - App.Corporate.setAutoSendToDivision = function(fromDivision, toDivision, value) { - fromDivision = asDivision(fromDivision); - toDivision = asDivision(toDivision); - - fromDivision.setAutoSendToDivision(toDivision, value); - }; - App.Corporate.setAutoSendToMarket = function(division, value) { - division = asDivision(division); - division.setAutoSendToMarket(value); - }; - App.Corporate.setAutoBuyFromMarket = function(division, value) { - division = asDivision(division); - division.setAutoBuyFromMarket(value); - }; - App.Corporate.calculateDividend = function(weekLedger) - { - let profit = this.ledger.current.profit; - if(this.dividendRatio > 0 && profit > 0) - { - this.chargeDividend(profit * this.dividendRatio, weekLedger); - } - //Payout leftover cash should be the last thing the corporation does - //in a week so that its cash will be at the payout amount. - if(this.payoutCash) - { - let payoutAfter = this.payoutAfterCash; - if(this.cash > payoutAfter) - { - this.chargeDividend(this.cash - payoutAfter, weekLedger); - } - } - - if(this.dividendTimer <= 1) - { - weekLedger.payout = Math.trunc(this.dividend * this.shares.personal / this.shares.total); - cashX(weekLedger.payout, "stocks"); - this.dividendTimer = 14;//13 for each quarter, but +1 because we're subtracting one below. - this.dividend = 0; - } - - this.dividendTimer--; - }; - App.Corporate.endWeek = function() { - let ledger = new WeekProcessingLedger(); - //Prepare requests - for(let div of this.divisionList.filter(div=>div.founded)) { - let divLedger = ledger.getDivision(div) - - ledger.operatingCost += div.maintenanceCost; - ledger.registerMaintenanceForDivision(div); - - div.endweek_Revenue(divLedger); - div.endWeek_Slaves(divLedger); - } - for(let divLedger of Object.values(ledger.divisionLedgers)) { - let div = divLedger.division; - div.endWeek_Transfer(divLedger); - div.endWeek_Market(divLedger); - } - this.chargeAsset(ledger.operatingCost, "operations"); - this.chargeAsset(ledger.overhead, "overhead"); - //Execute sales requests, transfers, and earned revenue - for(let divLedger of Object.values(ledger.divisionLedgers)) { - let div = divLedger.division; - this.earnRevenue(divLedger.revenue.value, "local"); - if(div.activeSlaves > 0) - { - shared.SellOverflowSlaves(div); - } - - for(let otherDivPair of divLedger.transfer.divisions) { - let otherDiv = otherDivPair.division; - let count = otherDivPair.fill; - if(count == 0) continue; - - this.transferSlaves(div, otherDiv, count); - } - if(divLedger.market.sell > 0) { - divLedger.market.finalSale = this.sellSlaves(div, divLedger.market.sell); - } - } - - //Execute purchase requests - //todo: Make a switch to allow the user to control purchasing behavior. - //todo: Expensive first - //todo: Cheapest first - //Even purchase requsts: - let purchaseValues = evenFillArray(Object.values(ledger.divisionLedgers) - .filter(divLedger=>divLedger.market.buy > 0) - , this.cash - , divLedger=>divLedger.market.buyValue); - for(let divLedgerPair of purchaseValues) { - let divLedger = divLedgerPair.item; - let purchaseCost = divLedgerPair.value; - let div = divLedger.division; - - if(divLedger.market.buyValue > purchaseCost) { - //Estimate how many slaves we can afford within the purchase cost - let perSlaveEstimate = Math.trunc(divLedger.market.buyValue / divLedger.market.buy); - let numSlavesEstimate = Math.trunc(purchaseCost / perSlaveEstimate); - - if(numSlavesEstimate < 1) { - divLedger.market.originalBuy = divLedger.market.buy; - divLedger.market.buyShortMoney = divLedger.market.buyValue; - divLedger.market.buyShortSlaves = divLedger.market.buy; - divLedger.market.buy = 0; - } - else { - divLedger.market.originalBuy = divLedger.market.buy; - divLedger.market.buyShortMoney = divLedger.market.buyValue - purchaseCost; - divLedger.market.buyShortSlaves = divLedger.market.buy - numSlavesEstimate; - divLedger.market.buy = numSlavesEstimate; - } - } - divLedger.market.finalPurchase = this.buySlaves(div, divLedger.market.buy); - } - this.creditEconomy(); - - if(this.numDivisions < this.divisionList.length && !this.canExpand) - { - let expansionValue = Math.trunc(Math.pow(this.numDivisions, 1.5) + (5 * this.numDivisions + 2) / 4); - if(this.value > expansionValue * 1000000) - { - ledger.canExpandNow = true; - this.canExpand = true; - } - } - let specializationExpansion = 1.6 * Math.pow(1.25, this.specializations) - 1.2; - if(this.value > specializationExpansion * 1000000){ - this.specializationTokens++; - this.specializations++; - ledger.canSpecializeNow = true; - } - if(this.specializationTimer > 0) - { - this.specializationTimer--; - } - this.calculateDividend(ledger); - - return ledger; - }; - App.Corporate.cheatCash = function(userCash) { - userCash = Math.trunc(Number(userCash)) - if(Number.isFinite(userCash)) { - this.cash = userCash; - V.cheater = 1 - } - } + const Ledger = class { + constructor(corp, suffix="") { + this.corp = corp; + this.suffix = suffix; + this.clear(); + } + get operations( ) { return this.getStored('OpCost' ); } + set operations(value) { return this.setStored('OpCost' , value); } + + get localRevenue( ) { return this.getStored('Rev' ); } + set localRevenue(value) { return this.setStored('Rev' , value); } + + get development( ) { return this.getStored('AssetsDev' ); } + set development(value) { return this.setStored('AssetsDev' , value); } + + get slaves( ) { return this.getStored('AssetsSlave' ); } + set slaves(value) { return this.setStored('AssetsSlave' , value); } + + get overhead( ) { return this.getStored('Overhead' ); } + set overhead(value) { return this.setStored('Overhead' , value); } + + get economicBoost( ) { return this.getStored('EconBonus' ); } + set economicBoost(value) { return this.setStored('EconBonus' , value); } + + get economy( ) { return this.getStored('Econ' ); } + set economy(value) { return this.setStored('Econ' , value); } + + get foreignRevenue( ) { return this.getStored('NeighborBonus' ); } + set foreignRevenue(value) { return this.setStored('NeighborBonus', value); } + + copy(ledger) { + this.operations = ledger.operations; + this.localRevenue = ledger.localRevenue; + this.foreignRevenue = ledger.foreignRevenue; + this.development = ledger.development; + this.slaves = ledger.slaves; + this.overhead = ledger.overhead; + this.economicBoost = ledger.economicBoost; + this.economy = ledger.economy; + } + clear() { + this.operations = 0; + this.localRevenue = 0; + this.foreignRevenue = 0; + this.development = 0; + this.slaves = 0; + this.overhead = 0; + this.economicBoost = 0; + this.economy = 0; + } + release() { + this.deleteStored('OpCost'); + this.deleteStored('Rev'); + this.deleteStored('AssetsDev'); + this.deleteStored('AssetsSlave'); + this.deleteStored('Overhead'); + this.deleteStored('EconBonus'); + this.deleteStored('Econ'); + this.deleteStored('NeighborBonus'); + } + get profit() { + return this.revenue + this.economicBoost + - this.development - this.slaves - this.overhead - this.operations; + } + get revenue() { + return this.localRevenue + this.foreignRevenue; + } + setEconomy(economy) { + this.economy = economy; + + //NOTE: Set economicBoost to 0 so it doesn't affect this.profit! + this.economicBoost = 0; // <-- DO NOT delete + this.economicBoost = Math.trunc(this.profit * (economy - 100) / 100); + } + //private access + getStored(key) { + return this.corp.getStored(key + this.suffix); + } + setStored(key, value) { + return this.corp.setStored(key + this.suffix, value); + } + deleteStored(key){ + this.corp.deleteStored(key + this.suffix); + } + }; + const WeekProcessingEffeciencyLine = class { + constructor() { + this.value = 0; + this.efficiency = 0; + } + apply(pair) { + this.value = pair.value; + this.efficiency = pair.efficiency; + } + }; + const WeekProcessingTransfer = class extends typeHiddenMembers { + constructor(divLedger) { + super(); + this._const.divLedger = divLedger; + this._var.divisions = []; + this._var.in = 0; + this._var.out = 0; + } + addDivision(division, fill) { + const otherLedger = this._const.divLedger.weekLedger.getDivision(division); + + this._var.out += fill; + otherLedger.transfer.in += fill; + + this._var.divisions.push({division, fill}); + } + get in() { + return this._var.in; + } + set in(value) { + if(value == this._var.in) return; + if(this._const.divLedger.market.canBuy) { + this._const.divLedger.market.buy -= value - this._var.in; + } + this._var.in = value; + } + get total() { + return this._var.out; + } + get divisions() { + return this._var.divisions; + } + } + const WeekProcessingMarket = class extends typeHiddenMembers { + constructor(divLedger) { + super(); + + this._const.divLedger = divLedger; + this._var.canBuy = false; + this._var.buy = 0; + this._var.sell = 0; + } + get buy() { + return this._var.buy; + } + set buy(value) { + //Note: canBuy merely means we've set buy to some value, even 0. + //Setting to 0 after setting to another value happens when we tried to buy some number, but couldn't afford it. + this._var.canBuy = true; + this._var.buy = value; + this._cache.buyValue = null; + } + get sell() { + return this._var.sell; + } + set sell(value) { + this._var.sell = value; + this._cache.sellValue = null; + } + get sellValue() { + if(this._cache.sellValue == null) + this._cache.sellValue = App.Corporate.slaveMarketSellValue(this.division, this.sell); + return this._cache.sellValue; + } + get buyValue() { + if(this._cache.buyValue == null) + this._cache.buyValue = App.Corporate.slaveMarketPurchaseValue(this.division, this.buy); + return this._cache.buyValue; + } + get canBuy() { + return this._var.canBuy; + } + + get divisionLedger() { + return this._const.divLedger; + } + get division() { + return this.divisionLedger.division; + } + }; + const WeekProcessingDivision = class extends typeHiddenMembers { + constructor(division, weekLedger) { + super(); + + this._const.division = division; + this._const.ledger = weekLedger; + this._var.slaves = new WeekProcessingEffeciencyLine(); + this._var.revenue = new WeekProcessingEffeciencyLine(); + this._var.transfer = new WeekProcessingTransfer(this); + this._var.market = new WeekProcessingMarket(this); + } + get slaves() { + return this._var.slaves; + } + get revenue() { + return this._var.revenue; + } + get transfer() { + return this._var.transfer; + } + get market() { + return this._var.market; + } + get division() { + return this._const.division; + } + get weekLedger() { + return this._const.ledger; + } + } + const WeekProcessingOverheadCategory = class extends typeHiddenMembers { + constructor(categoryId) { + super(); + + this._const.category = App.Corporate.maintenance.divisionCategories[categoryId]; + if(this._const.category == null) { debugger; throw new "Invalid category id: " + categoryId; } + this._var.divisions = []; + } + addDivision(division) { + this._var.divisions.push(division); + } + get cost() { + const category = this._const.category; + const ownedDivisionCount = this._var.divisions.length - category.freeDivisions; + const developmentCount = this._var.divisions.reduce((r, div) => r + div.developmentCount, 0) - category.freeDevelopment; + + const divisionCost = Math.trunc(Math.pow(Math.max(ownedDivisionCount, 0), 2) * category.divisionCost ); + const developmentCost = Math.trunc(Math.pow(Math.max(developmentCount , 0), 2) * category.developmentCost); + + return divisionCost + developmentCost; + } + }; + const WeekProcessingLedger = class extends typeHiddenMembers { + constructor() { + super(); + + this._var.divisions = {}; + this._var.maintenanceCategories = {}; + this._var.operatingCost = 0; + this._var.canExpandNow = false; + this._var.canSpecializeNow = false; + this._var.dividend = 0; + this._var.payout = 0; + } + + getDivision(division) { + if(!(division.id in this._var.divisions)) { + this._var.divisions[division.id] = new WeekProcessingDivision(division, this); + } + return this._var.divisions[division.id]; + } + get divisionLedgers() { + return this._var.divisions; + } + + registerMaintenanceForDivision(division) { + let categoryId = division.maintenanceCategory; + if(!(categoryId in this._var.maintenanceCategories)) { + this._var.maintenanceCategories[categoryId] = new WeekProcessingOverheadCategory(categoryId); + } + let category = this._var.maintenanceCategories[categoryId]; + category.addDivision(division); + } + get maintenanceCategories() { + return this._var.maintenanceCategories; + } + + get operatingCost() { + return this._var.operatingCost; + } + set operatingCost(value) { + if(!Number.isFinite(value)) { debugger; throw "Operating cost wasn't finite "; } + this._var.operatingCost = Math.trunc(value); + } + get overhead() { + const divCount = App.Corporate.numDivisions; + if(divCount <= 1) return 0; + + const divisionOverhead = Object.values(this.maintenanceCategories).reduce((r, categoryLedger) => r + categoryLedger.cost, 0); + const corpMaintInfo = App.Corporate.maintenance.corporate; + let corpOverhead = Math.pow(Math.max(divCount - corpMaintInfo.freeDivisions, 0), 2) * corpMaintInfo.divisionCost; + let retval = (divisionOverhead + corpOverhead) * 1 - (5 - State.variables.baseDifficulty) / 8; + return Math.trunc(retval); + } + get canExpandNow() { return this._var.canExpandNow; } + set canExpandNow(value) { this._var.canExpandNow = value; } + + get hasDividend() { return this._var.dividend > 0; } + get dividend() { return this._var.dividend; } + set dividend(value) { this._var.dividend = value; } + + get hasPayout() { return this._var.payout > 0; } + get payout() { return this._var.payout; } + set payout(value) { this._var.payout = value; } + + get canSpecializeNow() { return this._var.canSpecializeNow; } + set canSpecializeNow(value) { this._var.canSpecializeNow = value; } + } + App.Corporate.Division = {}; + const shared = { + RelatedDivisionType: class { + constructor() { + this._var = { + to: [], + from: [], + all: [] + }; + } + get to() { return this._var.to ; } + get from() { return this._var.from; } + get all() { return this._var.all ; } + addTo(value) { + this._var.to.push(value); + this._var.all.push(value); + } + addFrom(value) { + this._var.from.push(value); + this._var.all.push(value); + } + get anyFounded() { return this.all.some(div=>div.founded); } + }, + FoundingType: class { + constructor(division, {corporateCash, startingSize = 10}) { + this._const = { + division, + cash: corporateCash, + size: startingSize + }; + } + get cash() { return this._const.cash; } + get size() { return this._const.size; } + get startingPrice() { + let div = this._const.division; + return this._const.cash + div.foundingCost; + } + }, + SellOverflowSlaves: function(division) { + const slavesToSell = division.activeSlaves - division.developmentCount; + if(slavesToSell > 0) { + const slaveProcCost = Math.trunc(App.Corporate.slaveMarketPurchaseValue(division, -slavesToSell)); + App.Corporate.chargeAsset(slaveProcCost, "slaves"); + division.activeSlaves -= slavesToSell; + V.menialDemandFactor -= slavesToSell; + } + }, + SellUnhousedSlaves: function(division, divLedger, rate) { + if(divLedger.market.sell != 0) return; + + let housing = 2 * rate * division.developmentCount; + let unhoused = division.heldSlaves - housing; + if(unhoused <= 0) return; + + divLedger.market.sell = unhoused; + }, + MessageProcessedSlaves: function(division, verbPhrase, color) { + let procCount = Math.trunc(division.developmentCount * division.processRate); + let slaveCountedNoun = numberWithPluralNonZero(procCount, "slave"); + + return `It ${verbPhrase} approximately <span class="${color}">${slaveCountedNoun}</span> each week when operating at capacity (${division.developmentCount})`; + }, + MessageSlaveToMarket: function(division) { + return `The slaves from this division can be sold for <span class='yellowgreen'>${cashFormat(Math.trunc(division.soldSlaveValue * menialSlaveCost()))}</span> each.`; + }, + EndWeekProcessing_Slaves: function(processingCount, rate) { + const perDevPair = rate.roll(); + let slaveIncrease = perDevPair.value * processingCount; + if(slaveIncrease < 1) { + slaveIncrease = (slaveIncrease > Math.random() ? 1 : 0); + } + return {efficiency: perDevPair.roll, value: Math.trunc(slaveIncrease) }; + }, + FoundingSetupAutoBuy: function(division) { + let foundedFrom = division.relatedDivisions.from.filter(div=>div.founded); + if(foundedFrom.length == 0) { + division.setAutoBuyFromMarket(true); + } + else { + for(let otherDiv of foundedFrom) { + if(otherDiv.getAutoSendToMarket()) { + otherDiv.setAutoSendToDivision(division, true); + } + } + } + + }, + FoundingSetupAutoSell: function(division) { + let foundedTo = division.relatedDivisions.to.filter(div=>div.founded); + if(foundedTo.length == 0) { + division.setAutoSendToMarket(true); + } + else { + for(let otherDiv of foundedTo) { + if(otherDiv.getAutoBuyFromMarket()) { + division.setAutoSendToDivision(otherDiv, true); + } + } + } + } + }; + App.Corporate.Init_DivisionBase(shared); + App.Corporate.Init_DivisionAcquiring(shared); + App.Corporate.Init_DivisionProcessing(shared); + App.Corporate.Init_DivisionWorking(shared); + + App.Corporate.InitConstants(); + let divisions = App.Corporate.divisions = mapIdList(App.Corporate.divisionList); + App.Corporate.maintenance.divisionCategories = mapIdList(App.Corporate.maintenance.divisionCategoriesList); + + for(const divInfo of App.Corporate.divisionList.filter(div=>div.nextDivisions != null)) { + const div = divisions[divInfo.id]; + for(const nextDepId of divInfo.nextDivisions) { + let nextDiv = divisions[nextDepId]; + div.relatedDivisions.addTo(nextDiv); + nextDiv.relatedDivisions.addFrom(div); + } + } + let asDivision = function(division) { + if(_.isObject(division)) return division; + return App.Corporate.divisions[division]; + } + App.Corporate.getStored = function(key ) { return V[`corp${key}`]; } + App.Corporate.setStored = function(key, value) { V[`corp${key}`] = value; } + App.Corporate.deleteStored = function(key ) { delete V[`corp${key}`]; } + + //Integer properties starting with corp + const propertyToStoryInt = { + cash: "Cash", + numDivisions: 'Div', + foundedDate: 'Founded', + dividend: "Dividend", + specializations: "Spec", + specializationTokens: "SpecToken", + specializationTimer: "SpecTimer", + } + for(const property in propertyToStoryInt) { + const key = propertyToStoryInt[property]; + Object.defineProperty(App.Corporate, property, { + get: function( ) { return this.getStored(key); }, + set: function(value) { + if(!Number.isFinite(value)) throw "Unreal number " + key; + this.setStored(key, Math.trunc(value)); + } + }); + } + + //Boolean properties starting with corp (true == 1, false == 0) + const propertyToStoryBool = { + founded: "Incorporated", + hasMarket: "Market", + payoutCash: "CashDividend", + canExpand: 'ExpandToken', + } + for(const property in propertyToStoryBool) { + const key = propertyToStoryBool[property]; + Object.defineProperty(App.Corporate, property, { + get: function( ) { return this.getStored(key) === 1; }, + set: function(value) { this.setStored(key, value == true ? 1 : 0); } + }); + } + + //Abnormal properties + Object.defineProperty(App.Corporate, "value", { + get: function() { + if(!this.founded) return 0; + let corpAssets = App.Corporate.divisionList + .filter(div=>div.founded) + .reduce((v, div)=>v + div.value, 0); + return corpAssets + this.dividend + this.cash; + } + }); + Object.defineProperty(App.Corporate, "dividendRatio", { + get: function( ) { return V.dividendRatio ; }, + set: function(value) { V.dividendRatio = value; } + }); + Object.defineProperty(App.Corporate, "dividendTimer", { + get: function( ) { return V.dividendTimer ; }, + set: function(value) { V.dividendTimer = value; } + }); + Object.defineProperty(App.Corporate, "payoutAfterCash", { + get: function() { + return Math.max(Math.trunc(this.payoutCorpValueMultiplier * this.value), this.payoutMinimumCash); + } + }); + + const SharesType = class { + get personal() { return V.personalShares ; } + set personal(value) { V.personalShares = value; } + get public() { return V.publicShares ; } + set public(value) { V.publicShares = value; } + get total() { return this.personal + this.public; } + }; + App.Corporate.shares = new SharesType(); + App.Corporate.ledger = { + current: new Ledger(App.Corporate), + old: new Ledger(App.Corporate, "Old"), + swap: function() { + this.old.copy(this.current); + this.current.clear(); + }, + clear: function() { + this.old.clear(); + this.current.clear(); + }, + release: function() { + this.old.release(); + this.current.release(); + } + }; + App.Corporate.foundingCostToPlayer = function(division, personalShares, publicShares) { + division = asDivision(division); + let costToPlayer = Math.trunc((division.foundingCash / (personalShares + publicShares)) * personalShares); + return costToPlayer; + } + App.Corporate.create = function(division, personalShares, publicShares) { + this.shares.personal = personalShares; + this.shares.public = publicShares; + V.dividendTimer = 13; + this.founded = true; + this.foundedDate = V.week; + this.dividend = 0; + this.dividendRatio = 0; + this.specializationTimer = 4; + + this.ledger.clear(); + + //this will be updated by division.create + this.numDivisions = 0; + this.expansionTokens = 1; + + division = asDivision(division); + cashX(forceNeg(App.Corporate.foundingCostToPlayer(division, personalShares, publicShares)), 'stocksTraded'); + this.cash = division.foundingCash; + + division.create(this); + App.Corporate.ledger.swap(); + }; + App.Corporate.dissolve = function() { + for(let division of this.divisionList.filter(x=>x.founded)) { + division.dissolve(); + } + this.founded = false; + this.numDivisions = 0; + this.expansionTokens = 0; + this.setStored("Expand", 0); + this.specializations = 0; + this.specializationTokens = 0; + this.setStored("SpecRaces", []); + this.ledger.release(); + + // Some of these will need to be refactored into App.Corporate.Specialization + const toDelete = [ + "corpCash", + "personalShares", + "publicShares", + "corpDividend", + "dividendTimer", + "corpSpecAccent", + "corpSpecAge", + "corpSpecAmputee", + "corpSpecBalls", + "corpSpecDevotion", + "corpSpecDick", + "corpSpecEducation", + "corpSpecGender", + "corpSpecGenitalia", + "corpSpecWeight", + "corpSpecHeight", + "corpSpecHormones", + "corpSpecImplants", + "corpSpecInjection", + "corpSpecIntelligence", + "corpSpecMilk", + "corpSpecMuscle", + "corpSpecPussy", + "corpSpecSexEd", + "corpSpecTrust", + "corpSpecVirgin" + ]; + toDelete.forEach(id => delete V[id]); + + if(this.hasMarket) { + let corporateMarketIndex = V.sectors.findIndex(sector => sector.type === "CorporateMarket"); + V.sectors[corporateMarketIndex].type = "Markets"; + this.hasMarket = false; + } + }; + App.Corporate.expandedDivision = function() { + this.numDivisions += 1; + this.canExpand = false; + }; + App.Corporate.dissolvedDivision = function() { + this.numDivisions -= 1; + }; + App.Corporate.chargeAsset = function(cost, type) { + if(!Number.isFinite(cost)) throw "The cost provided was not a real number"; + cost = Math.trunc(cost); + if(!(type in this.ledger.current)) throw `Ledger doesn't record '${type}' category.`; + if(cost == 0) return; + + this.ledger.current[type] += cost; + this.cash -= cost; + }; + App.Corporate.earnRevenue = function(cost, locality) { + if(!Number.isFinite(cost)) throw "The cost provided was not real"; + cost = Math.trunc(cost); + let current = this.ledger.current; + let key = `${locality}Revenue`; + if(!(key in current)) throw `Unknown locality '${locality}'`; + current[key] += cost; + this.cash += cost; + }; + App.Corporate.chargeDividend = function(cost, weekLedger) { + if(!Number.isFinite(cost)) throw "The cost provided was not real"; + cost = Math.trunc(cost); + if(weekLedger == null) { + debugger; + throw "No weekLedger provided"; + } + this.dividend += cost; + this.cash -= cost; + weekLedger.dividend += cost; + } + App.Corporate.creditEconomy = function() { + this.ledger.current.setEconomy(V.localEcon); + this.cash += this.ledger.current.economicBoost; + } + /* Need to prevent skipping intermediaries if they exist, ie break->surgery->train, you can skip surgery only if you don't have it.*/ + App.Corporate.ownsIntermediaryDivision = function(fromDivision, toDivision) { + for(let intermediateDiv of toDivision.relatedDivisions + .from + .filter(iDep => iDep.id != fromDivision.id + && fromDivision.relatedDivisions.to.includes(iDep))) { + if(intermediateDiv.founded) return true; + } + return false; + }; + App.Corporate.slaveMarketPurchaseValue = function(division, count) { + division = asDivision(division); + let slaveValue = division.purchasedSlaveValue; + let totalValue = slaveValue * count * menialSlaveCost(count); + return Math.trunc(totalValue); + }; + App.Corporate.slaveMarketSellValue = function(division, count) { + division = asDivision(division); + let slaveValue = division.soldSlaveValue; + let totalValue = slaveValue * count * menialSlaveCost(count); + return Math.trunc(totalValue); + }; + App.Corporate.buySlaves = function(division, count) { + if(count <= 0) return 0; + + division = asDivision(division); + let purchasePrice = this.slaveMarketPurchaseValue(division, count); + if(this.cash < purchasePrice) { + throw "Attempted purchase without enough money"; + } + + this.chargeAsset(purchasePrice, "slaves"); + division.activeSlaves += count; + V.menialSupplyFactor -= count; + return purchasePrice; + }; + App.Corporate.sellSlaves = function(division, count) { + if(count <= 0) return 0; + + division = asDivision(division); + if(division.heldSlaves < count) { throw "Attempted to sell more slaves than held."; } + + let sellPrice = this.slaveMarketSellValue(division, count); + this.earnRevenue(sellPrice, "local"); + division.heldSlaves -= count; + V.menialDemandFactor -= count; + return sellPrice; + }; + App.Corporate.transferSlaves = function(fromDivision, toDivision, count) { + fromDivision = asDivision(fromDivision); + toDivision = asDivision(toDivision); + // TODO: validate the from and to departments are directly connected. + + if(fromDivision.heldSlaves < count) throw `Tried to move ${count} slaves out of ${fromDivision.name}, but it only had ${fromDivision.heldSlaves}`; + + fromDivision.heldSlaves -= count; + toDivision.activeSlaves += count; + }; + + App.Corporate.buyDevelopment = function(division, count) { + division = asDivision(division); + + let cost = Math.trunc(division.sizeCost * count * 1000); + + this.chargeAsset(cost, "development"); + division.developmentCount += count; + }; + App.Corporate.sellDevelopment = function(division, count) { + division = asDivision(division); + + const devCount = division.developmentCount; + count = count || devCount; + if(count > devCount) throw `Attempted to sell more of a division ${division.id} than exists (${count} of ${devCount})`; + const developmentCost = Math.trunc(count * division.sizeCost * 800); + this.chargeAsset(-developmentCost, "development"); + division.developmentCount -= count; + }; + App.Corporate.setAutoSendToDivision = function(fromDivision, toDivision, value) { + fromDivision = asDivision(fromDivision); + toDivision = asDivision(toDivision); + + fromDivision.setAutoSendToDivision(toDivision, value); + }; + App.Corporate.setAutoSendToMarket = function(division, value) { + division = asDivision(division); + division.setAutoSendToMarket(value); + }; + App.Corporate.setAutoBuyFromMarket = function(division, value) { + division = asDivision(division); + division.setAutoBuyFromMarket(value); + }; + App.Corporate.calculateDividend = function(weekLedger) + { + let profit = this.ledger.current.profit; + if(this.dividendRatio > 0 && profit > 0) + { + this.chargeDividend(profit * this.dividendRatio, weekLedger); + } + //Payout leftover cash should be the last thing the corporation does + //in a week so that its cash will be at the payout amount. + if(this.payoutCash) + { + let payoutAfter = this.payoutAfterCash; + if(this.cash > payoutAfter) + { + this.chargeDividend(this.cash - payoutAfter, weekLedger); + } + } + + if(this.dividendTimer <= 1) + { + weekLedger.payout = Math.trunc(this.dividend * this.shares.personal / this.shares.total); + cashX(weekLedger.payout, "stocks"); + this.dividendTimer = 14;//13 for each quarter, but +1 because we're subtracting one below. + this.dividend = 0; + } + + this.dividendTimer--; + }; + App.Corporate.endWeek = function() { + let ledger = new WeekProcessingLedger(); + //Prepare requests + for(let div of this.divisionList.filter(div=>div.founded)) { + let divLedger = ledger.getDivision(div) + + ledger.operatingCost += div.maintenanceCost; + ledger.registerMaintenanceForDivision(div); + + div.endweek_Revenue(divLedger); + div.endWeek_Slaves(divLedger); + } + for(let divLedger of Object.values(ledger.divisionLedgers)) { + let div = divLedger.division; + div.endWeek_Transfer(divLedger); + div.endWeek_Market(divLedger); + } + this.chargeAsset(ledger.operatingCost, "operations"); + this.chargeAsset(ledger.overhead, "overhead"); + //Execute sales requests, transfers, and earned revenue + for(let divLedger of Object.values(ledger.divisionLedgers)) { + let div = divLedger.division; + this.earnRevenue(divLedger.revenue.value, "local"); + if(div.activeSlaves > 0) + { + shared.SellOverflowSlaves(div); + } + + for(let otherDivPair of divLedger.transfer.divisions) { + let otherDiv = otherDivPair.division; + let count = otherDivPair.fill; + if(count == 0) continue; + + this.transferSlaves(div, otherDiv, count); + } + if(divLedger.market.sell > 0) { + divLedger.market.finalSale = this.sellSlaves(div, divLedger.market.sell); + } + } + + //Execute purchase requests + //todo: Make a switch to allow the user to control purchasing behavior. + //todo: Expensive first + //todo: Cheapest first + //Even purchase requsts: + let purchaseValues = evenFillArray(Object.values(ledger.divisionLedgers) + .filter(divLedger=>divLedger.market.buy > 0) + , this.cash + , divLedger=>divLedger.market.buyValue); + for(let divLedgerPair of purchaseValues) { + let divLedger = divLedgerPair.item; + let purchaseCost = divLedgerPair.value; + let div = divLedger.division; + + if(divLedger.market.buyValue > purchaseCost) { + //Estimate how many slaves we can afford within the purchase cost + let perSlaveEstimate = Math.trunc(divLedger.market.buyValue / divLedger.market.buy); + let numSlavesEstimate = Math.trunc(purchaseCost / perSlaveEstimate); + + if(numSlavesEstimate < 1) { + divLedger.market.originalBuy = divLedger.market.buy; + divLedger.market.buyShortMoney = divLedger.market.buyValue; + divLedger.market.buyShortSlaves = divLedger.market.buy; + divLedger.market.buy = 0; + } + else { + divLedger.market.originalBuy = divLedger.market.buy; + divLedger.market.buyShortMoney = divLedger.market.buyValue - purchaseCost; + divLedger.market.buyShortSlaves = divLedger.market.buy - numSlavesEstimate; + divLedger.market.buy = numSlavesEstimate; + } + } + divLedger.market.finalPurchase = this.buySlaves(div, divLedger.market.buy); + } + this.creditEconomy(); + + if(this.numDivisions < this.divisionList.length && !this.canExpand) + { + let expansionValue = Math.trunc(Math.pow(this.numDivisions, 1.5) + (5 * this.numDivisions + 2) / 4); + if(this.value > expansionValue * 1000000) + { + ledger.canExpandNow = true; + this.canExpand = true; + } + } + let specializationExpansion = 1.6 * Math.pow(1.25, this.specializations) - 1.2; + if(this.value > specializationExpansion * 1000000){ + this.specializationTokens++; + this.specializations++; + ledger.canSpecializeNow = true; + } + if(this.specializationTimer > 0) + { + this.specializationTimer--; + } + this.calculateDividend(ledger); + + return ledger; + }; + App.Corporate.cheatCash = function(userCash) { + userCash = Math.trunc(Number(userCash)) + if(Number.isFinite(userCash)) { + this.cash = userCash; + V.cheater = 1 + } + } App.Corporate.Backcompat = function(){ //current foreignRevenue used to be used for old foreignRevenue @@ -915,12 +915,12 @@ App.Corporate.Init = function() { } }; - if(V.corpDivTrainSurgeryTimer !== undefined) { - let timer = V.corpDivTrainSurgeryTimer; - // Note: originally the timer was capped at 20, so the founding week isn't guaranteed to be correct. - V.corpDivSurgeryFounded = V.week - timer; - delete V.corpDivTrainSurgeryTimer; - } + if(V.corpDivTrainSurgeryTimer !== undefined) { + let timer = V.corpDivTrainSurgeryTimer; + // Note: originally the timer was capped at 20, so the founding week isn't guaranteed to be correct. + V.corpDivSurgeryFounded = V.week - timer; + delete V.corpDivTrainSurgeryTimer; + } }; @@ -928,24 +928,24 @@ App.Corporate.Init = function() { // A positive q means adding shares to the market, negative means removing them window.corpSharePrice = function(q = 0, personalShares = null, publicShares = null) { - if (V.corpIncorporated === 0) { - return 0; - } - personalShares = personalShares || V.personalShares; - publicShares = publicShares || V.publicShares; - return Math.trunc(1000 * (App.Corporate.value / (personalShares + publicShares + q))); + if (V.corpIncorporated === 0) { + return 0; + } + personalShares = personalShares || V.personalShares; + publicShares = publicShares || V.publicShares; + return Math.trunc(1000 * (App.Corporate.value / (personalShares + publicShares + q))); }; // Corporation race blacklisting/whitelisting // race is the lowercase string representing the race, 'blacklist' is either 1 or 0. 1 means we are blacklisting and 0 means we are whitelisting said race window.corpBlacklistRace = function(race, blacklist) { - let raceArray = State.variables.corpSpecRaces; - if (raceArray.length > 0 && blacklist === 1) { - raceArray.delete(race); - } else if (blacklist === 1) { - raceArray = setup.filterRacesLowercase.filter(x => x !== race); - } else { - raceArray.push(race); - } - return raceArray; + let raceArray = State.variables.corpSpecRaces; + if (raceArray.length > 0 && blacklist === 1) { + raceArray.delete(race); + } else if (blacklist === 1) { + raceArray = setup.filterRacesLowercase.filter(x => x !== race); + } else { + raceArray.push(race); + } + return raceArray; }; diff --git a/src/Corporation/corporateWidgets.tw b/src/Corporation/corporateWidgets.tw index 1cefcb6b16c09cdc8329eecdadc04a3ae98e8df5..2305d778bd0e7625aedc6d821f40ac5542d0988f 100644 --- a/src/Corporation/corporateWidgets.tw +++ b/src/Corporation/corporateWidgets.tw @@ -4,8 +4,8 @@ Usage: <<CorporateLedger _ledger $week>> - _ledger: One of the members of App.Corporate.ledger, such as .current or .old - $week: The current week or the previous week, depending on wether you used current or old. + _ledger: One of the members of App.Corporate.ledger, such as .current or .old + $week: The current week or the previous week, depending on whether you used current or old. */ <<widget "CorporateLedger">> <table class="corporate"> @@ -16,7 +16,7 @@ Usage: /*Returns last week's revenue, gets calculated in corporationDevelopments, but slaves sold here also added to it for next week*/ <tr><td>Revenue</td><td><<= cashFormatColor($args[0].revenue)>></td></tr> <<if ($cheatMode) && ($cheatModeM) && App.Corporate.foreignRevenue > 0>> - <tr><td>Including Neighbor Bonus</td><td><<= cashFormatColor($args[0].foreignRevenue)>></td></tr> + <tr><td>Including Neighbor Bonus</td><td><<= cashFormatColor($args[0].foreignRevenue)>></td></tr> <</if>> /*Just like revenue, except for operating expenses (all calculated in corporationDevelopments)*/ <tr><td>Operating Expenses</td><td><<= cashFormatColor($args[0].operations, true)>></td></tr> @@ -25,23 +25,23 @@ Usage: /*costs associated with expanding divisions end up here, reports costs from last week, not current*/ <tr><td>Asset Expenses</td><td><<= cashFormatColor($args[0].development, true)>></td></tr> <<if ($cheatMode) && ($cheatModeM)>> - <tr> - <td>Economic <<if $args[0].economicBoost < 0>>Expenses<<else>>Windfall<</if>></td> - <td><<= cashFormatColor($args[0].economicBoost)>></td> - </tr> + <tr> + <td>Economic <<if $args[0].economicBoost < 0>>Expenses<<else>>Windfall<</if>></td> + <td><<= cashFormatColor($args[0].economicBoost)>></td> + </tr> <</if>> <tr><td>Overhead</td><td><<= cashFormatColor($args[0].overhead, true)>></td></tr> <tr><td>Profit</td><td> <div><<= cashFormatColor($args[0].profit)>></div> <<if $args[0].economicBoost > 0>> <div class="note"> - <<if $args[0].economy > 100>> - * Profits benefited from a strong economy. - <<elseif $args[0].economy > 60>> - * Profits were lowered by the weak economy. - <<else>> - * Profits were severely depressed by the failing economy. - <</if>> + <<if $args[0].economy > 100>> + * Profits benefited from a strong economy. + <<elseif $args[0].economy > 60>> + * Profits were lowered by the weak economy. + <<else>> + * Profits were severely depressed by the failing economy. + <</if>> </div> <</if>> </td></tr> @@ -51,20 +51,20 @@ Usage: </thead> <tbody> <tr> - <td>Liquidity</td> - <td> - <<if ($cheatMode) && ($cheatModeM)>> - <span id="corpCash"><<= cashFormatColor(App.Corporate.cash)>></span> - <<set _TcorpCash = App.Corporate.cash>> - <<textbox "_TcorpCash" _TcorpCash>> - <<link "Apply">> - <<set App.Corporate.cheatCash(_TcorpCash)>> - <<replace "#corpCash">><<= cashFormatColor(App.Corporate.cash)>><</replace>> - <</link>> - <<else>> - <<= cashFormatColor(App.Corporate.cash)>> - <</if>> - </td> + <td>Liquidity</td> + <td> + <<if ($cheatMode) && ($cheatModeM)>> + <span id="corpCash"><<= cashFormatColor(App.Corporate.cash)>></span> + <<set _TcorpCash = App.Corporate.cash>> + <<textbox "_TcorpCash" _TcorpCash>> + <<link "Apply">> + <<set App.Corporate.cheatCash(_TcorpCash)>> + <<replace "#corpCash">><<= cashFormatColor(App.Corporate.cash)>><</replace>> + <</link>> + <<else>> + <<= cashFormatColor(App.Corporate.cash)>> + <</if>> + </td> </tr> <tr><td>Corporate Value</td><td><<= cashFormatColor(App.Corporate.value)>></td></tr> <tr> @@ -72,9 +72,9 @@ Usage: <td> <div><<= cashFormatColor(App.Corporate.dividend)>></div> <div class="note">Pays out on <<=asDateString($args[1] + App.Corporate.dividendTimer, -1)>>, <<if App.Corporate.dividendTimer == 1>> - the end of this week + the end of this week <<else>> - in <<= App.Corporate.dividendTimer >> weeks + in <<= App.Corporate.dividendTimer >> weeks <</if>> </div> </td></tr> diff --git a/src/Corporation/corporationDevelopments.tw b/src/Corporation/corporationDevelopments.tw index a63df211aca26f3cc16527157db1c7762580bf1f..0403f009bc6769bb1194d467642e5bc9085caa02 100644 --- a/src/Corporation/corporationDevelopments.tw +++ b/src/Corporation/corporationDevelopments.tw @@ -3,7 +3,7 @@ /*Main Corporation Pass*/ <<if App.Corporate.cash < 0>> - <<set App.Corporate.cash = Math.trunc(App.Corporate.cash * 1.02)>> /*2% weekly interest rate on negative cash*/ + <<set App.Corporate.cash = Math.trunc(App.Corporate.cash * 1.02)>> /*2% weekly interest rate on negative cash*/ <</if>> <h1>Corporation Management</h1> @@ -12,44 +12,44 @@ <<set _weekLedger = App.Corporate.endWeek()>> /* TODO: I would like to move some of the following loop into a new loop. It should go Process -> Transfer -> Sell -> Buy (most expensive to least) to give the best chance of auto-buy having enough money to make purchases. */ <<for _d range _weekLedger.divisionLedgers>> - <<set _div = _d.division>> - /* Reporting on number of slaves being processed or completed processing */ - <br><<= _div.name>>: The division <<= _div.message_endWeek_Slaves(_d) >>. - <<if _d.market.originalBuy != null>> - <br> - <<if _d.market.buy == 0>> - It couldn't purchase <<= numberWithPlural(_d.market.originalBuy, "slave") >> to replenish its stock from the market because it couldn't afford to purchase price. - <<else>> - It needed to replenish its slave stock of <<= numberWithPlural(_d.market.originalBuy, "slave")>>, but couldn't afford to buy all of them. It bought <<= numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket)>> for <<= cashFormatColor(_d.market.finalPurchase, true) >>. - <</if>> - <<elseif _d.market.buy > 0>> - <br>It replenished its slave stock and bought <<= numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket) >> from the market for <<= cashFormatColor(_d.market.finalPurchase, true) >>. - <</if>> - <<if _d.transfer.total > 0>> - <<for _nextDivLedger range _d.transfer.divisions>> - <<set _nextDiv = _nextDivLedger.division>> - <<set _slavesToNext = _nextDivLedger.fill>> + <<set _div = _d.division>> + /* Reporting on number of slaves being processed or completed processing */ + <br><<= _div.name>>: The division <<= _div.message_endWeek_Slaves(_d) >>. + <<if _d.market.originalBuy != null>> + <br> + <<if _d.market.buy == 0>> + It couldn't purchase <<= numberWithPlural(_d.market.originalBuy, "slave") >> to replenish its stock from the market because it couldn't afford to purchase price. + <<else>> + It needed to replenish its slave stock of <<= numberWithPlural(_d.market.originalBuy, "slave")>>, but couldn't afford to buy all of them. It bought <<= numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket)>> for <<= cashFormatColor(_d.market.finalPurchase, true) >>. + <</if>> + <<elseif _d.market.buy > 0>> + <br>It replenished its slave stock and bought <<= numberWithPlural(_d.market.buy, _div.nounSlaveFromMarket) >> from the market for <<= cashFormatColor(_d.market.finalPurchase, true) >>. + <</if>> + <<if _d.transfer.total > 0>> + <<for _nextDivLedger range _d.transfer.divisions>> + <<set _nextDiv = _nextDivLedger.division>> + <<set _slavesToNext = _nextDivLedger.fill>> - It moved <<= numberWithPlural(_slavesToNext, "slave")>> to the <<= _nextDiv.name>> Division. - <</for>> - <</if>> - <<if _div.toMarket>> - <<if _div.heldSlaves == 0>> - <<if _d.market.sell > 0>> - It immediately sold <<= numberWithPlural(_d.market.sell, _div.nounFinishedSlave) >> to the market and made <<= cashFormatColor(_d.market.finalSale)>>. - <</if>> - <<else>> - It holds @@.green;<<= numberWithPlural(_div.heldSlaves, _div.nounFinishedSlave)>>@@ at the end of the - <<if _d.market.sell > 0>> - week, but it ran out of storage space and had to sell @@.red;<<= numberWithPlural(_d.market.sell, "slave")>>@@ and made <<= cashFormatColor(_d.market.finalSale)>>. - <<else>> - week. - <</if>> - <</if>> - <</if>> - <<if _d.revenue.value > 0>> - It earned <<= cashFormatColor(_d.revenue.value)>> in revenue. - <</if>> + It moved <<= numberWithPlural(_slavesToNext, "slave")>> to the <<= _nextDiv.name>> Division. + <</for>> + <</if>> + <<if _div.toMarket>> + <<if _div.heldSlaves == 0>> + <<if _d.market.sell > 0>> + It immediately sold <<= numberWithPlural(_d.market.sell, _div.nounFinishedSlave) >> to the market and made <<= cashFormatColor(_d.market.finalSale)>>. + <</if>> + <<else>> + It holds @@.green;<<= numberWithPlural(_div.heldSlaves, _div.nounFinishedSlave)>>@@ at the end of the + <<if _d.market.sell > 0>> + week, but it ran out of storage space and had to sell @@.red;<<= numberWithPlural(_d.market.sell, "slave")>>@@ and made <<= cashFormatColor(_d.market.finalSale)>>. + <<else>> + week. + <</if>> + <</if>> + <</if>> + <<if _d.revenue.value > 0>> + It earned <<= cashFormatColor(_d.revenue.value)>> in revenue. + <</if>> <</for>> /*Aggregate Corporation Results*/ @@ -58,42 +58,42 @@ /*Division Expansion Tokens*/ <<if _weekLedger.canExpandNow>> - <div class="majorText">Your corporation is ready to start an additional division!</div> + <div class="majorText">Your corporation is ready to start an additional division!</div> <</if>> /*Specializations tokens*/ <<if _weekLedger.canSpecializeNow>> - <div class="majorText">Your corporation is ready to specialize its slaves further!</div> + <div class="majorText">Your corporation is ready to specialize its slaves further!</div> <</if>> /*Calculating cash set aside for dividend*/ <h2>Dividend</h2> <div> <<if App.Corporate.dividendRatio > 0>> - The corporation is currently reserving <<= Math.floor(App.Corporate.dividendRatio * 100)>>% of its profit to be paid out as dividends. + The corporation is currently reserving <<= Math.floor(App.Corporate.dividendRatio * 100)>>% of its profit to be paid out as dividends. <<else>> - The corporation is currently not reserving a portion of its profit to be paid out as dividends. + The corporation is currently not reserving a portion of its profit to be paid out as dividends. <</if>> <<if App.Corporate.payoutCash>> - It is putting aside unused cash reserves to be paid out as dividends. + It is putting aside unused cash reserves to be paid out as dividends. <</if>> </div> <div> <<if App.Corporate.dividend > 0>> - <<if _weekLedger.hasDividend>> - It reserved <<print cashFormatColor(_weekLedger.dividend)>> this week. - <</if>> - A total of <<print cashFormatColor(App.Corporate.dividend)>> has been put aside for its shareholders. + <<if _weekLedger.hasDividend>> + It reserved <<print cashFormatColor(_weekLedger.dividend)>> this week. + <</if>> + A total of <<print cashFormatColor(App.Corporate.dividend)>> has been put aside for its shareholders. <</if>> </div> <<if _weekLedger.hasPayout>> - <div>This week the dividends were paid out, you received <<print cashFormatColor(_weekLedger.payout)>>.</div> + <div>This week the dividends were paid out, you received <<print cashFormatColor(_weekLedger.payout)>>.</div> <</if>> /*Bankrupted the Corporation*/ <<if App.Corporate.value < 0>> - <<run App.Corporation.Dissolve()>> - <br>@@.red;Your corporation went bankrupt.@@ + <<run App.Corporation.Dissolve()>> + <br>@@.red;Your corporation went bankrupt.@@ <</if>> /*This needs to be at the very end of the financials*/ <<run App.Corporate.ledger.swap()>> diff --git a/src/Corporation/manageCorporation.tw b/src/Corporation/manageCorporation.tw index 38676cea6023597f8ff17ea95af810128fbe7f0d..328e55d59aa059bdd7b4f5dcafb72de25a53cb58 100644 --- a/src/Corporation/manageCorporation.tw +++ b/src/Corporation/manageCorporation.tw @@ -16,43 +16,43 @@ /*Picking a starting division*/ <<if $vanillaShareSplit == 1>> - <<set _corpPerShares = 2000>> - <<set _corpPubShares = 1000>> + <<set _corpPerShares = 2000>> + <<set _corpPubShares = 1000>> <<else>> - <<set _corpPerShares = 8000>> - <<set _corpPubShares = 7000>> + <<set _corpPerShares = 8000>> + <<set _corpPubShares = 7000>> <</if>> <<for _index, _div range _divisionsByFoundingCost>> - <<set _divCost = App.Corporate.foundingCostToPlayer(_div, _corpPerShares, _corpPubShares)>> - <<if $cash >= _divCost>> - <<if _index == 0>> - You can lay the groundwork for a slave corporation and choose to start out with: - <</if>> - <div> - <<= "[[" + _div.name + "|Manage Corporation]" - + "[App.Corporate.create( '"+ _div.id + "'" - +", " + _corpPerShares - +", " + _corpPubShares - +")]]">> (<<=cashFormat(_divCost)>>): Focuses on <<= _div.focusDescription >>. - </div> - <<else>> - <br>You lack the funds <<= _optionsText[App.Utils.mapIndexBetweenLists(_index, _divisionsByFoundingCost, _optionsText)] >>. You need at least @@.yellowgreen;<<print cashFormat(_divCost)>>@@ - <<if _index != 0>> - <<if _index < _divisionsByFoundingCost.length - 1>> - for the next option and at most @@.yellowgreen;<<print cashFormat(App.Corporate.foundingCostToPlayer(_divisionsByFoundingCost[_divisionsByFoundingCost.length - 1], _corpPerShares, _corpPubShares))>>@@. - <<else>> - for it. - <</if>> - <</if>> - <<break>> - <</if>> + <<set _divCost = App.Corporate.foundingCostToPlayer(_div, _corpPerShares, _corpPubShares)>> + <<if $cash >= _divCost>> + <<if _index == 0>> + You can lay the groundwork for a slave corporation and choose to start out with: + <</if>> + <div> + <<= "[[" + _div.name + "|Manage Corporation]" + + "[App.Corporate.create( '"+ _div.id + "'" + +", " + _corpPerShares + +", " + _corpPubShares + +")]]">> (<<=cashFormat(_divCost)>>): Focuses on <<= _div.focusDescription >>. + </div> + <<else>> + <br>You lack the funds <<= _optionsText[App.Utils.mapIndexBetweenLists(_index, _divisionsByFoundingCost, _optionsText)] >>. You need at least @@.yellowgreen;<<print cashFormat(_divCost)>>@@ + <<if _index != 0>> + <<if _index < _divisionsByFoundingCost.length - 1>> + for the next option and at most @@.yellowgreen;<<print cashFormat(App.Corporate.foundingCostToPlayer(_divisionsByFoundingCost[_divisionsByFoundingCost.length - 1], _corpPerShares, _corpPubShares))>>@@. + <<else>> + for it. + <</if>> + <</if>> + <<break>> + <</if>> <</for>> <<if $vanillaShareSplit == 1>> - <br>[[8-7 Share Split|Manage Corporation][$vanillaShareSplit = 0]] + <br>[[8-7 Share Split|Manage Corporation][$vanillaShareSplit = 0]] <<else>> - <br>[[2-1 Share Split|Manage Corporation][$vanillaShareSplit = 1]] + <br>[[2-1 Share Split|Manage Corporation][$vanillaShareSplit = 1]] <</if>> <<else>> /*When the corporation exists*/ @@ -67,196 +67,196 @@ <h1>Division Management</h1> <<for _div range App.Corporate.divisionList.filter(x => x.founded)>> - <h2><<= _div.name>> Division</h2> - <<if _div.foundedDate != 0>> - <div class="founding">Founded on <<= asDateString(_div.foundedDate)>></div> - <</if>> - This division focuses on <<= _div.focusDescription >>. - <br><<= _div.messageSlaveCount() >> + <h2><<= _div.name>> Division</h2> + <<if _div.foundedDate != 0>> + <div class="founding">Founded on <<= asDateString(_div.foundedDate)>></div> + <</if>> + This division focuses on <<= _div.focusDescription >>. + <br><<= _div.messageSlaveCount() >> - <<set _divMaint = _div.getDisplayMaintenanceCost()>> - <br>It costs @@.red;<<= cashFormat(Math.trunc(_divMaint.cost))>>@@ to run. On average that is @@.red;<<= cashFormat(Math.trunc(_divMaint.perUnit)) >>@@ per slave. - <br><<= _div.messageSlaveOutput() >> - <<set _divSentanceStart = ["Currently the division", "It also"]>> - <h3>Direct Control</h3> - <<if _div.fromMarket>> - <div> - <<= _divSentanceStart.shift() >> is <<= _div.slaveAction.present >> @@.green;<<= numberWithPlural(_div.activeSlaves, "slave") >>@@. - <<if _div.activeSlaves < _div.developmentCount>> - <<set _fillSlaveCount = _div.availableRoom>> - <br>There is room to <<= _div.slaveAction.future >> <<= numberWithPluralOne(_fillSlaveCount, "more slave")>>. - <<set _buySlaveArray = [ - { 'name': 'Buy Slave', 'count':1 }, - { 'name': 'Buy x10' , 'count':10} - ]>> - <<if !_buySlaveArray.some(function(x) { return x.count == _fillSlaveCount })>> - <<run _buySlaveArray.push({ 'name': 'Fill' , 'count':_fillSlaveCount})>> - <</if>> - <<set _singleSlaveCost = App.Corporate.slaveMarketPurchaseValue(_div, 1)>> - <<if $corpCash > _singleSlaveCost>> - <div> - The corporation can purchase slaves directly from the market for about <<=cashFormatColor(_singleSlaveCost)>> - </div> - <div> - <<set _sepObj.need = false>> - <<for _slaveNum range _buySlaveArray.filter(num => _div.availableRoom > num.count)>> - <<set _slaveSetCost = App.Corporate.slaveMarketPurchaseValue(_div, _slaveNum.count)>> - <<if $corpCash < _slaveSetCost>> - <<continue>> - <</if>> - <<= Seperator(_sepObj) >> - <<= "[[" + _slaveNum.name + "|Manage Corporation]" - + "[App.Corporate.buySlaves('"+_div.id+"', "+_slaveNum.count+")]" - + "]">> - <</for>> - </div> - <<else>> - <div>//The corporation cannot afford to purchase any slaves from the market.// It requires about @@.yellowgreen;<<= cashFormat(_singleSlaveCost)>>@@ to buy a <<= asSingular(_div.slaveAction.market)>>.</div> - <</if>> - <<else>> - <br>There is //no room// to <<= _div.slaveAction.future>> more slaves. - <</if>> - </div> - <</if>> - <<if _div.toMarket>> - <<set _finishedSlaveNoun = _div.nounFinishedSlave>> - <<if _div.heldSlaves > 0>> - <div> - <<= _divSentanceStart.shift() >> holds @@.green;<<= numberWithPlural(_div.heldSlaves, _finishedSlaveNoun) >>@@. - <<for _nextDiv range _div.relatedDivisions - .to - .filter(div => div.availableRoom > 0 - && !App.Corporate.ownsIntermediaryDivision(_div, div))>> - <div> - The <<= _nextDiv.name >> Division can accept up to @@.green;<<= numberWithPlural(_nextDiv.availableRoom, "slave") >>@@. + <<set _divMaint = _div.getDisplayMaintenanceCost()>> + <br>It costs @@.red;<<= cashFormat(Math.trunc(_divMaint.cost))>>@@ to run. On average that is @@.red;<<= cashFormat(Math.trunc(_divMaint.perUnit)) >>@@ per slave. + <br><<= _div.messageSlaveOutput() >> + <<set _divSentanceStart = ["Currently the division", "It also"]>> + <h3>Direct Control</h3> + <<if _div.fromMarket>> + <div> + <<= _divSentanceStart.shift() >> is <<= _div.slaveAction.present >> @@.green;<<= numberWithPlural(_div.activeSlaves, "slave") >>@@. + <<if _div.activeSlaves < _div.developmentCount>> + <<set _fillSlaveCount = _div.availableRoom>> + <br>There is room to <<= _div.slaveAction.future >> <<= numberWithPluralOne(_fillSlaveCount, "more slave")>>. + <<set _buySlaveArray = [ + { 'name': 'Buy Slave', 'count':1 }, + { 'name': 'Buy x10' , 'count':10} + ]>> + <<if !_buySlaveArray.some(function(x) { return x.count == _fillSlaveCount })>> + <<run _buySlaveArray.push({ 'name': 'Fill' , 'count':_fillSlaveCount})>> + <</if>> + <<set _singleSlaveCost = App.Corporate.slaveMarketPurchaseValue(_div, 1)>> + <<if $corpCash > _singleSlaveCost>> + <div> + The corporation can purchase slaves directly from the market for about <<=cashFormatColor(_singleSlaveCost)>> + </div> + <div> + <<set _sepObj.need = false>> + <<for _slaveNum range _buySlaveArray.filter(num => _div.availableRoom > num.count)>> + <<set _slaveSetCost = App.Corporate.slaveMarketPurchaseValue(_div, _slaveNum.count)>> + <<if $corpCash < _slaveSetCost>> + <<continue>> + <</if>> + <<= Seperator(_sepObj) >> + <<= "[[" + _slaveNum.name + "|Manage Corporation]" + + "[App.Corporate.buySlaves('"+_div.id+"', "+_slaveNum.count+")]" + + "]">> + <</for>> + </div> + <<else>> + <div>//The corporation cannot afford to purchase any slaves from the market.// It requires about @@.yellowgreen;<<= cashFormat(_singleSlaveCost)>>@@ to buy a <<= asSingular(_div.slaveAction.market)>>.</div> + <</if>> + <<else>> + <br>There is //no room// to <<= _div.slaveAction.future>> more slaves. + <</if>> + </div> + <</if>> + <<if _div.toMarket>> + <<set _finishedSlaveNoun = _div.nounFinishedSlave>> + <<if _div.heldSlaves > 0>> + <div> + <<= _divSentanceStart.shift() >> holds @@.green;<<= numberWithPlural(_div.heldSlaves, _finishedSlaveNoun) >>@@. + <<for _nextDiv range _div.relatedDivisions + .to + .filter(div => div.availableRoom > 0 + && !App.Corporate.ownsIntermediaryDivision(_div, div))>> + <div> + The <<= _nextDiv.name >> Division can accept up to @@.green;<<= numberWithPlural(_nextDiv.availableRoom, "slave") >>@@. - <<set _sendSlaveArray = [ - {'name': 'Send Slave', 'count':1 }, - {'name': 'Send x10' , 'count':10 } - ]>> - <<if _div.heldSlaves >= _nextDiv.availableRoom>> - <<run _sendSlaveArray.push({'name':`Fill ${_nextDiv.name} Division`, 'count':_nextDiv.availableRoom})>> - <<else>> - <<run _sendSlaveArray.push({'name':'Send All', 'count':_div.heldSlaves})>> - <</if>> - <<set _sepObj.need = false>> - <<for _index, _slaveNum range _sendSlaveArray.filter(slaveNum => slaveNum.count <= _nextDiv.availableRoom && slaveNum.count <= _div.heldSlaves)>> - <<= Seperator(_sepObj)>> - <<= "[[" + _slaveNum.name + "|Manage Corporation]" - + "[App.Corporate.transferSlaves('"+_div.id+"', '"+_nextDiv.id+"', "+_slaveNum.count+")" - + "]]">> - <</for>> - </div> - <</for>> - </div> + <<set _sendSlaveArray = [ + {'name': 'Send Slave', 'count':1 }, + {'name': 'Send x10' , 'count':10 } + ]>> + <<if _div.heldSlaves >= _nextDiv.availableRoom>> + <<run _sendSlaveArray.push({'name':`Fill ${_nextDiv.name} Division`, 'count':_nextDiv.availableRoom})>> + <<else>> + <<run _sendSlaveArray.push({'name':'Send All', 'count':_div.heldSlaves})>> + <</if>> + <<set _sepObj.need = false>> + <<for _index, _slaveNum range _sendSlaveArray.filter(slaveNum => slaveNum.count <= _nextDiv.availableRoom && slaveNum.count <= _div.heldSlaves)>> + <<= Seperator(_sepObj)>> + <<= "[[" + _slaveNum.name + "|Manage Corporation]" + + "[App.Corporate.transferSlaves('"+_div.id+"', '"+_nextDiv.id+"', "+_slaveNum.count+")" + + "]]">> + <</for>> + </div> + <</for>> + </div> - <div>The corporation can sell these slaves to the market. + <div>The corporation can sell these slaves to the market. - <<set _sellSlaveArray = [ - {'name':'Sell Slave', 'count':1 }, - {'name':'Sell x10' , 'count':10 }, - {'name':'Sell x100' , 'count':100 }, - {'name':'Sell All' , 'count':_div.heldSlaves } - ]>> + <<set _sellSlaveArray = [ + {'name':'Sell Slave', 'count':1 }, + {'name':'Sell x10' , 'count':10 }, + {'name':'Sell x100' , 'count':100 }, + {'name':'Sell All' , 'count':_div.heldSlaves } + ]>> - <<set _sepObj.need = false>> - <<for _index, _slaveNum range _sellSlaveArray.filter(slaveNum => _div.heldSlaves >= slaveNum.count)>> - <<= Seperator(_sepObj)>> - <<= "[[" + _slaveNum.name + "|Manage Corporation]" - + "[App.Corporate.sellSlaves('"+_div.id+"',"+_slaveNum.count+")]" - + "]">> - <</for>> - </div> - <<else>> - <div>The division is not holding any <<= asPlural(_finishedSlaveNoun)>>.</div> - <</if>> - <</if>> + <<set _sepObj.need = false>> + <<for _index, _slaveNum range _sellSlaveArray.filter(slaveNum => _div.heldSlaves >= slaveNum.count)>> + <<= Seperator(_sepObj)>> + <<= "[[" + _slaveNum.name + "|Manage Corporation]" + + "[App.Corporate.sellSlaves('"+_div.id+"',"+_slaveNum.count+")]" + + "]">> + <</for>> + </div> + <<else>> + <div>The division is not holding any <<= asPlural(_finishedSlaveNoun)>>.</div> + <</if>> + <</if>> - /* Expanding the division*/ - <<set _depExpandCost = _div.sizeCost * 1000>> - <div>Expanding the division costs <span class="red"><<print cashFormat(_depExpandCost)>></span>. Downsizing recoups 80% of the investment; slaves will be sold at the going rate.</div> - <div> - <<set _buyDevArray = [ - { 'name': 'Expand Division' , 'count':1}, - { 'name': 'Expand x10', 'count':10} - ]>> - <<set _sepObj.need = false>> - <<for _buySet range _buyDevArray.filter(buySet => App.Corporate.cash >= buySet.count * _depExpandCost)>> - <<= Seperator(_sepObj) >> - <<= "[["+_buySet.name+"|Manage Corporation]" - + "[App.Corporate.buyDevelopment('" + _div.id + "', " + _buySet.count + ")]" - + "]">> - <</for>> + /* Expanding the division*/ + <<set _depExpandCost = _div.sizeCost * 1000>> + <div>Expanding the division costs <span class="red"><<print cashFormat(_depExpandCost)>></span>. Downsizing recoups 80% of the investment; slaves will be sold at the going rate.</div> + <div> + <<set _buyDevArray = [ + { 'name': 'Expand Division' , 'count':1}, + { 'name': 'Expand x10', 'count':10} + ]>> + <<set _sepObj.need = false>> + <<for _buySet range _buyDevArray.filter(buySet => App.Corporate.cash >= buySet.count * _depExpandCost)>> + <<= Seperator(_sepObj) >> + <<= "[["+_buySet.name+"|Manage Corporation]" + + "[App.Corporate.buyDevelopment('" + _div.id + "', " + _buySet.count + ")]" + + "]">> + <</for>> - /* Downsize the division*/ - <<set _depDownsizeCost = _depExpandCost * 0.8>> - <<set _sellDevArray = [ - { 'name': 'Downsize Division', 'count':1 }, - { 'name': 'Downsize x10' , 'count':10} - ]>> - <<for _sellSet range _sellDevArray.filter(divNum => _div.developmentCount > divNum.count)>> - <<= Seperator(_sepObj) >> - <<= "[["+_sellSet.name+"|Manage Corporation]" - + "[App.Corporate.sellDevelopment('"+_div.id+"', "+_sellSet.count+")]" - + "]">> - <</for>> - </div> - <h3>Rules</h3> - <<for _nextDiv range _div.relatedDivisions.to.filter(nextDiv => nextDiv.founded && !App.Corporate.ownsIntermediaryDivision(_div, nextDiv))>> - /* TODO: Originally this had a bit of flavor per nextDep. ie, Surgery said "to undergo surgery"*/ - <div> - <<if _div.getAutoSendToDivision(_nextDiv)>> - Auto send slaves to <<= _nextDiv.name >> Division <<= "[[Stop Auto Send|Manage Corporation][App.Corporate.setAutoSendToDivision('"+_div.id+"', '"+_nextDiv.id+"', false)]]">> - <<else>> - Do not send slaves to <<= _nextDiv.name >> Division <<= "[[Auto Send|Manage Corporation][App.Corporate.setAutoSendToDivision('"+_div.id+"', '"+_nextDiv.id+"', true)]]">> - <</if>> - </div> - <</for>> - <<if _div.toMarket>> - <div> - <<if _div.getAutoSendToMarket()>> - Auto sell slaves to the market <<= "[[Stop Auto Sell|Manage Corporation][App.Corporate.setAutoSendToMarket('"+_div.id+"', false)]]" >> - <<else>> - Do not sell slaves to the market <<= "[[Auto Sell|Manage Corporation][App.Corporate.setAutoSendToMarket('"+_div.id+"', true)]]" >> - <</if>> - </div> - <</if>> - <<if _div.fromMarket>> - <div> - <<if _div.getAutoBuyFromMarket()>> - Auto buy slaves from the market <<= "[[Stop Auto Buy|Manage Corporation][App.Corporate.setAutoBuyFromMarket('"+ _div.id +"', false)]]" >> - <<else>> - Do not buy slaves from the market <<= "[[Auto Buy|Manage Corporation][App.Corporate.setAutoBuyFromMarket('"+ _div.id +"', true)]]" >> - <</if>> - </div> - <</if>> - <<if App.Corporate.numDivisions > 1>> /* Cannot dissolve the last division */ - <div>Dissolve the division @@.orange;//Think before you click//@@ /* TODO: Add a confirmation button. Probably use replace?*/ - <<= "[[Dissolve|Manage Corporation]" - + "[App.Corporate.divisions['" + _div.id + "'].dissolve()]" - + "]">> - </div> - <</if>> + /* Downsize the division*/ + <<set _depDownsizeCost = _depExpandCost * 0.8>> + <<set _sellDevArray = [ + { 'name': 'Downsize Division', 'count':1 }, + { 'name': 'Downsize x10' , 'count':10} + ]>> + <<for _sellSet range _sellDevArray.filter(divNum => _div.developmentCount > divNum.count)>> + <<= Seperator(_sepObj) >> + <<= "[["+_sellSet.name+"|Manage Corporation]" + + "[App.Corporate.sellDevelopment('"+_div.id+"', "+_sellSet.count+")]" + + "]">> + <</for>> + </div> + <h3>Rules</h3> + <<for _nextDiv range _div.relatedDivisions.to.filter(nextDiv => nextDiv.founded && !App.Corporate.ownsIntermediaryDivision(_div, nextDiv))>> + /* TODO: Originally this had a bit of flavor per nextDep. ie, Surgery said "to undergo surgery"*/ + <div> + <<if _div.getAutoSendToDivision(_nextDiv)>> + Auto send slaves to <<= _nextDiv.name >> Division <<= "[[Stop Auto Send|Manage Corporation][App.Corporate.setAutoSendToDivision('"+_div.id+"', '"+_nextDiv.id+"', false)]]">> + <<else>> + Do not send slaves to <<= _nextDiv.name >> Division <<= "[[Auto Send|Manage Corporation][App.Corporate.setAutoSendToDivision('"+_div.id+"', '"+_nextDiv.id+"', true)]]">> + <</if>> + </div> + <</for>> + <<if _div.toMarket>> + <div> + <<if _div.getAutoSendToMarket()>> + Auto sell slaves to the market <<= "[[Stop Auto Sell|Manage Corporation][App.Corporate.setAutoSendToMarket('"+_div.id+"', false)]]" >> + <<else>> + Do not sell slaves to the market <<= "[[Auto Sell|Manage Corporation][App.Corporate.setAutoSendToMarket('"+_div.id+"', true)]]" >> + <</if>> + </div> + <</if>> + <<if _div.fromMarket>> + <div> + <<if _div.getAutoBuyFromMarket()>> + Auto buy slaves from the market <<= "[[Stop Auto Buy|Manage Corporation][App.Corporate.setAutoBuyFromMarket('"+ _div.id +"', false)]]" >> + <<else>> + Do not buy slaves from the market <<= "[[Auto Buy|Manage Corporation][App.Corporate.setAutoBuyFromMarket('"+ _div.id +"', true)]]" >> + <</if>> + </div> + <</if>> + <<if App.Corporate.numDivisions > 1>> /* Cannot dissolve the last division */ + <div>Dissolve the division @@.orange;//Think before you click//@@ /* TODO: Add a confirmation button. Probably use replace?*/ + <<= "[[Dissolve|Manage Corporation]" + + "[App.Corporate.divisions['" + _div.id + "'].dissolve()]" + + "]">> + </div> + <</if>> <</for>> <<if App.Corporate.canExpand>> /*is the corporation large enough to expand into another division?*/ <h1>Found New Division</h1> <div>The corporation can expand by founding a new division related to its current <<= onlyPlural(App.Corporate.divisionList.filter(div => div.founded).length, "division") >>.</div> - <<for _div range App.Corporate.divisionList.filter(x => !x.founded && x.relatedDivisions.anyFounded)>> - <<set _depCost = _div.foundingCost * 1000>> - <div> - <<if App.Corporate.cash >= _depCost>> - <<= "[[Add " + _div.name + " Division|Manage Corporation]" - + "[App.Corporate.divisions['"+_div.id+"'].create(App.Corporate)]]">> - (@@.yellowgreen;<<print cashFormat(_depCost)>>@@): A division focusing on <<= _div.focusDescription >>. - <<else>> - <<= _div.name >> - (@@.red;<<print cashFormat(_depCost)>>@@): - The corporation cannot afford to start a division focusing on <<= _div.focusDescription >>. - <</if>> - </div> - <</for>> + <<for _div range App.Corporate.divisionList.filter(x => !x.founded && x.relatedDivisions.anyFounded)>> + <<set _depCost = _div.foundingCost * 1000>> + <div> + <<if App.Corporate.cash >= _depCost>> + <<= "[[Add " + _div.name + " Division|Manage Corporation]" + + "[App.Corporate.divisions['"+_div.id+"'].create(App.Corporate)]]">> + (@@.yellowgreen;<<print cashFormat(_depCost)>>@@): A division focusing on <<= _div.focusDescription >>. + <<else>> + <<= _div.name >> + (@@.red;<<print cashFormat(_depCost)>>@@): + The corporation cannot afford to start a division focusing on <<= _div.focusDescription >>. + <</if>> + </div> + <</for>> <</if>> <h1>Financials</h1> <h2>Dividend</h2> @@ -266,32 +266,32 @@ <<set _index = _dividends.findIndex(element => App.Corporate.dividendRatio >= element ) >> <<set _dividend = _dividends[_index] >> <<if _index >= 0>> - <<set _nextIndex = _index + 1>> - <<set App.Corporate.dividendRatio = _dividend>>/* Normalize */ - The corporation is currently reserving <<= Math.trunc(_dividend * 100)>>% of its profit to be paid out as dividends. - <<set _sepObj.need = false>> - <<if _index > 0>> - <<= Seperator(_sepObj)>> - <<= "[[Increase Ratio|Manage Corporation][App.Corporate.dividendRatio = " + _dividends[_index - 1] + "]]">> - <</if>> - <<if _nextIndex != _dividends.length>> - <<= Seperator(_sepObj)>> - <<= "[[Reduce Ratio|Manage Corporation][App.Corporate.dividendRatio = " + _dividends[_nextIndex] + "]]">> - <<else>> - <<= Seperator(_sepObj)>> - <<= "[[None|Manage Corporation][App.Corporate.dividendRatio = 0]]">> - <</if>> + <<set _nextIndex = _index + 1>> + <<set App.Corporate.dividendRatio = _dividend>>/* Normalize */ + The corporation is currently reserving <<= Math.trunc(_dividend * 100)>>% of its profit to be paid out as dividends. + <<set _sepObj.need = false>> + <<if _index > 0>> + <<= Seperator(_sepObj)>> + <<= "[[Increase Ratio|Manage Corporation][App.Corporate.dividendRatio = " + _dividends[_index - 1] + "]]">> + <</if>> + <<if _nextIndex != _dividends.length>> + <<= Seperator(_sepObj)>> + <<= "[[Reduce Ratio|Manage Corporation][App.Corporate.dividendRatio = " + _dividends[_nextIndex] + "]]">> + <<else>> + <<= Seperator(_sepObj)>> + <<= "[[None|Manage Corporation][App.Corporate.dividendRatio = 0]]">> + <</if>> <<else>> - The corporation is currently not reserving a portion of its profit to be paid out as dividends. - <<= "[[Increase Ratio|Manage Corporation][App.Corporate.dividendRatio = "+_dividends[_dividends.length - 1]+"]]" >> + The corporation is currently not reserving a portion of its profit to be paid out as dividends. + <<= "[[Increase Ratio|Manage Corporation][App.Corporate.dividendRatio = "+_dividends[_dividends.length - 1]+"]]" >> <</if>> </div> <div> <<if App.Corporate.payoutCash>> - The corporation will payout unused cash reserves over @@.yellowgreen;<<print cashFormat(App.Corporate.payoutAfterCash)>>@@ as dividends [[Stop|Manage Corporation][App.Corporate.payoutCash = false]] + The corporation will payout unused cash reserves over @@.yellowgreen;<<print cashFormat(App.Corporate.payoutAfterCash)>>@@ as dividends [[Stop|Manage Corporation][App.Corporate.payoutCash = false]] <<else>> - You can direct the corporation to reserve cash over @@.yellowgreen;<<print cashFormat(App.Corporate.payoutAfterCash)>>@@ to be paid out as dividends as well. [[Payout Cash Reserves|Manage Corporation][App.Corporate.payoutCash = true]] + You can direct the corporation to reserve cash over @@.yellowgreen;<<print cashFormat(App.Corporate.payoutAfterCash)>>@@ to be paid out as dividends as well. [[Payout Cash Reserves|Manage Corporation][App.Corporate.payoutCash = true]] <</if>> </div> @@ -300,33 +300,33 @@ You own <<print num($personalShares)>> shares while another <<print num($publicShares)>> shares are traded publicly. The going rate on the market for 1000 shares is currently @@.yellowgreen;<<print cashFormat(corpSharePrice())>>.@@ <br>The corporation can buyback 1000 shares for @@.red;<<print cashFormat(corpSharePrice(-1000))>>@@ or issue 1000 shares and net @@.yellowgreen;<<print cashFormat(corpSharePrice(1000))>>.@@ The corporation will prefer to round shares to the nearest 1000 and will issue or buy shares toward that goal first. <<if $corpCash > corpSharePrice(-1000)>> - <<if $publicShares <= $personalShares - 2000 && $publicShares > 0>> /*It won't buy back player shares if the corporation is entirely owned by the player*/ - <<set _persExtraShares = $personalShares % 1000 || 1000>> - <br>The corporation can buyback some of your shares. - <<= "[[Buyback "+ _persExtraShares + "|Manage Corporation][cashX(corpSharePrice(-"+_persExtraShares+"), 'stocksTraded'), $corpCash -= corpSharePrice(-"+_persExtraShares+"), $personalShares -= "+_persExtraShares+"]]">> - <</if>> - <<if $publicShares >= 1000>> - <<set _pubExtraShares = $publicShares % 1000 || 1000>> - <br>The corporation can buyback some of the public shares. - <<= "[[Buyback "+ _pubExtraShares + "|Manage Corporation][$corpCash -= corpSharePrice(-"+_pubExtraShares+"), $publicShares -= "+_pubExtraShares+"]]">> - <</if>> + <<if $publicShares <= $personalShares - 2000 && $publicShares > 0>> /*It won't buy back player shares if the corporation is entirely owned by the player*/ + <<set _persExtraShares = $personalShares % 1000 || 1000>> + <br>The corporation can buyback some of your shares. + <<= "[[Buyback "+ _persExtraShares + "|Manage Corporation][cashX(corpSharePrice(-"+_persExtraShares+"), 'stocksTraded'), $corpCash -= corpSharePrice(-"+_persExtraShares+"), $personalShares -= "+_persExtraShares+"]]">> + <</if>> + <<if $publicShares >= 1000>> + <<set _pubExtraShares = $publicShares % 1000 || 1000>> + <br>The corporation can buyback some of the public shares. + <<= "[[Buyback "+ _pubExtraShares + "|Manage Corporation][$corpCash -= corpSharePrice(-"+_pubExtraShares+"), $publicShares -= "+_pubExtraShares+"]]">> + <</if>> <</if>> <<set _persLeftoverShares = 1000 - ($personalShares % 1000)>> <<if $cash > corpSharePrice(_persLeftoverShares)>> - <br>The corporation can issue <<=_persLeftoverShares>> shares to you. - <<= "[[Issue " + _persLeftoverShares + "|Manage Corporation][cashX(forceNeg(corpSharePrice("+_persLeftoverShares+")), 'stocksTraded'), $corpCash += corpSharePrice("+_persLeftoverShares+"), $personalShares += "+_persLeftoverShares+"]]">> + <br>The corporation can issue <<=_persLeftoverShares>> shares to you. + <<= "[[Issue " + _persLeftoverShares + "|Manage Corporation][cashX(forceNeg(corpSharePrice("+_persLeftoverShares+")), 'stocksTraded'), $corpCash += corpSharePrice("+_persLeftoverShares+"), $personalShares += "+_persLeftoverShares+"]]">> <</if>> <<set _pubLeftoverShares = 1000 - ($publicShares % 1000)>> <<if $publicShares <= $personalShares - 2000>> - <br>The corporation can issue <<=_pubLeftoverShares>> shares onto the stock market. - <<= "[[Issue " + _pubLeftoverShares + "|Manage Corporation][$corpCash += corpSharePrice("+_pubLeftoverShares+"), $publicShares += "+_pubLeftoverShares+"]]">> + <br>The corporation can issue <<=_pubLeftoverShares>> shares onto the stock market. + <<= "[[Issue " + _pubLeftoverShares + "|Manage Corporation][$corpCash += corpSharePrice("+_pubLeftoverShares+"), $publicShares += "+_pubLeftoverShares+"]]">> <</if>> <<if $publicShares <= $personalShares - 3000>> - <br>You can sell some of your shares on the stock market. [[Sell 1000|Manage Corporation][cashX(corpSharePrice(), "stocksTraded"), $personalShares -= 1000, $publicShares += 1000]] + <br>You can sell some of your shares on the stock market. [[Sell 1000|Manage Corporation][cashX(corpSharePrice(), "stocksTraded"), $personalShares -= 1000, $publicShares += 1000]] <</if>> <<if $cash > corpSharePrice() && $publicShares >= 1000>> - <br>You can buy some shares from the stock market [[Buy 1000|Manage Corporation][cashX(forceNeg(corpSharePrice()), "stocksTraded"), $personalShares += 1000, $publicShares -= 1000]] + <br>You can buy some shares from the stock market [[Buy 1000|Manage Corporation][cashX(forceNeg(corpSharePrice()), "stocksTraded"), $personalShares += 1000, $publicShares -= 1000]] <</if>> <h3>Stock Split</h3> @@ -335,809 +335,809 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<set _splitFeeValue = _splitFeeInitial - Math.floor((_splitFeeInitial * ($PC.skill.trading / 100.0) / 2.0) / 1000) * 1000>> <<set _splitStockConstants = App.Corporate.stockSplits >> - The corporation can perform a stock split to increase the number of stocks while maintaining the same owned value. This requires paying a market fee of @@.red;<<= cashFormat(_splitFeeValue)>>@@ plus a per-share fee depending on the type of split being done. - <<if _splitFeeValue < _splitFeeInitial>> - //You negotiated lower fees due to your @@.springgreen;business acumen@@.// - <</if>> + The corporation can perform a stock split to increase the number of stocks while maintaining the same owned value. This requires paying a market fee of @@.red;<<= cashFormat(_splitFeeValue)>>@@ plus a per-share fee depending on the type of split being done. + <<if _splitFeeValue < _splitFeeInitial>> + //You negotiated lower fees due to your @@.springgreen;business acumen@@.// + <</if>> <<if $corpSpecTimer > 0>> - <br>//The corporation has restructured too recently.// + <br>//The corporation has restructured too recently.// <</if>> <ul> <<for _stockType range _splitStockConstants>> - <<set _splitInitial = _stockType['cost']>> - <<set _splitValue = _splitInitial>> - <<set _splitDenom = _stockType['oldStocks'] || 1>> - <<set _splitNumerator = _stockType['newStocks'] || 1>> - <<set _splitMultiplier = _splitNumerator / _splitDenom>> - <<set _splitTotal = _splitValue * ($publicShares + $personalShares) + _splitFeeValue>> - <<set _splitWeek = _stockType['weeks']>> - <li><<= _splitNumerator >>-for-<<= _splitDenom>> <<if _splitDenom > _splitNumerator>>inverse<</if>> stock split at @@.red;<<= cashFormat(_splitValue) >>@@ per share. - Including market fees, this will cost the corporation a total of @@.red;<<= cashFormat(_splitTotal)>>@@, - leaving the going rate for stock at @@.yellowgreen;<<= cashFormat(Math.floor(corpSharePrice(0, $personalShares * _splitMultiplier, $publicShares * _splitMultiplier))) >>@@ per 1000 shares. - <<if $corpSpecTimer == 0>> - <<if $publicShares % _splitDenom != 0 || $personalShares % _splitDenom != 0>> - //The number of shares cannot be evenly split// - <<elseif $corpCash > _splitTotal>> - <<= "[[Split Shares|Manage Corporation][$corpCash -= " + _splitTotal + ", $publicShares *= " + _splitMultiplier + ", $personalShares *= " + _splitMultiplier + ", $corpSpecTimer="+_splitWeek+"]]" >> - <<else>> - //The corporation cannot afford the fees.// - <</if>> - <</if>> - </li> + <<set _splitInitial = _stockType['cost']>> + <<set _splitValue = _splitInitial>> + <<set _splitDenom = _stockType['oldStocks'] || 1>> + <<set _splitNumerator = _stockType['newStocks'] || 1>> + <<set _splitMultiplier = _splitNumerator / _splitDenom>> + <<set _splitTotal = _splitValue * ($publicShares + $personalShares) + _splitFeeValue>> + <<set _splitWeek = _stockType['weeks']>> + <li><<= _splitNumerator >>-for-<<= _splitDenom>> <<if _splitDenom > _splitNumerator>>inverse<</if>> stock split at @@.red;<<= cashFormat(_splitValue) >>@@ per share. + Including market fees, this will cost the corporation a total of @@.red;<<= cashFormat(_splitTotal)>>@@, + leaving the going rate for stock at @@.yellowgreen;<<= cashFormat(Math.floor(corpSharePrice(0, $personalShares * _splitMultiplier, $publicShares * _splitMultiplier))) >>@@ per 1000 shares. + <<if $corpSpecTimer == 0>> + <<if $publicShares % _splitDenom != 0 || $personalShares % _splitDenom != 0>> + //The number of shares cannot be evenly split// + <<elseif $corpCash > _splitTotal>> + <<= "[[Split Shares|Manage Corporation][$corpCash -= " + _splitTotal + ", $publicShares *= " + _splitMultiplier + ", $personalShares *= " + _splitMultiplier + ", $corpSpecTimer="+_splitWeek+"]]" >> + <<else>> + //The corporation cannot afford the fees.// + <</if>> + <</if>> + </li> <</for>> </ul> <h2>Slave specialization</h2> <<if $corpSpecToken > 0>> /*Spending tokens on new specializations*/ - <<if $corpSpecToken > 1>> - Your corporation has $corpSpecToken specializations left. - <<else>> - Your corporation has one specialization left. - <</if>> - <<if $corpSpecTimer > 0>> - You have recently changed specializations and the corporation needs <<if $corpSpecTimer > 1>>$corpSpecTimer more weeks<<else>>another week<</if>> before it can comply with another directive. - <<else>> - <br>Choosing to specialize your corporation uses a specialization. The corporation can be directed to focus on the following: - <<if $corpSpecRaces.length == 0 && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This used to be $captureUpgradeRace, it is a general acquisition specialization*/ - <br>Slaves who are not - <<if $arcologies[0].FSSubjugationistRace != "amerindian" || $arcologies[0].FSSubjugationist == "unset">>[[Amerindian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "asian" || $arcologies[0].FSSubjugationist == "unset">>[[Asian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "black" || $arcologies[0].FSSubjugationist == "unset">>[[Black|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "indo-aryan" || $arcologies[0].FSSubjugationist == "unset">>[[Indo-aryan|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "latina" || $arcologies[0].FSSubjugationist == "unset">>[[Latina|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "malay" || $arcologies[0].FSSubjugationist == "unset">>[[Malay|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "middle eastern" || $arcologies[0].FSSubjugationist == "unset">>[[Middle Eastern|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "mixed race" || $arcologies[0].FSSubjugationist == "unset">>[[Mixed Race|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "pacific islander" || $arcologies[0].FSSubjugationist == "unset">>[[Pacific Islander|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "semitic" || $arcologies[0].FSSubjugationist == "unset">>[[Semitic|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "southern european" || $arcologies[0].FSSubjugationist == "unset">>[[Southern European|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> - <<if $arcologies[0].FSSubjugationistRace != "white" || $arcologies[0].FSSubjugationist == "unset">>[[White|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]]<</if>> - — //additional races can be excluded. 4 races per token.// - <<if $corpSpecToken >= 3>> - <br>Only slaves who are - <<if $arcologies[0].FSSupremacistRace != "amerindian" || $arcologies[0].FSSubjugationist == "unset">>[[Amerindian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "asian" || $arcologies[0].FSSubjugationist == "unset">>[[Asian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "black" || $arcologies[0].FSSubjugationist == "unset">>[[Black|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "indo-aryan" || $arcologies[0].FSSubjugationist == "unset">>[[Indo-aryan|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "latina" || $arcologies[0].FSSubjugationist == "unset">>[[Latina|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "malay" || $arcologies[0].FSSubjugationist == "unset">>[[Malay|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "middle eastern" || $arcologies[0].FSSubjugationist == "unset">>[[Middle Eastern|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "mixed race" || $arcologies[0].FSSubjugationist == "unset">>[[Mixed Race|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "pacific islander" || $arcologies[0].FSSubjugationist == "unset">>[[Pacific Islander|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "semitic" || $arcologies[0].FSSubjugationist == "unset">>[[Semitic|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "southern european" || $arcologies[0].FSSubjugationist == "unset">>[[Southern European|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> - <<if $arcologies[0].FSSupremacistRace != "white" || $arcologies[0].FSSubjugationist == "unset">>[[White|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]]<</if>> - <<else>> - <br>Only slaves of a particular race requires 3 tokens. - <</if>> - <</if>> - <<if $seeDicks != 0 && ndef $corpSpecGender && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This used to be $captureUpgradeGender, it is a general acquisition specialization*/ - <br>Train only slaves with [[Pussies|Manage Corporation][$corpSpecGender = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Dicks|Manage Corporation][$corpSpecGender = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecHeight && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This is a general acquisition specialization*/ - <br>Slaves that are [[Short|Manage Corporation][$corpSpecHeight = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Tall|Manage Corporation][$corpSpecHeight = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecVirgin && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This is a general acquisition specialization*/ - <br>Slaves that are [[Virgins|Manage Corporation][$corpSpecVirgin = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecIntelligence && $corpDivLegal > 0 >> /*This used to be $entrapmentUpgradeIntelligence, it is a legal enslavement specialization*/ - <br>Slaves who are [[Stupid|Manage Corporation][$corpSpecIntelligence = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Intelligent|Manage Corporation][$corpSpecIntelligence = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] --//Further specializations possible// - <</if>> - <<if ndef $corpSpecAge && $corpDivExtra > 0>> /*This used to be $captureUpgradeAge, it is the extralegal enslavement specialization*/ - <br>Slaves who are [[Younger|Manage Corporation][$corpSpecAge = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Older|Manage Corporation][$corpSpecAge = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecWeight && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $generalUpgradeWeight, it is a general improvement specialization*/ - <br>Managing slaves' diets to achieve [[Thin Slaves|Manage Corporation][$corpSpecWeight = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Fat nor Thin Slaves|Manage Corporation][$corpSpecWeight = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Fat Slaves|Manage Corporation][$corpSpecWeight = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecDevotion && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $entrapmentUpgradeDevotionOne/Two, it is a general improvement specialization*/ - <br>Slaves who are [[Reluctant|Manage Corporation][$corpSpecDevotion = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Obedient|Manage Corporation][$corpSpecDevotion = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecAccent && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $trainingUpgradeAccent, it is a general improvement specialization*/ - <br>Slaves are taught to [[Speak the Language|Manage Corporation][$corpSpecAccent = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Speak without Accent|Manage Corporation][$corpSpecAccent = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecHormones && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $drugUpgradeHormones, it is a general improvement specialization*/ - <br>Slaves are given hormones to [[Feminize|Manage Corporation][$corpSpecHormones = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Masculinize|Manage Corporation][$corpSpecHormones = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecInjection && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $drugUpgradeInjectionOne, it is a general improvement specialization*/ - <br>Slave assets are made to be [[Petite|Manage Corporation][$corpSpecInjection = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Tasteful|Manage Corporation][$corpSpecInjection = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Huge|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecCosmetics && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $surgicalUpgradeCosmetics, it is a general improvement specialization*/ - <br>Straightforward cosmetic procedures are [[Applied|Manage Corporation][$corpSpecCosmetics = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Not Applied|Manage Corporation][$corpSpecCosmetics = 0, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecEducation && $corpDivTrain > 0>> /*This used to be $trainingUpgradeEducation, it is the training specialization*/ - <br>Slaves are given [[No Education|Manage Corporation][$corpSpecEducation == 0, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecImplants && $corpDivSurgery > 0>> /*This used to be $surgicalUpgradeImplants, it is the surgery specialization*/ - <br>Slave implants are [[Applied|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Not Applied|Manage Corporation][$corpSpecImplants = 0, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecGenitalia && $corpDivSurgeryDev > 100>> /*This used to be $surgicalUpgradeGenitalia, it is the surgery specialization*/ - <br>Slaves get their genitalia reconfigured [[Add Pussy|Manage Corporation][$corpSpecPussy = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Pussy|Manage Corporation][$corpSpecPussy = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Dick|Manage Corporation][$corpSpecDick = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Dick|Manage Corporation][$corpSpecDick = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Balls|Manage Corporation][$corpSpecBalls = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Balls|Manage Corporation][$corpSpecBalls = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecTrust && $corpDivBreak > 0>> /*This used to be $generalUpgradeBreaking, it is the slave breaking specific specialization*/ - <br>Breaking slaves with [[Brutality|Manage Corporation][$corpSpecTrust = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Care|Manage Corporation][$corpSpecTrust = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecAmputee && $corpDivArcade > 0 && $corpDivSurgeryDev > 100>> /*This is the arcade specialization*/ - <br>Slave limbs are categorically [[Removed|Manage Corporation][$corpSpecAmputee = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecMuscle && $corpDivMenial > 0>> /*This used to be $generalUpgradeMuscle, it is the Menial division's specialization*/ - <br>Slaves with muscles that are <<if $arcologies[0].FSPhysicalIdealist == "unset">> [[Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | <</if>>[[Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <<if ndef $corpSpecMilk && $corpDivDairy > 0>> /*This is the dairy specialization*/ - <br>Slaves are made to be lactating [[Naturally|Manage Corporation][$corpSpecMilk = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Through Implant|Manage Corporation][$corpSpecMilk = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if ndef $corpSpecSexEd && $corpDivWhore > 0>> /*This used to be $trainingUpgradeSexEd, it is the escort division specialization*/ - <br>Slaves are sexually [[Clueless|Manage Corporation][$corpSpecSexEd = 0, $corpSpecToken -= 0, $corpSpecTimer = 2]] | [[Competent|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// - <</if>> - <</if>> + <<if $corpSpecToken > 1>> + Your corporation has $corpSpecToken specializations left. + <<else>> + Your corporation has one specialization left. + <</if>> + <<if $corpSpecTimer > 0>> + You have recently changed specializations and the corporation needs <<if $corpSpecTimer > 1>>$corpSpecTimer more weeks<<else>>another week<</if>> before it can comply with another directive. + <<else>> + <br>Choosing to specialize your corporation uses a specialization. The corporation can be directed to focus on the following: + <<if $corpSpecRaces.length == 0 && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This used to be $captureUpgradeRace, it is a general acquisition specialization*/ + <br>Slaves who are not + <<if $arcologies[0].FSSubjugationistRace != "amerindian" || $arcologies[0].FSSubjugationist == "unset">>[[Amerindian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "asian" || $arcologies[0].FSSubjugationist == "unset">>[[Asian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "black" || $arcologies[0].FSSubjugationist == "unset">>[[Black|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "indo-aryan" || $arcologies[0].FSSubjugationist == "unset">>[[Indo-aryan|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "latina" || $arcologies[0].FSSubjugationist == "unset">>[[Latina|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "malay" || $arcologies[0].FSSubjugationist == "unset">>[[Malay|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "middle eastern" || $arcologies[0].FSSubjugationist == "unset">>[[Middle Eastern|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "mixed race" || $arcologies[0].FSSubjugationist == "unset">>[[Mixed Race|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "pacific islander" || $arcologies[0].FSSubjugationist == "unset">>[[Pacific Islander|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "semitic" || $arcologies[0].FSSubjugationist == "unset">>[[Semitic|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "southern european" || $arcologies[0].FSSubjugationist == "unset">>[[Southern European|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]] | <</if>> + <<if $arcologies[0].FSSubjugationistRace != "white" || $arcologies[0].FSSubjugationist == "unset">>[[White|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white", 1), $corpSpecToken -= 1, $corpSpecTimer = 1]]<</if>> + — //additional races can be excluded. 4 races per token.// + <<if $corpSpecToken >= 3>> + <br>Only slaves who are + <<if $arcologies[0].FSSupremacistRace != "amerindian" || $arcologies[0].FSSubjugationist == "unset">>[[Amerindian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "asian" || $arcologies[0].FSSubjugationist == "unset">>[[Asian|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "black" || $arcologies[0].FSSubjugationist == "unset">>[[Black|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "indo-aryan" || $arcologies[0].FSSubjugationist == "unset">>[[Indo-aryan|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "latina" || $arcologies[0].FSSubjugationist == "unset">>[[Latina|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "malay" || $arcologies[0].FSSubjugationist == "unset">>[[Malay|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "middle eastern" || $arcologies[0].FSSubjugationist == "unset">>[[Middle Eastern|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "mixed race" || $arcologies[0].FSSubjugationist == "unset">>[[Mixed Race|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "pacific islander" || $arcologies[0].FSSubjugationist == "unset">>[[Pacific Islander|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "semitic" || $arcologies[0].FSSubjugationist == "unset">>[[Semitic|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "southern european" || $arcologies[0].FSSubjugationist == "unset">>[[Southern European|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]] | <</if>> + <<if $arcologies[0].FSSupremacistRace != "white" || $arcologies[0].FSSubjugationist == "unset">>[[White|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white", 0), $corpSpecToken -= 3, $corpSpecTimer = 2]]<</if>> + <<else>> + <br>Only slaves of a particular race requires 3 tokens. + <</if>> + <</if>> + <<if $seeDicks != 0 && ndef $corpSpecGender && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This used to be $captureUpgradeGender, it is a general acquisition specialization*/ + <br>Train only slaves with [[Pussies|Manage Corporation][$corpSpecGender = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Dicks|Manage Corporation][$corpSpecGender = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecHeight && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This is a general acquisition specialization*/ + <br>Slaves that are [[Short|Manage Corporation][$corpSpecHeight = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Tall|Manage Corporation][$corpSpecHeight = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecVirgin && ($corpDivExtra > 0 || $corpDivLegal > 0)>> /*This is a general acquisition specialization*/ + <br>Slaves that are [[Virgins|Manage Corporation][$corpSpecVirgin = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecIntelligence && $corpDivLegal > 0 >> /*This used to be $entrapmentUpgradeIntelligence, it is a legal enslavement specialization*/ + <br>Slaves who are [[Stupid|Manage Corporation][$corpSpecIntelligence = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Intelligent|Manage Corporation][$corpSpecIntelligence = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] --//Further specializations possible// + <</if>> + <<if ndef $corpSpecAge && $corpDivExtra > 0>> /*This used to be $captureUpgradeAge, it is the extralegal enslavement specialization*/ + <br>Slaves who are [[Younger|Manage Corporation][$corpSpecAge = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Older|Manage Corporation][$corpSpecAge = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecWeight && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $generalUpgradeWeight, it is a general improvement specialization*/ + <br>Managing slaves' diets to achieve [[Thin Slaves|Manage Corporation][$corpSpecWeight = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Fat nor Thin Slaves|Manage Corporation][$corpSpecWeight = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Fat Slaves|Manage Corporation][$corpSpecWeight = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecDevotion && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $entrapmentUpgradeDevotionOne/Two, it is a general improvement specialization*/ + <br>Slaves who are [[Reluctant|Manage Corporation][$corpSpecDevotion = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Obedient|Manage Corporation][$corpSpecDevotion = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecAccent && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $trainingUpgradeAccent, it is a general improvement specialization*/ + <br>Slaves are taught to [[Speak the Language|Manage Corporation][$corpSpecAccent = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Speak without Accent|Manage Corporation][$corpSpecAccent = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecHormones && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $drugUpgradeHormones, it is a general improvement specialization*/ + <br>Slaves are given hormones to [[Feminize|Manage Corporation][$corpSpecHormones = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Masculinize|Manage Corporation][$corpSpecHormones = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecInjection && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $drugUpgradeInjectionOne, it is a general improvement specialization*/ + <br>Slave assets are made to be [[Petite|Manage Corporation][$corpSpecInjection = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Tasteful|Manage Corporation][$corpSpecInjection = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Huge|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecCosmetics && ($corpDivBreak > 0 || $corpDivSurgery > 0 || $corpDivTrain > 0)>> /*This used to be $surgicalUpgradeCosmetics, it is a general improvement specialization*/ + <br>Straightforward cosmetic procedures are [[Applied|Manage Corporation][$corpSpecCosmetics = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Not Applied|Manage Corporation][$corpSpecCosmetics = 0, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecEducation && $corpDivTrain > 0>> /*This used to be $trainingUpgradeEducation, it is the training specialization*/ + <br>Slaves are given [[No Education|Manage Corporation][$corpSpecEducation == 0, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecImplants && $corpDivSurgery > 0>> /*This used to be $surgicalUpgradeImplants, it is the surgery specialization*/ + <br>Slave implants are [[Applied|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Not Applied|Manage Corporation][$corpSpecImplants = 0, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecGenitalia && $corpDivSurgeryDev > 100>> /*This used to be $surgicalUpgradeGenitalia, it is the surgery specialization*/ + <br>Slaves get their genitalia reconfigured [[Add Pussy|Manage Corporation][$corpSpecPussy = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Pussy|Manage Corporation][$corpSpecPussy = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Dick|Manage Corporation][$corpSpecDick = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Dick|Manage Corporation][$corpSpecDick = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Add Balls|Manage Corporation][$corpSpecBalls = 1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Remove Balls|Manage Corporation][$corpSpecBalls = -1, $corpSpecGenitalia = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecTrust && $corpDivBreak > 0>> /*This used to be $generalUpgradeBreaking, it is the slave breaking specific specialization*/ + <br>Breaking slaves with [[Brutality|Manage Corporation][$corpSpecTrust = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Care|Manage Corporation][$corpSpecTrust = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecAmputee && $corpDivArcade > 0 && $corpDivSurgeryDev > 100>> /*This is the arcade specialization*/ + <br>Slave limbs are categorically [[Removed|Manage Corporation][$corpSpecAmputee = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecMuscle && $corpDivMenial > 0>> /*This used to be $generalUpgradeMuscle, it is the Menial division's specialization*/ + <br>Slaves with muscles that are <<if $arcologies[0].FSPhysicalIdealist == "unset">> [[Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | <</if>>[[Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <<if ndef $corpSpecMilk && $corpDivDairy > 0>> /*This is the dairy specialization*/ + <br>Slaves are made to be lactating [[Naturally|Manage Corporation][$corpSpecMilk = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | [[Through Implant|Manage Corporation][$corpSpecMilk = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if ndef $corpSpecSexEd && $corpDivWhore > 0>> /*This used to be $trainingUpgradeSexEd, it is the escort division specialization*/ + <br>Slaves are sexually [[Clueless|Manage Corporation][$corpSpecSexEd = 0, $corpSpecToken -= 0, $corpSpecTimer = 2]] | [[Competent|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] -- //Further specializations possible// + <</if>> + <</if>> <<else>> - <br>Your corporation cannot pick a new specialization at this time. + <br>Your corporation cannot pick a new specialization at this time. <</if>> <<if $corpSpec > $corpSpecToken>> /*Modifying specializations*/ - <br><br>You have chosen the following specializations; - <br>//You can choose to specialize further with additional tokens, specialize less, end the specialization or sometimes tweak them for free.// - <<if $corpSpecRaces.length == 12>> - <<set $corpSpecRaces = []>> - <</if>> - <<if $corpSpecRaces.length > 0>> - <br>The corporation enslaves people of the following race(s); - <<if $corpSpecRaces.includes("amerindian")>> - <br>Amerindian - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "amerindian")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Amerindian== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("asian")>> - <br>Asian - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "asian")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Asian== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("black")>> - <br>Black - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "black")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Black== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("indo-aryan")>> - <br>Indo-Aryan - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "indo-aryan")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Indo-Aryan== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("latina")>> - <br>Latina - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "latina")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Latina== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("malay")>> - <br>Malay - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "malay")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Malay== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("middle eastern")>> - <br>Middle Eastern - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "middle eastern")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Middle Eastern== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("mixed race")>> - <br>Mixed Race - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "mixed race")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Mixed Race== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("pacific islander")>> - <br>Pacific Islander - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "pacific islander")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Pacific Islander== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("semitic")>> - <br>Semitic - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "semitic")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Semitic== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("southern european")>> - <br>Southern European - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "southern european")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==Southern European== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",0)]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecRaces.includes("white")>> - <br>White - <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace == "white")>> - <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> - <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] - <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",1)]] - <</if>> - <</if>> - <</if>> - <<else>> - <br>==White== - <<if $corpSpecTimer == 0>> - <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",0), $corpSpecToken += 1, $corpSpecTimer = 1]] - <<else>> - [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",0)]] - <</if>> - <</if>> - <</if>> - <</if>> - <<if $corpSpecGender == 1>> - <br>The corporation trains slaves with pussies. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecGender>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecGender == 2>> - <br>The corporation trains slaves with dicks. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecGender>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecHeight == 1>> - <br>The corporation is targeting tiny slaves. - <<if $corpSpecTimer == 0>> - [[Short Slaves|Manage Corporation][$corpSpecHeight = 2, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecHeight == 2>> - <br>The corporation is targeting short slaves. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && ($corpDivExtraDev + $corpDivLegalDev) > 50>> - [[Tiny Slaves|Manage Corporation][$corpSpecHeight = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecHeight == 4>> - <br>The corporation is targeting tall slaves. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && ($corpDivExtraDev + $corpDivLegalDev) > 50>> - [[Giant Slaves|Manage Corporation][$corpSpecHeight = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecHeight == 5>> - <br>The corporation is targeting giant slaves. - <<if $corpSpecTimer == 0>> - [[Tall Slaves|Manage Corporation][$corpSpecHeight = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecVirgin == 1>> - <br>The corporation is ensuring slaves remain virgins. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecVirgin>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecTrust == 1>> - <br>The corporation is breaking slaves with extreme brutality. - <<if $corpSpecTimer == 0>> - [[Apply Less Brutality|Manage Corporation][$corpSpecTrust = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> /*Don't think this deserves the added cost of a token, unlike the 'utmost care' one*/ - <<elseif $corpSpecTrust == 2>> - <br>The corporation is breaking slaves with brutality. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $arcologies[0].FSDegradationist > 20 && $corpDivBreakDev > 50>> - [[Apply Extreme Brutality|Manage Corporation][$corpSpecTrust = 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecTrust == 4>> - <br>The corporation is breaking slaves with care. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $arcologies[0].FSPaternalist > 20 && $corpDivBreakDev > 50>> - [[Use the Utmost Care|Manage Corporation][$corpSpecTrust = 5, $corpSpecToken += 1, $corpSpecTimer == 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecTrust == 5>> - <br>The corporation is breaking slaves with the utmost care. - <<if $corpSpecTimer == 0>> - [[Use Less Care|Manage Corporation][$corpSpecTrust = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecWeight == 1>> - <br>The corporation makes slaves follow incredibly strict diets. - <<if $corpSpecTimer == 0>> - [[Apply Looser Diet|Manage Corporation][$corpSpecWeight = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecWeight == 2>> - <br>The corporation makes slaves diet. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $arcologies[0].FSHedonisticDecadence == "unset">> - [[Apply Strict Diet|Manage Corporation][$corpSpecWeight = 1, $corpSpecTimer = 2]] | - <</if>> - [[Aim for Healthy Weight|Manage Corporation][$corpSpecWeight = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecWeight == 3>> - <br>The corporation is aiming for slaves with a healthy weight. - <<if $corpSpecTimer == 0>> - [[Apply Diet|Manage Corporation][$corpSpecWeight = 2, $corpSpecTimer = 2]] | [[Plump up Slaves|Manage Corporation][$corpSpecWeight = 5, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> /*Perhaps 'plump up' is not the right phrase*/ - <<elseif $corpSpecWeight == 5>> - <br>The corporation aims for plump slaves. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $arcologies[0].FSPhysicalIdealist == "unset">> - [[Fatten Slaves|Manage Corporation][$corpSpecWeight = 6, $corpSpecTimer = 2]] | - <</if>> - [[Aim for Healthy Weight|Manage Corporation][$corpSpecWeight = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecWeight == 6>> - <br>The corporation aims for fat slaves. - <<if $corpSpecTimer == 0>> - [[Settle for Plump|Manage Corporation][$corpSpecWeight = 5, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecMuscle == 1>> - <br>The corporation aims to have frail slaves. - <<if $corpSpecTimer == 0>> - [[Aim for Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMuscle>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecMuscle == 2>> /*Don't think this deserves the added cost of a token, unlike slaves getting ripped*/ - <br>The corporation aims to have weak slaves. - <<if $corpSpecTimer == 0>> - <<if $arcologies[0].FSPhysicalIdealist == "unset">> - [[Aim for Frail|Manage Corporation][$corpSpecMuscle = 1, $corpSpecTimer = 2]] | - <</if>> - [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecMuscle == 3>> - <br>The corporation is aiming for slaves with soft muscles. - <<if $corpSpecTimer == 0>> - <<if $arcologies[0].FSPhysicalIdealist == "unset">> - [[Aim for Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecTimer = 2]] | - <</if>> - [[Aim for Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecMuscle == 4>> - <br>The corporation aims for toned muscles. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && ($corpDivBreakDev + $corpDivSurgeryDev + $corpDivTrainDev > 100)>> - [[Aim for Ripped|Manage Corporation][$corpSpecMuscle = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecMuscle == 5>> - <br>The corporation aims for ripped slaves. - <<if $corpSpecTimer == 0>> - [[Aim for Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecDevotion == 1>> - <br>The corporation keeps slaves extremely defiant. - <<if $corpSpecTimer == 0>> - [[Less Defiant|Manage Corporation][$corpSpecDevotion = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> /*Don't think this deserves the added cost of a token, unlike the 'devoted' one*/ - <<elseif $corpSpecDevotion == 2>> - <br>The corporation keeps slaves reluctant. - <<if $corpSpecTimer == 0>> - [[Make them Defiant|Manage Corporation][$corpSpecDevotion = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecDevotion == 4>> - <br>The corporation is fostering obedience. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $corpDivTrainDev > 100>> - [[Foster Devotion|Manage Corporation][$corpSpecDevotion = 5, $corpSpecToken += 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecDevotion == 5>> - <br>The corporation is fostering devotion. - <<if $corpSpecTimer == 0>> - [[Settle for Obedience|Manage Corporation][$corpSpecDevotion = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecIntelligence == 1>> - <br>The corporation keeps stupid slaves. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecIntelligence>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecIntelligence == 3>> - <br>The corporation keeps intelligent slaves. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecIntelligence>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecAge == 1>> - <br>The corporation focuses on young slaves. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecAge>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecAge == 3>> - <br>The corporation focuses on older slaves. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecAge>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecAccent == 1>> - <br>The corporation teaches slaves to speak the lingua franca. - <<if $corpSpecTimer == 0>> - [[Eliminate Accents|Manage Corporation][$corpSpecAccent = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecAccent>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecAccent == 2>> - <br>The corporation teaches slaves to speak the lingua franca without an accent. - <<if $corpSpecTimer == 0>> - [[Just Teach Language|Manage Corporation][$corpSpecAccent = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecAccent>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecEducation == 0>> - <br>The corporation focuses on uneducated slaves. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0>> - [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecEducation == 1>> - <br>The corporation makes sure all slaves have a basic education. - <<if $corpSpecTimer == 0>> - <<if $corpDivTrainDev > 200 && $corpSpecToken > 0>> - [[Advanced Education|Manage Corporation][$corpSpecEducation = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - [[No Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecEducation == 2>> - <br>The corporation makes sure all slaves have an advanced education. - <<if $corpSpecTimer == 0>> - [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecCosmetics == 1>> - <br>The corporation applies straightforward cosmetic procedures. - <<if $corpSpecTimer == 0>> - <<link "No Focus">><<unset $corpSpecCosmetics>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecCosmetics == 0>> - <br>The corporation doesn't apply cosmetic procedures. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0>> - [[Applied|Manage Corporation][$corpSpecCosmetics = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecCosmetics>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecImplants == 1>> - <br>The corporation applies tasteful implants to all slaves. - <<if $corpSpecTimer == 0>> - <<if $corpDivSurgeryDev > 100 && $corpSpecToken > 0>> - [[Absurd Implants|Manage Corporation][$corpSpecImplants = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecImplants == 2>> - <br>The corporation applies absurd implants to all slaves. - <<if $corpSpecTimer == 0>> - [[Tasteful Implants|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecImplants == 0>> - <br>The corporation keeps their slaves entirely implant free. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0>> - [[Tasteful Implants|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if ndef $corpSpecPussy && ndef $corpSpecDick && ndef $corpSpecBalls && $corpSpecGenitalia == 1>> - <<set ndef $corpSpecGenitalia, - $corpSpecToken += 1>> - <</if>> - <<if $corpSpecGenitalia == 1>> - <<if $corpSpecPussy == 1>> - <br>The corporation adds a pussy to all slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecPussy>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecPussy == -1>> - <br>The corporation removes pussies from all slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecPussy>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<else>> - <br>The corporation has no plans for pussies. - <<if $corpSpecTimer == 0>> - [[Add Pussy|Manage Corporation][$corpSpecPussy = 1, $corpSpecTimer = 2]] | [[Remove Pussy|Manage Corporation][$corpSpecPussy = -1, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <</if>> - <<if $corpSpecDick == 1>> - <br>The corporation adds a dick to all slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecDick>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecDick == -1>> - <br>The corporation removes dicks from all slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecDick>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<else>> - <br>The corporation has no plans for dicks. - <<if $corpSpecTimer == 0>> - [[Add Dick|Manage Corporation][$corpSpecDick = 1, $corpSpecTimer = 2]] | [[Remove Dick|Manage Corporation][$corpSpecDick = -1, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <</if>> - <<if $corpSpecBalls == 1>> - <br>The corporation adds balls to all slaves (penis required). - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecBalls>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecBalls == -1>> - <br>The corporation removes balls from all slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecBalls>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<else>> - <br>The corporation has no plans for balls. - <<if $corpSpecTimer == 0>> - [[Add Balls|Manage Corporation][$corpSpecBalls = 1, $corpSpecTimer = 2]] | [[Remove Balls|Manage Corporation][$corpSpecBalls = -1, $corpSpecTimer = 2]] - <</if>> - <</if>> - <</if>> - <<if $corpSpecInjection == 1>> - <br>The corporation aims for petite assets. - <<if $corpSpecTimer == 0>> - [[Tasteful Size|Manage Corporation][$corpSpecInjection = 2, $corpSpecTimer = 2]] | [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecInjection == 2>> - <br>The corporation aims for tasteful assets. - <<if $corpSpecTimer == 0>> - [[Small Size|Manage Corporation][$corpSpecInjection = 1, $corpSpecTimer = 2]] | [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecInjection == 3>> - <br>The corporation aims for huge assets. - <<if $corpSpecTimer == 0>> - [[Small Size|Manage Corporation][$corpSpecInjection = 1, $corpSpecTimer = 2]] | [[Tasteful Size|Manage Corporation][$corpSpecInjection = 2, $corpSpecTimer = 2]] | - <<if $corpDivSurgeryDev > 100 && $corpSpecToken > 0>> - [[Supermassive Size|Manage Corporation][$corpSpecInjection = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] - <</if>> - <<if $corpDivDairyDev > 200 && $corpSpecToken > 0>> | - [[Pastoral Size|Manage Corporation][$corpSpecInjection = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecInjection == 4>> - <br>The corporation aims for supermassive assets. - <<if $corpSpecTimer == 0>> - [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken += 1, $corpSpecTimer = 2]] | - <<if $corpDivDairyDev > 200>> - [[Pastoral Size|Manage Corporation][$corpSpecInjection = 5, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecInjection == 5>> - <br>The corporation aims for pastoral assets. - <<if $corpSpecTimer == 0>> - [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken += 1, $corpSpecTimer = 2]] | - <<if $corpDivSurgeryDev > 50>> - [[Supermassive Size|Manage Corporation][$corpSpecInjection = 4, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecHormones == 1>> - <br>The corporation feminizes slaves with hormones. - <<if $corpSpecTimer == 0>> - [[Masculinize|Manage Corporation][$corpSpecHormones = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHormones>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecHormones == 2>> - <br>The corporation masculinize slaves with hormones. - <<if $corpSpecTimer == 0>> - [[Feminize|Manage Corporation][$corpSpecHormones = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHormones>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecAmputee == 1>> - <br>The corporation removes all limbs from its slaves. - <<if $corpSpecTimer == 0>> - <<link "Stop">><<unset $corpSpecAmputee>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecMilk == 1>> - <br>The corporation makes sure all slaves are naturally lactating. - <<if $corpSpecTimer == 0>> - [[Lactation Implant|Manage Corporation][$corpSpecMilk = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMilk>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecMilk == 2>> - <br>The corporation equips all slaves with lactation implants. - <<if $corpSpecTimer == 0>> - [[Natural Lactation|Manage Corporation][$corpSpecMilk = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMilk>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> - <<if $corpSpecSexEd == 1>> - <br>The corporation familiarizes slaves with sexual service. - <<if $corpSpecTimer == 0>> - <<if $corpSpecToken > 0 && $corpDivWhoreDev > 200>> - [[Advanced Training|Manage Corporation][$corpSpecSexEd = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | - <</if>> - <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecSexEd == 2>> - <br>The corporation teaches advanced sexual techniques to its slaves. - <<if $corpSpecTimer == 0>> - [[Basic Training|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken +=1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <<elseif $corpSpecSexEd == 0>> - <br>The corporation teaches no sexual techniques to its slaves. - <<if $corpSpecTimer == 0>> - [[Basic Training|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken -=1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> - <</if>> - <</if>> + <br><br>You have chosen the following specializations; + <br>//You can choose to specialize further with additional tokens, specialize less, end the specialization or sometimes tweak them for free.// + <<if $corpSpecRaces.length == 12>> + <<set $corpSpecRaces = []>> + <</if>> + <<if $corpSpecRaces.length > 0>> + <br>The corporation enslaves people of the following race(s); + <<if $corpSpecRaces.includes("amerindian")>> + <br>Amerindian + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "amerindian")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Amerindian== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("amerindian",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("asian")>> + <br>Asian + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "asian")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Asian== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("asian",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("black")>> + <br>Black + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "black")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Black== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("black",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("indo-aryan")>> + <br>Indo-Aryan + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "indo-aryan")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Indo-Aryan== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("indo-aryan",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("latina")>> + <br>Latina + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "latina")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Latina== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("latina",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("malay")>> + <br>Malay + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "malay")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Malay== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("malay",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("middle eastern")>> + <br>Middle Eastern + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "middle eastern")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Middle Eastern== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("middle eastern",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("mixed race")>> + <br>Mixed Race + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "mixed race")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Mixed Race== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("mixed race",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("pacific islander")>> + <br>Pacific Islander + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "pacific islander")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Pacific Islander== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("pacific islander",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("semitic")>> + <br>Semitic + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "semitic")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Semitic== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("southern european")>> + <br>Southern European + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "southern european")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==Southern European== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("southern european",0)]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecRaces.includes("white")>> + <br>White + <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace == "white")>> + <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> + <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] + <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",1)]] + <</if>> + <</if>> + <</if>> + <<else>> + <br>==White== + <<if $corpSpecTimer == 0>> + <<if $corpSpecRaces.length == 3 || $corpSpecRaces.length == 7 || $corpSpecRaces.length == 11>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",0), $corpSpecToken += 1, $corpSpecTimer = 1]] + <<else>> + [[Whitelist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("white",0)]] + <</if>> + <</if>> + <</if>> + <</if>> + <<if $corpSpecGender == 1>> + <br>The corporation trains slaves with pussies. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecGender>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecGender == 2>> + <br>The corporation trains slaves with dicks. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecGender>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecHeight == 1>> + <br>The corporation is targeting tiny slaves. + <<if $corpSpecTimer == 0>> + [[Short Slaves|Manage Corporation][$corpSpecHeight = 2, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecHeight == 2>> + <br>The corporation is targeting short slaves. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && ($corpDivExtraDev + $corpDivLegalDev) > 50>> + [[Tiny Slaves|Manage Corporation][$corpSpecHeight = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecHeight == 4>> + <br>The corporation is targeting tall slaves. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && ($corpDivExtraDev + $corpDivLegalDev) > 50>> + [[Giant Slaves|Manage Corporation][$corpSpecHeight = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecHeight == 5>> + <br>The corporation is targeting giant slaves. + <<if $corpSpecTimer == 0>> + [[Tall Slaves|Manage Corporation][$corpSpecHeight = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecVirgin == 1>> + <br>The corporation is ensuring slaves remain virgins. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecVirgin>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecTrust == 1>> + <br>The corporation is breaking slaves with extreme brutality. + <<if $corpSpecTimer == 0>> + [[Apply Less Brutality|Manage Corporation][$corpSpecTrust = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> /*Don't think this deserves the added cost of a token, unlike the 'utmost care' one*/ + <<elseif $corpSpecTrust == 2>> + <br>The corporation is breaking slaves with brutality. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $arcologies[0].FSDegradationist > 20 && $corpDivBreakDev > 50>> + [[Apply Extreme Brutality|Manage Corporation][$corpSpecTrust = 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecTrust == 4>> + <br>The corporation is breaking slaves with care. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $arcologies[0].FSPaternalist > 20 && $corpDivBreakDev > 50>> + [[Use the Utmost Care|Manage Corporation][$corpSpecTrust = 5, $corpSpecToken += 1, $corpSpecTimer == 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecTrust == 5>> + <br>The corporation is breaking slaves with the utmost care. + <<if $corpSpecTimer == 0>> + [[Use Less Care|Manage Corporation][$corpSpecTrust = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecTrust>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecWeight == 1>> + <br>The corporation makes slaves follow incredibly strict diets. + <<if $corpSpecTimer == 0>> + [[Apply Looser Diet|Manage Corporation][$corpSpecWeight = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecWeight == 2>> + <br>The corporation makes slaves diet. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $arcologies[0].FSHedonisticDecadence == "unset">> + [[Apply Strict Diet|Manage Corporation][$corpSpecWeight = 1, $corpSpecTimer = 2]] | + <</if>> + [[Aim for Healthy Weight|Manage Corporation][$corpSpecWeight = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecWeight == 3>> + <br>The corporation is aiming for slaves with a healthy weight. + <<if $corpSpecTimer == 0>> + [[Apply Diet|Manage Corporation][$corpSpecWeight = 2, $corpSpecTimer = 2]] | [[Plump up Slaves|Manage Corporation][$corpSpecWeight = 5, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> /*Perhaps 'plump up' is not the right phrase*/ + <<elseif $corpSpecWeight == 5>> + <br>The corporation aims for plump slaves. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $arcologies[0].FSPhysicalIdealist == "unset">> + [[Fatten Slaves|Manage Corporation][$corpSpecWeight = 6, $corpSpecTimer = 2]] | + <</if>> + [[Aim for Healthy Weight|Manage Corporation][$corpSpecWeight = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecWeight == 6>> + <br>The corporation aims for fat slaves. + <<if $corpSpecTimer == 0>> + [[Settle for Plump|Manage Corporation][$corpSpecWeight = 5, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecMuscle == 1>> + <br>The corporation aims to have frail slaves. + <<if $corpSpecTimer == 0>> + [[Aim for Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMuscle>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecMuscle == 2>> /*Don't think this deserves the added cost of a token, unlike slaves getting ripped*/ + <br>The corporation aims to have weak slaves. + <<if $corpSpecTimer == 0>> + <<if $arcologies[0].FSPhysicalIdealist == "unset">> + [[Aim for Frail|Manage Corporation][$corpSpecMuscle = 1, $corpSpecTimer = 2]] | + <</if>> + [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecMuscle == 3>> + <br>The corporation is aiming for slaves with soft muscles. + <<if $corpSpecTimer == 0>> + <<if $arcologies[0].FSPhysicalIdealist == "unset">> + [[Aim for Weak|Manage Corporation][$corpSpecMuscle = 2, $corpSpecTimer = 2]] | + <</if>> + [[Aim for Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecMuscle == 4>> + <br>The corporation aims for toned muscles. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && ($corpDivBreakDev + $corpDivSurgeryDev + $corpDivTrainDev > 100)>> + [[Aim for Ripped|Manage Corporation][$corpSpecMuscle = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + [[Aim for Soft|Manage Corporation][$corpSpecMuscle = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecMuscle == 5>> + <br>The corporation aims for ripped slaves. + <<if $corpSpecTimer == 0>> + [[Aim for Toned|Manage Corporation][$corpSpecMuscle = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecWeight>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecDevotion == 1>> + <br>The corporation keeps slaves extremely defiant. + <<if $corpSpecTimer == 0>> + [[Less Defiant|Manage Corporation][$corpSpecDevotion = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> /*Don't think this deserves the added cost of a token, unlike the 'devoted' one*/ + <<elseif $corpSpecDevotion == 2>> + <br>The corporation keeps slaves reluctant. + <<if $corpSpecTimer == 0>> + [[Make them Defiant|Manage Corporation][$corpSpecDevotion = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecDevotion == 4>> + <br>The corporation is fostering obedience. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $corpDivTrainDev > 100>> + [[Foster Devotion|Manage Corporation][$corpSpecDevotion = 5, $corpSpecToken += 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecDevotion == 5>> + <br>The corporation is fostering devotion. + <<if $corpSpecTimer == 0>> + [[Settle for Obedience|Manage Corporation][$corpSpecDevotion = 4, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecDevotion>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecIntelligence == 1>> + <br>The corporation keeps stupid slaves. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecIntelligence>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecIntelligence == 3>> + <br>The corporation keeps intelligent slaves. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecIntelligence>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecAge == 1>> + <br>The corporation focuses on young slaves. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecAge>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecAge == 3>> + <br>The corporation focuses on older slaves. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecAge>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecAccent == 1>> + <br>The corporation teaches slaves to speak the lingua franca. + <<if $corpSpecTimer == 0>> + [[Eliminate Accents|Manage Corporation][$corpSpecAccent = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecAccent>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecAccent == 2>> + <br>The corporation teaches slaves to speak the lingua franca without an accent. + <<if $corpSpecTimer == 0>> + [[Just Teach Language|Manage Corporation][$corpSpecAccent = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecAccent>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecEducation == 0>> + <br>The corporation focuses on uneducated slaves. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0>> + [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecEducation == 1>> + <br>The corporation makes sure all slaves have a basic education. + <<if $corpSpecTimer == 0>> + <<if $corpDivTrainDev > 200 && $corpSpecToken > 0>> + [[Advanced Education|Manage Corporation][$corpSpecEducation = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + [[No Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecEducation == 2>> + <br>The corporation makes sure all slaves have an advanced education. + <<if $corpSpecTimer == 0>> + [[Basic Education|Manage Corporation][$corpSpecEducation = 1, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecEducation>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecCosmetics == 1>> + <br>The corporation applies straightforward cosmetic procedures. + <<if $corpSpecTimer == 0>> + <<link "No Focus">><<unset $corpSpecCosmetics>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecCosmetics == 0>> + <br>The corporation doesn't apply cosmetic procedures. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0>> + [[Applied|Manage Corporation][$corpSpecCosmetics = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecCosmetics>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecImplants == 1>> + <br>The corporation applies tasteful implants to all slaves. + <<if $corpSpecTimer == 0>> + <<if $corpDivSurgeryDev > 100 && $corpSpecToken > 0>> + [[Absurd Implants|Manage Corporation][$corpSpecImplants = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecImplants == 2>> + <br>The corporation applies absurd implants to all slaves. + <<if $corpSpecTimer == 0>> + [[Tasteful Implants|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken += 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecImplants == 0>> + <br>The corporation keeps their slaves entirely implant free. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0>> + [[Tasteful Implants|Manage Corporation][$corpSpecImplants = 1, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecImplants>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if ndef $corpSpecPussy && ndef $corpSpecDick && ndef $corpSpecBalls && $corpSpecGenitalia == 1>> + <<set ndef $corpSpecGenitalia, + $corpSpecToken += 1>> + <</if>> + <<if $corpSpecGenitalia == 1>> + <<if $corpSpecPussy == 1>> + <br>The corporation adds a pussy to all slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecPussy>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecPussy == -1>> + <br>The corporation removes pussies from all slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecPussy>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<else>> + <br>The corporation has no plans for pussies. + <<if $corpSpecTimer == 0>> + [[Add Pussy|Manage Corporation][$corpSpecPussy = 1, $corpSpecTimer = 2]] | [[Remove Pussy|Manage Corporation][$corpSpecPussy = -1, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <</if>> + <<if $corpSpecDick == 1>> + <br>The corporation adds a dick to all slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecDick>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecDick == -1>> + <br>The corporation removes dicks from all slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecDick>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<else>> + <br>The corporation has no plans for dicks. + <<if $corpSpecTimer == 0>> + [[Add Dick|Manage Corporation][$corpSpecDick = 1, $corpSpecTimer = 2]] | [[Remove Dick|Manage Corporation][$corpSpecDick = -1, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <</if>> + <<if $corpSpecBalls == 1>> + <br>The corporation adds balls to all slaves (penis required). + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecBalls>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecBalls == -1>> + <br>The corporation removes balls from all slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecBalls>><<set $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<else>> + <br>The corporation has no plans for balls. + <<if $corpSpecTimer == 0>> + [[Add Balls|Manage Corporation][$corpSpecBalls = 1, $corpSpecTimer = 2]] | [[Remove Balls|Manage Corporation][$corpSpecBalls = -1, $corpSpecTimer = 2]] + <</if>> + <</if>> + <</if>> + <<if $corpSpecInjection == 1>> + <br>The corporation aims for petite assets. + <<if $corpSpecTimer == 0>> + [[Tasteful Size|Manage Corporation][$corpSpecInjection = 2, $corpSpecTimer = 2]] | [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecInjection == 2>> + <br>The corporation aims for tasteful assets. + <<if $corpSpecTimer == 0>> + [[Small Size|Manage Corporation][$corpSpecInjection = 1, $corpSpecTimer = 2]] | [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecInjection == 3>> + <br>The corporation aims for huge assets. + <<if $corpSpecTimer == 0>> + [[Small Size|Manage Corporation][$corpSpecInjection = 1, $corpSpecTimer = 2]] | [[Tasteful Size|Manage Corporation][$corpSpecInjection = 2, $corpSpecTimer = 2]] | + <<if $corpDivSurgeryDev > 100 && $corpSpecToken > 0>> + [[Supermassive Size|Manage Corporation][$corpSpecInjection = 4, $corpSpecToken -= 1, $corpSpecTimer = 2]] + <</if>> + <<if $corpDivDairyDev > 200 && $corpSpecToken > 0>> | + [[Pastoral Size|Manage Corporation][$corpSpecInjection = 5, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecInjection == 4>> + <br>The corporation aims for supermassive assets. + <<if $corpSpecTimer == 0>> + [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken += 1, $corpSpecTimer = 2]] | + <<if $corpDivDairyDev > 200>> + [[Pastoral Size|Manage Corporation][$corpSpecInjection = 5, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecInjection == 5>> + <br>The corporation aims for pastoral assets. + <<if $corpSpecTimer == 0>> + [[Huge Size|Manage Corporation][$corpSpecInjection = 3, $corpSpecToken += 1, $corpSpecTimer = 2]] | + <<if $corpDivSurgeryDev > 50>> + [[Supermassive Size|Manage Corporation][$corpSpecInjection = 4, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecInjection>><<set $corpSpecToken += 2, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecHormones == 1>> + <br>The corporation feminizes slaves with hormones. + <<if $corpSpecTimer == 0>> + [[Masculinize|Manage Corporation][$corpSpecHormones = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHormones>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecHormones == 2>> + <br>The corporation masculinize slaves with hormones. + <<if $corpSpecTimer == 0>> + [[Feminize|Manage Corporation][$corpSpecHormones = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecHormones>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecAmputee == 1>> + <br>The corporation removes all limbs from its slaves. + <<if $corpSpecTimer == 0>> + <<link "Stop">><<unset $corpSpecAmputee>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecMilk == 1>> + <br>The corporation makes sure all slaves are naturally lactating. + <<if $corpSpecTimer == 0>> + [[Lactation Implant|Manage Corporation][$corpSpecMilk = 2, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMilk>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecMilk == 2>> + <br>The corporation equips all slaves with lactation implants. + <<if $corpSpecTimer == 0>> + [[Natural Lactation|Manage Corporation][$corpSpecMilk = 1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecMilk>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> + <<if $corpSpecSexEd == 1>> + <br>The corporation familiarizes slaves with sexual service. + <<if $corpSpecTimer == 0>> + <<if $corpSpecToken > 0 && $corpDivWhoreDev > 200>> + [[Advanced Training|Manage Corporation][$corpSpecSexEd = 2, $corpSpecToken -= 1, $corpSpecTimer = 2]] | + <</if>> + <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecSexEd == 2>> + <br>The corporation teaches advanced sexual techniques to its slaves. + <<if $corpSpecTimer == 0>> + [[Basic Training|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken +=1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <<elseif $corpSpecSexEd == 0>> + <br>The corporation teaches no sexual techniques to its slaves. + <<if $corpSpecTimer == 0>> + [[Basic Training|Manage Corporation][$corpSpecSexEd = 1, $corpSpecToken -=1, $corpSpecTimer = 2]] | <<link "No Focus">><<unset $corpSpecSexEd>><<set $corpSpecToken += 1, $corpSpecTimer = 2>><<goto "Manage Corporation">><</link>> + <</if>> + <</if>> <</if>> /*End of activated specializations*/ <br><br> @@.orange;//Warning: Think TWICE before you click this!//@@ <<link "Dissolve the corporation">> - <<set cashX(Math.min(corpSharePrice() * $personalShares / 1000, 1000000), "stocksTraded")>> - <<run App.Corporate.dissolve()>> - <<goto "Manage Corporation">> + <<set cashX(Math.min(corpSharePrice() * $personalShares / 1000, 1000000), "stocksTraded")>> + <<run App.Corporate.dissolve()>> + <<goto "Manage Corporation">> <</link>> @@.orange;//Warning!//@@ diff --git a/src/SecExp/secBarracks.tw b/src/SecExp/secBarracks.tw index 2da530ea9ae0c600c422a22dc835edc9fbcb191f..ada03c5458f4fe44f7ee34c8c3b2db0276cb0ebe 100644 --- a/src/SecExp/secBarracks.tw +++ b/src/SecExp/secBarracks.tw @@ -168,7 +168,7 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> ( <<else>> You have not yet installed a drone security system in your arcology, you will not be able to form a unit of drones. <</if>> - + <br><br>__Slaves__ <br>/* slaves */ You are free to organize your menial slaves into fighting units. Currently you have <<print num($menials)>> slaves available, while <<print num($slavesEmployedManpower)>> are already employed as soldiers. During all your battles you lost a total of <<print num($slavesTotalCasualties)>>. diff --git a/src/SecExp/secExpSmilingMan.tw b/src/SecExp/secExpSmilingMan.tw index e3007e4b8693681654e7cf4d4bca0694f2701d63..37710918146901ce3a76293cd5f4727e8a92f7b4 100644 --- a/src/SecExp/secExpSmilingMan.tw +++ b/src/SecExp/secExpSmilingMan.tw @@ -328,9 +328,9 @@ Well, I hope I'm everything you expected," you hear a voice say. Despite recognizing it, you struggle to convince yourself that the little $girl in front of you is indeed the famous criminal mastermind. <br>"As you can see, I have no intention of escaping. I knew my life was over the second my plan went into effect. I accepted my end a long time ago, so feel free to do your worst; my life has already ended in triumph." <br>You evaluate the situation: the burning desire of vengeance for all the damage that little twerp caused is hard to ignore, but equally so is the admiration for $his skill and determination. Indeed, $he would be a great addition to your court, as a free individual or not. - + <span id="result"> <br><br> - + <<link "Offer $him a new life">> <<set $smilingManFate = 0>> <<replace "#result">> @@ -342,7 +342,7 @@ <</link>> <</replace>> <</link>> - + <br> <<link "Make $him pay">> <<set $smilingManFate = 1>> <<replace "#result">> diff --git a/src/events/gameover.tw b/src/events/gameover.tw index 07b959a0faf05c7b9edc19bce11811a871fbffda..0d22c663d97fbba4c76b1fad9499f027dc895b7b 100644 --- a/src/events/gameover.tw +++ b/src/events/gameover.tw @@ -15,6 +15,7 @@ <<case "debt">> You have fallen so far into debt that it is mere child's play for another slaveowner to purchase your debt, call it in, and enslave you. The story of your remaining years may be worth telling, but it must be told elsewhere. + <<set $slavePC = convertPlayerToSlave($PC)>> <<case "birth complications">> Again and again, you keep bearing down. As you grow more exhausted and are no closer to giving birth, you let out a feeble cry for help. @@ -57,6 +58,11 @@ <<case "Idiot Ball 2 The Dumbassening">> <<case "Idiot Ball 3 Totally Not Idiot Ball 2 Again">> As you leave your penthouse to conduct your daily rounds, you promptly get <<if $arcologyUpgrade.drones == 1>>tased by the nearest drone<<else>>tackled hard against the wall<</if>>. When you awake, it hits you like a truck; you idiotically enslaved your $PC.race ass by decreeing all <<if $gameover == "Idiot Ball 2 The Dumbassening">>non-<<print $arcologies[0].FSSupremacistRace>><<else>><<print $arcologies[0].FSSubjugationistRace>><</if>><<if $PC.race != "mixed race">>s<<else>> individuals<</if>> slaves, and since you are now a slave, lack the authority to revert the policy. The story of your remaining years may be worth telling, as is your legendary blunder, but it must be told elsewhere. + <<if $gameover == "Idiot Ball 2 The Dumbassening">> + <<set $slavePC = convertPlayerToSlave($PC, "notSupreme")>> + <<else>> + <<set $slavePC = convertPlayerToSlave($PC, "subjugated")>> + <</if>> <<default>> Since you are without slaves, Free Cities society no longer considers you a citizen of the first rank. Your personal story may continue, but that part of it worthy of retelling has now ended. diff --git a/src/events/intro/initNationalities.tw b/src/events/intro/initNationalities.tw index e13a464b4a93587af7ac5a1611e20c2d5c4f95ca..d2b55a7126fdf3f954b1f37241a88bde6b45e417 100644 --- a/src/events/intro/initNationalities.tw +++ b/src/events/intro/initNationalities.tw @@ -26,7 +26,7 @@ <<set $trinkets.push("an artist's impression of an early arcology design")>> <<set $arcologyUpgrade.drones = 1, $arcologyUpgrade.hydro = 1>> <<if $secExpEnabled > 0>> - <<set $secBots.active = 1, $secBots.troops = 30, $secBots.maxTroops = 30>> + <<set $secBots.active = 1, $secBots.troops = 30, $secBots.maxTroops = 30>> <</if>> <<elseif $PC.career == "medicine">> <<set $trinkets.push("a framed postsurgical x-ray")>> diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw index ee0d37dfe8a183a50291cd9d622efc0fc0a1364f..22102c426ae1e57f3bcc7761d2e5eab2dc410999 100644 --- a/src/events/intro/introSummary.tw +++ b/src/events/intro/introSummary.tw @@ -256,7 +256,7 @@ __''General slave settings''__ <<options $disableLisping>> <<option 0 "Enable Lisping">> Lisping: ''slaves with fat lips or heavy oral piercings will lisp''. - <<option 1 "Disable Lisping">> + <<option 1 "Disable Lisping">> Lisping: ''slaves will not lisp''. <</options>> diff --git a/src/facilities/nursery/nurseryWidgets.js b/src/facilities/nursery/nurseryWidgets.js index a0ec1e2cfa4d354b72d2178b075087eaae907342..5dd5ff352ce37e1b09964a0753e1f179811426d6 100644 --- a/src/facilities/nursery/nurseryWidgets.js +++ b/src/facilities/nursery/nurseryWidgets.js @@ -8041,22 +8041,22 @@ App.Facilities.Nursery.LongChildDescription = function(child) { r += `larger than a dick can grow naturally, `; break; case 6: - r += `${showDickCMs ? `${His} enormous${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has an enormous${V.seeCircumcision ? `, uncut,` : `, circumcised,`} penis`}, a rival to the world's largest natural dicks, `; + r += `${showDickCMs ? `${His} enormous${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has an enormous${V.seeCircumcision ? `, uncut,` : `, circumcised,`} penis`}, a rival to the world's largest natural dicks, `; break; case 5: - r += `${showDickCMs ? `${His} huge${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is more than${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a huge${V.seeCircumcision ? `, uncut,` : `, circumcised,`} penis`}, large enough to be sexually inconvenient, `; + r += `${showDickCMs ? `${His} huge${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is more than${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a huge${V.seeCircumcision ? `, uncut,` : `, circumcised,`} penis`}, large enough to be sexually inconvenient, `; break; case 4: - r += `${showDickCMs ? `${His} large${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a large${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, big enough to be a source of pride on a male, `; + r += `${showDickCMs ? `${His} large${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a large${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, big enough to be a source of pride on a male, `; break; case 3: - r += `${showDickCMs ? `${His} average-sized${V.seeCircumcision ? `, uncut` : ` circumcised`}, peni ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`}s erect` : `${He} has an average-sized${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, `; + r += `${showDickCMs ? `${His} average-sized${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`}s erect` : `${He} has an average-sized${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, `; break; case 2: - r += `${showDickCMs ? `${His} small${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a small${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, little enough to be a source of embarrassment on a male, `; + r += `${showDickCMs ? `${His} small${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis ${canAchieveErection(child) ? `is around${dickToEitherUnit(child.dick)} long when` : `would be around${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has a small${V.seeCircumcision ? `, uncut` : ` circumcised`}, penis`}, little enough to be a source of embarrassment on a male, `; break; case 1: - r += `${showDickCMs ? `${His}${V.seeCircumcision ? `, uncut` : ` circumcised`} micropenis ${canAchieveErection(child) ? `is less than${dickToEitherUnit(child.dick)} long when` : `would be less than${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has ${V.seeCircumcision ? `an uncut` : `a circumcised`} micropenis`}, `; + r += `${showDickCMs ? `${His}${V.seeCircumcision ? `, uncut` : ` circumcised`} micropenis ${canAchieveErection(child) ? `is less than${dickToEitherUnit(child.dick)} long when` : `would be less than${dickToEitherUnit(child.dick)} long if it could become`} erect` : `${He} has ${V.seeCircumcision ? `an uncut` : `a circumcised`} micropenis`}, `; break; default: if (V.showDickCMs) { @@ -8757,7 +8757,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) { } if (child.aphrodisiacs > 0 || child.inflationType === "aphrodisiac") { - r += `The aphrodisiacs have ${him} so horny that there's a ${child.prostate > 1 ? `constant flow of precum leaking from` : `little precum beading at`} the hole. `; + r += `The aphrodisiacs have ${him} so horny that there's a ${child.prostate > 1 ? `constant flow of precum leaking from` : `little precum beading at`} the hole. `; } else if (child.energy > 95) { r += `As a nympho, ${he}'s almost always got a ${child.prostate > 1 ? `constant flow of precum leaking from` : `little precum forming at`} the hole. `; } else if (child.fetishKnown) { @@ -12647,7 +12647,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) { if (child.dick !== 0 && child.hormoneBalance >= 100 && isAmputee(child)) { r += `The aphrodisiacs combined with the hormones that keep ${him} flaccid have ${him} sexually frustrated; ${he}'s ${(child.fetish === "buttslut" || child.sexualFlaw !== "hates anal") && child.counter.anal > 9 ? ` unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and` : ``} humping ${his} dick against whatever ${he} can manage to mount without limbs. ${child.inflationType === "aphrodisiac" ? `${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. ` : ``}`; } else if (child.dick !== 0 && child.balls > 0 && child.ballType === "sterile" && isAmputee(child)) { - r += `The aphrodisiacs combined with the chemical castration that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s ${(child.fetish === "buttslut" || child.sexualFlaw !== "hates anal") && child.counter.anal > 9 ? ` unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and` : ``} humping ${his} dick against whatever ${he} can manage to mount without limbs. ${child.inflationType === "aphrodisiac" ? `${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. ` : ``}`; + r += `The aphrodisiacs combined with the chemical castration that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s ${(child.fetish === "buttslut" || child.sexualFlaw !== "hates anal") && child.counter.anal > 9 ? ` unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and` : ``} humping ${his} dick against whatever ${he} can manage to mount without limbs. ${child.inflationType === "aphrodisiac" ? `${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. ` : ``}`; } else if (child.dick !== 0 && !child.balls && isAmputee(child)) { r += `The aphrodisiacs combined with the lack of balls that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s ${(child.fetish === "buttslut" || child.sexualFlaw !== "hates anal") && child.counter.anal > 9 ? ` unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and` : ``} humping ${his} dick against whatever ${he} can manage to mount without limbs. ${child.inflationType === "aphrodisiac" ? `${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. ` : ``}`; } else if (child.dick !== 0 && child.hormoneBalance >= 100) { @@ -16493,7 +16493,7 @@ App.Facilities.Nursery.InfantState = class InfantState { this.pubicHColor = "brown"; /** armpit hair style */ this.underArmHColor = "brown"; - /** eyebrowHColor*/ + /** eyebrowHColor*/ this.eyebrowHColor = "brown"; /** skin color */ this.skin = "light"; @@ -16894,7 +16894,7 @@ App.Facilities.Nursery.ChildState = class ChildState { this.pubicHColor = "brown"; /** Armpit hair style */ this.underArmHColor = "brown"; - /** eyebrowHColor*/ + /** eyebrowHColor*/ this.eyebrowHColor = "brown"; /** Child's original skin color. */ this.origSkin = "light"; diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css index 269a6c106604d81e519f9a3aedfeb5fdac7922e2..cb02e8e193a2078669c3b8f70cb1467f3e354b6b 100644 --- a/src/gui/css/mainStyleSheet.css +++ b/src/gui/css/mainStyleSheet.css @@ -284,11 +284,19 @@ white-space: normal; color: #68D; margin-right: 1em; } +.rajs-listitem.selected { + color: gray; + text-decoration: none; +} .rajs-listitem:last-of-type { margin-right: 0; } .rajs-listitem:hover { cursor: pointer; text-decoration: underline; } +.rajs-listitem.selected:hover { + cursor: default; + text-decoration: none; +} .rajs-list strong:first-of-type, .rajs-list input { margin-right: 2em; } @@ -306,34 +314,34 @@ white-space: normal; } h1, h2, h3 { - margin-bottom: 0; - margin-top: 0.25em; + margin-bottom: 0; + margin-top: 0.25em; } .founding { - font-size: 0.8em; - margin-top: -0.8em; - margin-left: 0.5em; - font-style: italic; + font-size: 0.8em; + margin-top: -0.8em; + margin-left: 0.5em; + font-style: italic; } table.corporate { - border: 3px darkgreen double; - border-collapse: collapse; - min-width: 33%; + border: 3px darkgreen double; + border-collapse: collapse; + min-width: 33%; } table.corporate tbody tr:nth-child(even) { - background-color: rgb(0, 30, 0); + background-color: rgb(0, 30, 0); } table.corporate tbody tr:nth-child(odd) { - background-color: rgb(15, 40, 15); + background-color: rgb(15, 40, 15); } table.corporate td { - vertical-align: top; + vertical-align: top; } .note { - font-size: 0.75em; - font-style: italic; + font-size: 0.75em; + font-style: italic; } .majorText { - margin-top: 0.5em; - margin-bottom: 1.5em; + margin-top: 0.5em; + margin-bottom: 1.5em; } diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index cd5fd6efe7a120ac3f2aa55da62c1579d685e8b8..cf7161a16602f3e0b2af5a75d23cafc232cb9e33 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -2949,8 +2949,8 @@ window.DefaultRules = (function() { return true; } window.RuleHasError = (rule) => rule.condition.function === "custom" - &&(rule.condition.data.match(rxCheckEqual) - || !compileCheck(rule.condition.data)); + &&(rule.condition.data.match(rxCheckEqual) + || !compileCheck(rule.condition.data)); window.DefaultRulesError = () => V.defaultRules.some(r => RuleHasError(r)); return DefaultRules; })(); diff --git a/src/js/findSlave.js b/src/js/findSlave.js index 0e5b447910136478d2e386764ad3ec676c1fd9c9..84450f192f6f012ab8038f70fb89acb0518d7159 100644 --- a/src/js/findSlave.js +++ b/src/js/findSlave.js @@ -7,8 +7,8 @@ App.FindSlave = {}; * @returns {boolean} */ App.FindSlave._fragmentSearch = function(haystacks, needles) { - const hs = haystacks.join(" "); - return needles.every((needle) => { return needle.test(hs); }); + const hs = haystacks.join(" "); + return needles.every((needle) => { return needle.test(hs); }); }; /** @@ -17,12 +17,12 @@ App.FindSlave._fragmentSearch = function(haystacks, needles) { * @returns {number[]} */ App.FindSlave._slaveIndices = function(predicate) { - return V.slaves.reduce((acc, slave, ind) => { - if (predicate(createReadonlyProxy(slave))) { - acc.push(ind); - } - return acc; - }, []); + return V.slaves.reduce((acc, slave, ind) => { + if (predicate(createReadonlyProxy(slave))) { + acc.push(ind); + } + return acc; + }, []); }; /** @@ -31,9 +31,9 @@ App.FindSlave._slaveIndices = function(predicate) { * @returns {DocumentFragment} */ App.FindSlave.searchByName = function(query) { - const needles = query.split(" ").map((needle) => { return new RegExp(needle, "i"); }); - const indices = this._slaveIndices((slave) => { return this._fragmentSearch([slave.slaveName, slave.slaveSurname, slave.birthName, slave.birthSurname], needles); }); - return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); + const needles = query.split(" ").map((needle) => { return new RegExp(needle, "i"); }); + const indices = this._slaveIndices((slave) => { return this._fragmentSearch([slave.slaveName, slave.slaveSurname, slave.birthName, slave.birthSurname], needles); }); + return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); }; /** @@ -42,9 +42,9 @@ App.FindSlave.searchByName = function(query) { * @returns {DocumentFragment} */ App.FindSlave.searchByBackground = function(query) { - const needles = query.split(" ").map((needle) => { return new RegExp(needle, "i"); }); - const indices = this._slaveIndices((slave) => { return this._fragmentSearch([slave.career, slave.origin], needles); }); - return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); + const needles = query.split(" ").map((needle) => { return new RegExp(needle, "i"); }); + const indices = this._slaveIndices((slave) => { return this._fragmentSearch([slave.career, slave.origin], needles); }); + return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); }; /** @@ -53,7 +53,7 @@ App.FindSlave.searchByBackground = function(query) { * @returns {DocumentFragment} */ App.FindSlave.searchByExpression = function(query) { - const pred = new Function("slave", "return (" + query + ");"); - const indices = runWithReadonlyProxy(() => { return this._slaveIndices(pred); }); - return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); + const pred = new Function("slave", "return (" + query + ");"); + const indices = runWithReadonlyProxy(() => { return this._slaveIndices(pred); }); + return App.UI.SlaveList.render.listDOM(indices, [], App.UI.SlaveList.SlaveInteract.stdInteract); }; diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index 4f4a1da41b2dd0cf2a7389476262dfa3873cdcb0..f45609aaedef7d50bc708b16e4c61c38fcedf335 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -209,7 +209,7 @@ window.ruleAppliesP = function ruleAppliesP(cond, slave) { flag = cond.data.value.includes(slave[cond.data.attribute]); break; case "custom": // user provided JS function - //TODO: This should use a cached Function instead of 'eval'ing + //TODO: This should use a cached Function instead of 'eval'ing flag = eval(cond.data)(slave); break; } diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 7ada7683e3e2835ecb7b4db1cda8b278c30a8d86..7cff916011d3998a9abf14e7164471c415ec43f3 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -243,7 +243,7 @@ window.rulesAssistantOptions = (function() { } } - + let _blockCallback=Symbol("Block Callback"); // list of clickable elements // has a short explanation (the prefix) and a value display // value display can optionally be an editable text input field @@ -260,6 +260,7 @@ window.rulesAssistantOptions = (function() { */ constructor(prefix, data = [], allowNullValue = true, editor = false, capitalizeShortcuts = false, ...args) { super(prefix, editor, ...args); + this[_blockCallback] = false; this.selectedItem = null; /** @protected */ this._allowNullValue = allowNullValue; @@ -288,17 +289,42 @@ window.rulesAssistantOptions = (function() { inputEdited() { if (this.selectedItem) { this.selectedItem.deselect(); } + this.setValue(this.getTextData()); this.propagateChange(); } selectItem(item) { if (this.selectedItem) { this.selectedItem.deselect(); } - this.selectedItem = item; this.setValue(item.data); this.propagateChange(); } - + trySetValue(what) { + if(what == null && this._allowNullValue) { + this.setValue(what); + return; + } + const selected = this.children.filter(listItem => _.isEqual(listItem.data, what)); + if(selected != null && selected.length == 1) + { + this.selectItem(selected[0]); + } + else if(this._allowNullValue) { + this.setValue(null); + } + } setValue(what) { + if(what == null && !this._allowNullValue) { what = ""; } + this.realValue = what; + if(this[_blockCallback]) return; + try { + this[_blockCallback] = true; + this.setTextValue(what); + this.updateSelected(); + } finally { + this[_blockCallback] = false; + } + } + setTextValue(what) { const str = what === null ? "no default setting" : `${what}`; if (this.value) { if (this.value.tagName === "INPUT") { @@ -310,6 +336,9 @@ window.rulesAssistantOptions = (function() { } getData() { + return this.realValue; + } + getTextData() { return (this.value.tagName === "INPUT" ? this.parse(this.value.value) : this.selectedItem.data); } @@ -321,6 +350,29 @@ window.rulesAssistantOptions = (function() { this.onchange(this.getData()); } } + dataEqual(left, right) { + return _.isEqual(left, right); + } + updateSelected() { + const dataValue = this.getData(); + let selected; + if(dataValue == null) { + selected = this.children.filter(listItem => listItem.data == null); + } + else { + selected = this.children.filter(listItem => this.dataEqual(listItem.data, dataValue)); + } + if (selected.length > 1) { debugger; throw Error(`Multiple shortcuts matched ${JSON.stringify(dataValue)}`); } + if (selected.length == 1) { + const listItem = selected[0]; + listItem.select(false); + if(this.selectedItem != null + && !_.isEqual(this.selectedItem, listItem)) { + this.selectedItem.deselect(); + } + this.selectedItem = listItem; + } + } /** * @private @@ -360,11 +412,11 @@ window.rulesAssistantOptions = (function() { return elem; } - select() { + select(notify = true) { if (this.selected) { return false; } - this.parent.selectItem(this); - this.element.classList.add("selected"); this.selected = true; + this.element.classList.add("selected"); + if(notify) { this.parent.selectItem(this); } return true; } @@ -524,16 +576,16 @@ window.rulesAssistantOptions = (function() { return res; } - getData() { + getTextData() { return this.selectedValue; } - setValue(what) { + setTextValue(what) { this.selectedValue = what; if (this.values.has(what)) { - super.setValue(this.values.get(what)); + super.setTextValue(this.values.get(what)); } else { - super.setValue(what); + super.setTextValue(what); } } } @@ -546,7 +598,7 @@ window.rulesAssistantOptions = (function() { createEditor() { let res = document.createElement("input"); res.setAttribute("type", "text"); - res.classList.add("rajs-value"); // + res.classList.add("rajs-value"); // call the variable binding when the input field is no longer being edited, and when the enter key is pressed res.onblur = () => { this.inputEdited(); @@ -554,14 +606,21 @@ window.rulesAssistantOptions = (function() { res.onkeypress = (e) => { if (returnP(e)) { this.inputEdited(); } }; + $(res).click(()=>res.setAttribute("placeholder", "")); return res; } + setValue(what) { + super.setValue(what); + this.value.setAttribute("placeholder", what == null + ? `(${capFirstChar(noDefaultSetting.text)})` + : ''); + } - getData() { + getTextData() { return this.value.value; } - setValue(what) { + setTextValue(what) { this.value.value = what; } } @@ -677,7 +736,7 @@ window.rulesAssistantOptions = (function() { return what === "" ? null : parseInt(what); } - setValue(what) { + setTextValue(what) { if (typeof what === 'number') { // comes from a pre-set this.numEditor.value = what.toString(); } else if (what === null) { @@ -689,10 +748,20 @@ window.rulesAssistantOptions = (function() { } } - getData() { + getTextData() { const v = this.parse(this.numEditor.value); return v === null ? null : App.RA.makeTarget(this.opSelector.value, v); } + + dataEqual(left, right) { + debugger; + if (left == null && right == null) { return true; } + if (left == null || right == null) { return false; } + //ignore the operator + if(_.isObject(left )) { left = left .val; } + if(_.isObject(right)) { right = right.val; } + return left == right; + } } class NumericRangeEditor extends EditorWithShortcuts { @@ -757,7 +826,7 @@ window.rulesAssistantOptions = (function() { return res; } - getData() { + getTextData() { function parse(what) { return what === "" ? null : parseInt(what); } @@ -768,7 +837,7 @@ window.rulesAssistantOptions = (function() { App.RA.makeRange(vMin !== null ? vMin : this._min, vMax !== null ? vMax : this._max); } - setValue(what) { + setTextValue(what) { if (what === null) { this._minEditor.value = null; this._maxEditor.value = null; @@ -1090,7 +1159,7 @@ window.rulesAssistantOptions = (function() { ["Amputation", "amp"], ]; this.fnlist = new List("Activation function", items); - this.fnlist.setValue(current_rule.condition.function === "between" ? current_rule.condition.data.attribute : current_rule.condition.function); + this.fnlist.setValue(["between", "belongs"].includes(current_rule.condition.function) ? current_rule.condition.data.attribute : current_rule.condition.function); this.fnlist.onchange = (value) => this.fnchanged(value); this.appendChild(this.fnlist); this.fneditor = null; @@ -1206,7 +1275,7 @@ window.rulesAssistantOptions = (function() { { const errorMessage = document.createElement("div"); $(errorMessage).addClass("yellow"); - errorMessage.innerText = "WARNING: There are errors in this condition. Please ensure the syntax is correct and equality is either '==' or '===', not '='"; + errorMessage.innerText = "WARNING: There are errors in this condition. Please ensure the syntax is correct and equality is either '==' or '===', not '='"; elem.appendChild(errorMessage); } @@ -1217,6 +1286,7 @@ window.rulesAssistantOptions = (function() { } } + class RangeEditor extends Element { render(fn, data) { const elem = document.createElement("div"); @@ -1564,7 +1634,7 @@ window.rulesAssistantOptions = (function() { class ClearLabelSwitch extends BooleanSwitch { constructor() { - super("Remove all tags (Gobal swith)", [false, true]); + super("Remove all tags (Global switch)", [false, true]); this.setValue(current_rule.set.labelTagsClear); this.onchange = (value) => current_rule.set.labelTagsClear = value; } @@ -2587,6 +2657,18 @@ window.rulesAssistantOptions = (function() { } } + const dietAddedText = function(value) { + switch(value) { + case 0: + return "None"; + case 1: + return "Added"; + case 2: + return "Based"; + default: + return value; + } + } class DietBaseList extends List { constructor() { // TODO: better data structure? @@ -2600,16 +2682,20 @@ window.rulesAssistantOptions = (function() { ["Milk-Based", {cum: 0, milk: 2}], ]; super("Diet base", pairs, false); - this.setValue(this.value2string(current_rule.set.dietCum, current_rule.set.dietMilk)); + this.setValue({cum: current_rule.set.dietCum, milk: current_rule.set.dietMilk }); this.onchange = (value) => { current_rule.set.dietCum = value.cum; current_rule.set.dietMilk = value.milk; - this.setValue(this.value2string(current_rule.set.dietCum, current_rule.set.dietMilk)); + this.setValue(value); }; } - - value2string(cum, milk) { - return `cum: ${cum}, milk: ${milk}`; + setTextValue(what) { + if(what.cum == null && what.milk == null) { + super.setTextValue(capFirstChar(noDefaultSetting.text)); + } + else { + super.setTextValue(`Cum: ${dietAddedText(what.cum)}, Milk: ${dietAddedText(what.milk)}`); + } } } @@ -2888,11 +2974,21 @@ window.rulesAssistantOptions = (function() { if (val === undefined) { val = this.combine(); } else { - if (val === noDefaultSetting.value) { + if (val === noDefaultSetting.value || val === null) { this.colorlist.setValue(val); this.shapelist.setValue(val); } else { - // + let list = val.split(' '); + if(list.length == 2) + { + this.colorlist.setValue(list[0]); + this.shapelist.setValue(list[1]); + } + else if(list.length == 1) + { + this.colorlist.trySetValue(list[0]); + this.shapelist.trySetValue(list[0]); + } } } super.setValue(val); diff --git a/src/js/slaveGenerationJS.js b/src/js/slaveGenerationJS.js index 72953069750d063321340b2ddf3b494801d0fe49..73e978efcb392495f24fba7183b76d71bfa49fdb 100644 --- a/src/js/slaveGenerationJS.js +++ b/src/js/slaveGenerationJS.js @@ -91,48 +91,48 @@ window.nationalityToName = function nationalityToName(slave) { } slave.slaveSurname = slave.birthSurname; if (V.useFSNames === 1) { - if (V.FSNamePref === 0) { - if (V.arcologies[0].FSChattelReligionist > 20) { - slave.slaveName = jsEither(setup.chattelReligionistSlaveNames); - slave.slaveSurname = 0; - } else if (V.arcologies[0].FSRomanRevivalist > 20) { - slave.slaveName = jsEither(setup.romanSlaveNames); - slave.slaveSurname = jsEither(setup.romanSlaveSurnames); - } else if (V.arcologies[0].FSAztecRevivalist > 20) { - slave.slaveName = jsEither(setup.aztecSlaveNames); - slave.slaveSurname = 0; - } else if (V.arcologies[0].FSEgyptianRevivalist > 20) { - slave.slaveName = jsEither(setup.ancientEgyptianSlaveNames); - slave.slaveSurname = 0; - } else if (V.arcologies[0].FSEdoRevivalist > 20) { - slave.slaveName = jsEither(setup.edoSlaveNames); - slave.slaveSurname = jsEither(setup.edoSlaveSurnames); - } else if (V.arcologies[0].FSDegradationist !== "unset") { - DegradingName(slave); - } - } else if (V.FSNamePref === 1) { - slave.slaveName = jsEither(setup.chattelReligionistSlaveNames); - slave.slaveSurname = 0; - } else if (V.FSNamePref === 2) { - slave.slaveName = jsEither(setup.romanSlaveNames); - slave.slaveSurname = jsEither(setup.romanSlaveSurnames); - } else if (V.FSNamePref === 3) { - slave.slaveName = jsEither(setup.aztecSlaveNames); - slave.slaveSurname = 0; - } else if (V.FSNamePref === 4) { - slave.slaveName = jsEither(setup.ancientEgyptianSlaveNames); - slave.slaveSurname = 0; - } else if (V.FSNamePref === 5) { - slave.slaveName = jsEither(setup.edoSlaveNames); - slave.slaveSurname = jsEither(setup.edoSlaveSurnames); - } else if (V.FSNamePref === 6) { - DegradingName(slave); - } else if (V.FSNamePref === 7) { - PaternalistName(slave); - } else if (V.FSNamePref === 8) { - slave.slaveName = jsEither(setup.bimboSlaveNames); - slave.slaveSurname = 0; - } + if (V.FSNamePref === 0) { + if (V.arcologies[0].FSChattelReligionist > 20) { + slave.slaveName = jsEither(setup.chattelReligionistSlaveNames); + slave.slaveSurname = 0; + } else if (V.arcologies[0].FSRomanRevivalist > 20) { + slave.slaveName = jsEither(setup.romanSlaveNames); + slave.slaveSurname = jsEither(setup.romanSlaveSurnames); + } else if (V.arcologies[0].FSAztecRevivalist > 20) { + slave.slaveName = jsEither(setup.aztecSlaveNames); + slave.slaveSurname = 0; + } else if (V.arcologies[0].FSEgyptianRevivalist > 20) { + slave.slaveName = jsEither(setup.ancientEgyptianSlaveNames); + slave.slaveSurname = 0; + } else if (V.arcologies[0].FSEdoRevivalist > 20) { + slave.slaveName = jsEither(setup.edoSlaveNames); + slave.slaveSurname = jsEither(setup.edoSlaveSurnames); + } else if (V.arcologies[0].FSDegradationist !== "unset") { + DegradingName(slave); + } + } else if (V.FSNamePref === 1) { + slave.slaveName = jsEither(setup.chattelReligionistSlaveNames); + slave.slaveSurname = 0; + } else if (V.FSNamePref === 2) { + slave.slaveName = jsEither(setup.romanSlaveNames); + slave.slaveSurname = jsEither(setup.romanSlaveSurnames); + } else if (V.FSNamePref === 3) { + slave.slaveName = jsEither(setup.aztecSlaveNames); + slave.slaveSurname = 0; + } else if (V.FSNamePref === 4) { + slave.slaveName = jsEither(setup.ancientEgyptianSlaveNames); + slave.slaveSurname = 0; + } else if (V.FSNamePref === 5) { + slave.slaveName = jsEither(setup.edoSlaveNames); + slave.slaveSurname = jsEither(setup.edoSlaveSurnames); + } else if (V.FSNamePref === 6) { + DegradingName(slave); + } else if (V.FSNamePref === 7) { + PaternalistName(slave); + } else if (V.FSNamePref === 8) { + slave.slaveName = jsEither(setup.bimboSlaveNames); + slave.slaveSurname = 0; + } } }; diff --git a/src/npc/descriptions/boobs/boobs.js b/src/npc/descriptions/boobs/boobs.js index 0b77e71508aeef9f363ea404547c4ac9515edf3e..13335d64dcd11221e99f9be05b8f6ad02e573cc2 100644 --- a/src/npc/descriptions/boobs/boobs.js +++ b/src/npc/descriptions/boobs/boobs.js @@ -213,7 +213,7 @@ App.Desc.boobBits = function() { App.Desc.boobs = function() { 'use strict'; - + /** @type {App.Utils.Pronouns} */ let pr; /** @type {string} */ diff --git a/src/player/js/enslavePlayer.js b/src/player/js/enslavePlayer.js index 03b3d443f14b04a2b15046f656df50e899d66159..da512ca553ff63493fec044de36d7ed49f6f95c8 100644 --- a/src/player/js/enslavePlayer.js +++ b/src/player/js/enslavePlayer.js @@ -1,5 +1,6 @@ /* This function adds the missing slave object variables to the player object and prunes player exclusive variables. You can only imagine what this is used for. */ -window.convertPlayerToSlave = function(slave, badEnd) { +/* This needs to find some way to survive refresh/newgame without showing up on all saves */ +window.convertPlayerToSlave = function(slave, badEnd = "boring") { /* add slave variables */ slave.skill.vaginal = 100; slave.skill.oral = 100; @@ -158,5 +159,16 @@ window.convertPlayerToSlave = function(slave, badEnd) { /* badEnd will be used here to apply unique effects depending on the ending */ + switch (badEnd) { + case "notSupreme": + slave.boobsTat = `'Subhuman ${capFirstChar(slave.race)}' is printed across $his chest.`; + break; + case "subjugated": + slave.stampTat = `'${capFirstChar(slave.race)} Fuckmeat' is printed above $his butt.`; + break; + default: + slave.buttTat = `'Product of ${V.arcologies[0].name}.' is stamped on $his left buttock.`; + } + return slave; }; diff --git a/src/player/pcSurgeryDegradation.tw b/src/player/pcSurgeryDegradation.tw index dbd422059b67ee39d4f50d3123b5784657a78946..4dc627cad3034dc0615f9548977d99be9226e428 100644 --- a/src/player/pcSurgeryDegradation.tw +++ b/src/player/pcSurgeryDegradation.tw @@ -27,7 +27,7 @@ After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your implant free boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your natural breasts. "We made sure to tighten them up a bit, get rid of that sag from not having the silicone pouch in them anymore." _HeU begins groping your breasts, feeling for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your breasts. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. <<case "breastShrinkage">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your + After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your <<if $PC.boobs >= 1400>> smaller, but still ridiculously huge, <<elseif $PC.boobs >= 1200>> diff --git a/src/pregmod/cloningWorkaround.tw b/src/pregmod/cloningWorkaround.tw index c306b063c884ea9adfc95abc2bacf8677526a52f..fc24e429285003b89b71fdab416e6773eebf4ef5 100644 --- a/src/pregmod/cloningWorkaround.tw +++ b/src/pregmod/cloningWorkaround.tw @@ -13,11 +13,11 @@ <<for _cw = 0; _cw < $slaves.length; _cw++>> <<capture _cw>> <<set _name = SlaveFullName($slaves[_cw])>> - <<if $donatrix != "Undecided" && $donatrix.ID == $slaves[_cw].ID>> - <div>//_name//</div> - <<else>> + <<if $donatrix != "Undecided" && $donatrix.ID == $slaves[_cw].ID>> + <div>//_name//</div> + <<else>> <div>[[_name|Cloning Workaround][$donatrix = $slaves[_cw]]]</div> - <</if>> + <</if>> <</capture>> <</for>> </div> @@ -28,13 +28,13 @@ <<capture _cw1>> <<if ($slaves[_cw1].ovaries > 0 || $slaves[_cw1].mpreg > 0) && isSlaveAvailable($slaves[_cw1]) && $slaves[_cw1].preg >= 0 && $slaves[_cw1].preg < 4 && $slaves[_cw1].pregWeek >= 0 && $slaves[_cw1].pubertyXX == 1 && $slaves[_cw1].pregType < 12 && $slaves[_cw1].bellyImplant == -1 && $slaves[_cw1].broodmother == 0 && $slaves[_cw1].inflation <= 2 && $slaves[_cw1].physicalAge < 70>> <<set _name2 = SlaveFullName($slaves[_cw1])>> - <div> - <<if $receptrix != "Undecided" && $receptrix.ID == $slaves[_cw1].ID>> - //_name2// - <<else>> - [[_name2|Cloning Workaround][$receptrix = $slaves[_cw1]]] <<if $slaves[_cw1].pregType >= 4>>//Using a slave carrying multiples is unadvisable//<</if>> - <</if>> - </div> + <div> + <<if $receptrix != "Undecided" && $receptrix.ID == $slaves[_cw1].ID>> + //_name2// + <<else>> + [[_name2|Cloning Workaround][$receptrix = $slaves[_cw1]]] <<if $slaves[_cw1].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>> + <</if>> + </div> <<set _eligibility = 1>> <</if>> <</capture>> @@ -45,12 +45,12 @@ <<if $PC.vagina != -1 && $PC.preg >= 0 && $PC.preg < 4 && $PC.pregType < 8 && $PC.physicalAge < 70>> <div> - <<if $receptrix != "Undecided" && $receptrix.ID == $PC.ID>> - //Yourself// - <<else>> + <<if $receptrix != "Undecided" && $receptrix.ID == $PC.ID>> + //Yourself// + <<else>> [[Use your own womb|Cloning Workaround][$receptrix = $PC]] - <</if>> - </div> + <</if>> + </div> <</if>> </div> <h2>Implantation</h2> diff --git a/src/pregmod/newChildIntro.tw b/src/pregmod/newChildIntro.tw index 1356003f194c17e8cf05d2a854f9e7d126c2bd39..f0259aa9e67702877ee90949234194b5df35f5f5 100644 --- a/src/pregmod/newChildIntro.tw +++ b/src/pregmod/newChildIntro.tw @@ -1110,7 +1110,15 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.trust -= 10>> <<setNonlocalPronouns $seeDicks>> <<replace "#result">> - You tell $him that it's in $his interests to be a good $girl. $He smiles happily, taking it as a compliment. You point behind $him; $he turns, and beholds a live feed from $arcadeName. $He gazes at the row of butts sticking out of the wall at dick height, not quite realizing what $he's seeing<<if canAchieveErection($activeSlave)>>, but becoming stiff at the sight of all the holes<</if>>. Then $he notices that there are citizens pumping away in front of two of the butts, and $he understands. As $he watches, aroused, first one citizen and then the other finishes and steps away. The first arcade inmate's <<if $seeDicks != 100>>pussy<<else>>butt<</if>> is left looking sore until $arcadeName's systems cover _himU for a quick cleaning, and the second inmate's asshole <<if $seeDicks != 0>>has obviously seen severe use, since the poor _girlU doesn't have a pussy to spread the load<<else>>is loose enough that the machines have to clean up the cum it drools onto the floor<</if>>. $activeSlave.slaveName lets out a cheer and turns to you, @@.hotpink;eagerly awaiting the day $he gets to go to $arcadeName and play with the holes.@@ It seems $he missed the point. + You tell $him that it's in $his interests to be a good $girl. $He smiles happily, taking it as a compliment. You <<if canSee($activeSlave)>>point at<<else>>direct $him towards<</if>> a wallscreen behind $him. $He turns, and beholds a live feed from $arcadeName. + <<if canSee($activeSlave)>> + $He gazes at the row of butts sticking out of the wall at dick height, not quite realizing what $he's seeing<<if canAchieveErection($activeSlave)>>, but becoming stiff at the sight of all the holes<</if>>. Then $he notices that there are citizens pumping away in front of two of the butts, and $he understands. + <<elseif canHear($activeSlave)>> + $He listens to the wet sounds of flesh on flesh, not quite realizing what $he's hearing<<if canAchieveErection($activeSlave)>>, but becoming stiff at the sound of all the sex<</if>>. Then $he picks out the sound of your citizens grunting and moaning as they pound away, and $he understands. + <<else>> + Such a broadcast would normally be pointless for a senseless slave like $activeSlave.slaveName, but you've taken precautions to accommodate such slaves. The wallscreen is connected to the heating, air conditioning, and sprinkler systems in order to accurately replicate the feeling of standing in front of a row of restrained public sex slaves, so the meaning of the scene in front of $him is not lost<<if canAchieveErection($activeSlave)>>, especially judging from the stiffness of $his prick<</if>>. + <</if>> + As $he <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>stands there<</if>>, aroused, first one citizen and then the other finishes and steps away. The first arcade inmate's <<if $seeDicks != 100>>pussy<<else>>butt<</if>> is left looking sore until $arcadeName's systems cover _himU for a quick cleaning, and the second inmate's asshole <<if $seeDicks != 0>>has obviously seen severe use, since the poor _girlU doesn't have a pussy to spread the load<<else>>is loose enough that the machines have to clean up the cum it drools onto the floor<</if>>. $activeSlave.slaveName lets out a cheer and turns to you, @@.hotpink;eagerly awaiting the day $he gets to go to $arcadeName and play with the holes.@@ It seems $he missed the point. <</replace>> <</link>> <<if ($arcade > $ArcadeiIDs.length) || ($arcadeUpgradeFuckdolls == 2)>> @@ -1164,7 +1172,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<if canSee($activeSlave)>> allowed to stand, $he immediately turns $his back to one of the studio's full length mirrors and cranes around to gawk at the picture just over $his butt. $He wiggles $his rear and giggles at the drawing moving along with it. <<else>> - you touch the are of skin around $his new tattoo, $activeSlave.slaveName, apparently finding this ticklish, starts into an uncontrollable giggling fit that you are unable to snap $him out of for a few minutes. + you touch the area of skin around $his new tattoo, $activeSlave.slaveName, apparently finding this ticklish, starts into an uncontrollable giggling fit that you are unable to snap $him out of for a few minutes. <</if>> It seems $he @@.hotpink;enjoys it.@@ <<set $activeSlave.devotion += 5>> @@ -1180,7 +1188,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.hLength = 0>> <<set $activeSlave.trust -= 50>> <<replace "#result">> - You escort $him to the auto salon running your fingers through $his long hair the entire way. $He sighs contently under your patting until you reach the salon. You strap $him in and set the auto salon to shave. $He <<if canSee($activeSlave)>>looks around frantically<<else>>trembles with fear<</if>> as the manipulators with their buzzing shears descend menacingly. As they run quickly back and forth across $his head, $he begins to sob, obviously @@.gold;fearing@@ the strange device. When $he catches sight of $his bald head, @@.mediumorchid;$his face twists with revulsion.@@ $He didn't seem to take it well. + You escort $him to the auto salon running your fingers through $his long hair the entire way. $He sighs contently under your patting until you reach the salon. You strap $him in and set the auto salon to shave. $He <<if canSee($activeSlave)>>looks around frantically<<else>>trembles with fear<</if>> as the manipulators with their buzzing shears descend menacingly. As they run quickly back and forth across $his head, $he begins to sob, obviously @@.gold;fearing@@ the strange device. When $he <<if canSee($activeSlave)>>catches sight of<<else>>feels the air on<</if>> $his bald head, @@.mediumorchid;$his face twists with revulsion.@@ $He didn't seem to take it well. <</replace>> <</link>> <</if>> @@ -1290,7 +1298,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.health -= 10>> <<set $activeSlave.boobShape = "normal">> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new ridiculous fake tits. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of giant breasts hanging from $his stretched chest and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger, even though $he is already struggling to keep upright. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new ridiculous fake tits. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of giant breasts hanging from $his stretched chest and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger, even though $he is already struggling to keep upright. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <br><<link "Implant a massive pair of 7500cc string implants in $his chest">> @@ -1303,7 +1311,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.health -= 10>> <<set $activeSlave.boobShape = "normal">> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new ridiculous fake tits. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of monster breasts straining $his chest and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing, despite $his near inability to stay upright. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new ridiculous fake tits. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of monster breasts straining $his chest and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing, despite $his near inability to stay upright. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<elseif $activeSlave.boobs < 1000>> @@ -1316,7 +1324,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.health -= 10>> <<set $activeSlave.boobShape = "normal">> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new fake balloons. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big breasts hanging from $his chest and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new fake balloons. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big breasts hanging from $his chest and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <br><<link "Implant a heavy pair of 1500cc string implants in $his chest">> @@ -1329,7 +1337,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.health -= 10>> <<set $activeSlave.boobShape = "normal">> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new fake balloons. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big breasts hanging from $his chest and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new fake balloons. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big breasts hanging from $his chest and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<else>> @@ -1370,7 +1378,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<set $activeSlave.health -= 10>> <<run SetBellySize($activeSlave)>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new bulbous middle. $He's @@.hotpink;deliriously happy@@ that $he has $his own round belly and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> you can make it bigger. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new bulbous middle. $He's @@.hotpink;deliriously happy@@ that $he has $his own round belly and @@.mediumaquamarine;bounces cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> you can make it bigger. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <</if>> @@ -1440,7 +1448,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<set $activeSlave.health -= 40>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his wide hips, especially since $he can't figure out how to roll over with them. $He's @@.hotpink;deliriously happy@@ that $he is ridiculously wide and @@.mediumaquamarine;wiggles $his door-jammers cheerfully@@ at you whenever $he gets the chance. Since the surgery was invasive, @@.red;$his health has been greatly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his wide hips, especially since $he can't figure out how to roll over with them. $He's @@.hotpink;deliriously happy@@ that $he is ridiculously wide and @@.mediumaquamarine;wiggles $his door-jammers cheerfully@@ at you whenever $he gets the chance. Since the surgery was invasive, @@.red;$his health has been greatly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<elseif $activeSlave.hips < 2>> @@ -1452,7 +1460,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<set $activeSlave.health -= 40>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his wide hips. $He's @@.hotpink;deliriously happy@@ that $he is wider than ever and @@.mediumaquamarine;wiggles $his hips cheerfully@@ at you whenever $he gets the chance. Since the surgery was invasive, @@.red;$his health has been greatly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his wide hips. $He's @@.hotpink;deliriously happy@@ that $he is wider than ever and @@.mediumaquamarine;wiggles $his hips cheerfully@@ at you whenever $he gets the chance. Since the surgery was invasive, @@.red;$his health has been greatly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<else>> @@ -1496,7 +1504,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<set $activeSlave.health -= 10>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new ridiculous fake ass, not that $he has much choice, since it has $him pinned to the bed. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of giant butt cheeks ballooning from $his bottom and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger, even though $he is already struggling to escape from under them. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new ridiculous fake ass, not that $he has much choice, since it has $him pinned to the bed. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of giant butt cheeks ballooning from $his bottom and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger, even though $he is already struggling to escape from under them. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<elseif $activeSlave.butt < 6>> @@ -1508,7 +1516,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<set $activeSlave.health -= 10>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new fake bottom. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big butt cheeks hanging from $his rear and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new fake bottom. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big butt cheeks hanging from $his rear and @@.mediumaquamarine;hopes@@ you have plans to make them even bigger. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <br><<link "Implant a heavy pair of string implants in $his rear">> @@ -1520,7 +1528,7 @@ You slowly strip down, gauging $his reactions to your show, until you are fully <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<set $activeSlave.health -= 10>> <<replace "#result">> - You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't keep $his hands off $his new fake bottom. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big butt cheeks hanging from $his rear and @@.mediumaquamarine;bounces them cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing. As with all surgery @@.red;$his health has been slightly affected.@@ + You escort $him to the remote surgery, strap $him in, and put $him under. When $he awakes, $he can't <<if hasAnyArms($activeSlave)>>keep $his hand<<if hasBothArms($activeSlave)>>s<</if>> off<<else>>stop shaking around<</if>> $his new fake bottom. $He's @@.hotpink;deliriously happy@@ that $he has $his own pair of big butt cheeks hanging from $his rear and @@.mediumaquamarine;bounces them cheerfully@@ when $he <<if canHear($activeSlave)>>hears<<else>>discovers<</if>> they'll keep growing. As with all surgery @@.red;$his health has been slightly affected.@@ <</replace>> <</link>> //This option costs <<print cashFormat($surgeryCost)>>// <<else>> diff --git a/src/pregmod/ovaTransplantWorkaround.tw b/src/pregmod/ovaTransplantWorkaround.tw index 9555616dc8b2f96dc94b5b58e3ef01e57f30c2de..ec57a9651686d6f2558bf223a844b0cb53bdea6a 100644 --- a/src/pregmod/ovaTransplantWorkaround.tw +++ b/src/pregmod/ovaTransplantWorkaround.tw @@ -14,7 +14,7 @@ __Select a slave to serve as the host__ <<capture _otw>> <<if ($donatrix.ID != $slaves[_otw].ID && $slaves[_otw].ovaries > 0 || $slaves[_otw].mpreg > 0) && isSlaveAvailable($slaves[_otw]) && $slaves[_otw].preg >= 0 && $slaves[_otw].preg < $slaves[_otw].pregData.normalBirth/10 && $slaves[_otw].pregWeek >= 0 && $slaves[_otw].pubertyXX == 1 && $slaves[_otw].pregType < 12 && $slaves[_otw].bellyImplant == -1 && $slaves[_otw].broodmother == 0 && $slaves[_otw].inflation <= 2 && $slaves[_otw].physicalAge < 70>> <<set _name = SlaveFullName($slaves[_otw])>> - <br>[[_name|Surrogacy][$receptrix = $slaves[_otw], cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "transplant"]] <<if $slaves[_otw].pregType >= 4>>//Using a slave carrying multiples is unadvisable//<</if>> + <br>[[_name|Surrogacy][$receptrix = $slaves[_otw], cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "transplant"]] <<if $slaves[_otw].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>> <<set _eligibility = 1>> <</if>> <</capture>> diff --git a/src/pregmod/pInsemination.tw b/src/pregmod/pInsemination.tw index cffbb2b653d2906b976a3196c443e45c47f1e3f2..f488a1718136877d0c8105bc0dabbd61ba420503 100644 --- a/src/pregmod/pInsemination.tw +++ b/src/pregmod/pInsemination.tw @@ -33,68 +33,58 @@ <<case "moves">> <<if $movesCount == 0>> You arrive at the apartment of a rather suave man who's made some very powerful connections. No sooner than you knock on the door are you whisked away back out into the arcology for dinner and a romantic stroll through the hydroponic gardens. Once you are escorted back to his apartment, he seats you on his couch and hands you a glass of fine wine. After an evening of pleasantries, he takes you to bed and reminds you what it feels like to be a woman. He even cooks you breakfast the next morning! As he sees you to the door, he encircles your middle, gives you a deep kiss, and tells you if you ever need anything during your pregnancy, he will be there for the mother of his coming child. - <<set $movesCount++>> <<else>> You arrive at the apartment of the gentleman, only to find him waiting to take you on another date. After a pleasant evening, and a night of intense sex, you find it hard to part with him come morning, but an arcology owner's job comes first and you have slaves waiting for your attention. He walks you back to your penthouse, deeply kissing you and making your slaves deeply envious once it comes to goodbyes. A girl could get used to a life like this, or perhaps he could even be roped into your life. Though it would take more than getting knocked up to do that, you think to yourself as you rub your fertilized belly. - <<set $movesCount++>> <</if>> + <<set $movesCount++>> <<case "quick">> <<if $quickCount == 0>> You arrive at the apartment of the very wealthy fuel baron who is to sire your child. He is eagerly waiting for you and quickly hurries you inside. He wastes no time, practically ripping your clothes off and forcing you over the edge of his bed. He hastily mounts you and roughly fucks your cunt — until he quickly finishes, that is, leaving you unsatisfied as he shoves you out the door, clothes in <<if $PC.dick != -1>>one hand and raging boner in the other<<else>>hand<</if>>. - <<set $quickCount++>> <<else>> You arrive at the apartment of the quick-shooting fuel baron and once more he quickly pulls you in. He barely manages to undress you before he is on top of you humping away. Just as he is about to cum, you wrap your legs around him; anchoring yourself to him. You remind him that his job is to knock you up, and a quick in and out isn't good enough. Buying it, he keeps thrusting, letting you reach your own orgasm. He still hurried you out the door in the end, but you got some pleasure out of him this time. - <<set $quickCount++>> <</if>> + <<set $quickCount++>> <<case "crazy">> <<if $crazyCount == 0>> You arrive at the apartment of the rather odd shut-in of a scientist. Once inside, you begin to undo your top, only to find him <<if $PC.career == "servant">>lifting your dress<<elseif $PC.career == "escort">>removing your slutty bottom<<else>>lifting your skirt<</if>>, drawing a pipette, and injecting something into your vagina. He returns to his work, waving you off with a disgruntled "Go gestate elsewhere." You leave, more confused than aroused. - <<set $crazyCount++>> <<elseif $crazyCount == 1>> You arrive at the crazy scientist's apartment once more. Upon letting yourself in, you find him hard at work. Before you can even open your mouth, he gestures towards a nearby operating table. Carefully positioning yourself on it, and inserting your legs into the waiting stirrups, you await what madness will happen next. You don't have to wait long before a long metallic rod forces its way into your vagina and painfully pushes its way past your cervix. Moaning in a mix of discomfort and arousal, you have no time to brace for the device's activation. You gasp as you feel the cum begin to flow unabated into your fertile womb. After nearly a minute, the phallic injector leaves your body allowing you to stagger to your feet. Your belly is noticeably rounded from his "load", though it evens into a slight bloat as the cum steadily flows from your pussy. You struggle back into your clothes and head back to the penthouse, hoping nobody sees you in such a state. - <<set $crazyCount++>> <<else>> Once again you arrive at the crazy scientist's door. Letting yourself in, you immediately notice the table is set and waiting for you to strap in. He doesn't even acknowledge your existence, but you know what he expects you to do. Once you have hopped on and gotten comfortable, you gasp as the injector pushes into you. You came prepared this time, wearing a skirt, no underwear, and a shirt that will allow your middle room to stretch. You tease your breasts and <<if $PC.dick != 0>>erection<<else>>erect clit<</if>> as the machine pumps cum into you. Only once you've climaxed, and you look like you're nearly full-term, does the device stop pumping into you and you are allowed to right yourself. Slowly you waddle back to your penthouse, indifferent to who may see you; you can't wait to soak in a bath, drain, and <<if $PC.dick != 0>>jack-off<<else>>rub out an orgasm or two<</if>>. - <<set $crazyCount++>> <</if>> + <<set $crazyCount++>> <<case "virgin">> <<if $virginCount == 0>> You arrive at the apartment of the quiet young man. Once he meekly welcomes you inside, you begin to slowly strip, drawing a deep blush to his face and a bulge to his pants. As you continue to tease him, making sure to brush his erection every now and then, he grabs your hand and pulls you into a tight hug. He's clueless. You take him by the hand and lead him to his bed; crawling into it, lying on your back and spreading your legs at him. Finally succeeding to remove his pants, he crawls onto you and hesitatingly penetrates you. It takes some time, but he eventually gets into the swing of things; even managing to coax an orgasm out of you<<if $PC.dick != 0>>, filling your condom with cum,<</if>> before blowing his load deep into your pussy. As he settles in next to you, you try to make your exit, but he asks you to stay and cuddle some. You allow him to rest himself on your <<if $PC.boobs >= 300>>breasts<<else>>chest<</if>> as you gently pet him. Before long he has dozed off, giving you the opportunity to slip away. Just as you shut the door, you hear a slight call of "Will I get to see you again?" - <<set $virginCount++>> <<elseif $virginCount == 1>> You arrive at the apartment of the boy whose virginity you took. He happily hugs you before pulling you inside and into his bedroom. He certainly has become more assertive since the last time you saw him. He happily suckles from your milky nipple as he tenderly fucks you, making sure to bring you to your climax before releasing his own pent up load deep into your pussy. "I waited for you to come back you know..." He cuddles into your cleavage as you contently embrace him for a post-coital nap. When it's time to leave, he sees you to the door, promising to wait for you once more. - <<set $virginCount++>> <<else>> You arrive at the apartment of the boy whose virginity you took. He happily hugs you before pulling you inside and into his bedroom. He wastes no time in diving deep into your needy cunt, even going as far as experimenting with new positions as he enjoys his lover's body. Once both of you are exhausted, you cuddle up for you post sex snooze. When it's time to leave, he sees you to the door. "You don't have to go..." he pleads, but you tell him running the arcology comes first. - <<set $virginCount++>> <</if>> + <<set $virginCount++>> <<case "futa">> <<if $futaCount == 0>> You arrive at the apartment of the rather assertive girl with both sets of functional genitals. She quickly pulls you into her bedroom, skillfully unwrapping her gift along the way, and tips you into her bed.<<if $PC.dick != 0>> Straddling you with a lewd smile, she plucks the condom off your stiff prick. She helps you into a position where she can both fuck you, and be fucked by you, at once. Your body aches by the end of things, but your lover happily massages every sore spot you point out to her. She blows you a kiss as you head out the door.<<else>> Straddling you with a lewd smile, she penetrates deep into your pussy. Sex with her was quite fun (she managed to touch every place on your body that turns you on) though a little messy, noting the cum dripping from you as you make your exit.<</if>> - <<set $futaCount++>> <<elseif $futaCount == 1>> You arrive once more at the apartment of the assertive girl with both sets of functional genitals. You immediately notice something off about her stance as she greets you and pulls you inside. As she guides you to her bed, you take note of the unusual bulge under her shapely asscheeks. Once she has you undressed and on her bed, she pauses and begins a seductive strip tease. She bends completely over as she reaches her bottoms, giving you a clear look at that bulge as she slips them off. Testicles; her balls are triple the size that your remember! She spins around, nearly slapping you with her raging erection, "You like 'em? I haven't gotten a chance to use them yet, so let's have some fun!" she says seductively. She wastes no time in setting you up doggystyle and plunging deep into your moist pussy. You gasp as her hefty balls slap against your thighs. She leans in close as she rails you, a hand sneaking around to your flat belly. You feel her cum, hard, into you, followed by an unusual sensation. She is literally filling you with cum! You gasp at the mounting pressure in your belly, now fully aware of what she was groping for. Turning to her, you find her a little disappointed; "I thought you'd get bigger..." She cups her balls and mumbles something to herself. "Well, at least my load seems to be staying in you this time, mostly," she says, motioning to the cum steadily dripping from your vagina. Taking such an impressive load was quite enjoyable, you think to yourself as you make your exit. - <<set $futaCount++>> <<else>> You arrive once more at the apartment of the assertive girl with both sets of functional genitals. She calls for you to enter shortly after knocking, and beckons you into the bedroom. You strip as you walk, eager to get a taste of her huge load again. You are not disappointed; her balls are utterly massive, easily the size of her.<<if $PC.balls >= 30>> "Your balls! Huge loads are great, aren't they? We are going to make such a wonderful mess!"<<else>>"Like 'em? Slide on up here and let's see just how big a mess we can make!"<</if>> You try your best to straddle her nuts, but shortly after getting seated, end up falling forward from her first thrust and locking lips with the lusty futa. She eagerly bucks into you as she deeply kisses you; and blows her load early. The sheer force of her orgasm floods your womb with fertile seed and forces her cock out, where it stays, spraying cum upwards like a fountain, until her room is soaked with cum. She stares at you, ashamed at herself. She finishes you off with some oral before inviting you to relax and enjoy some fine wine as an apology for cumming early. You give her balls a pat as you make your leave. A mistake, you soon realize, as she promptly orgasms and showers your back with ejaculate. Guess you'll be showering before you leave. - <<set $futaCount++>> <</if>> + <<set $futaCount++>> <<case "preggo">> <<if $preggoCount == 0>> You arrive at the apartment of the rather moody girl with both sets of functional genitals. What answers the door surprises you; she is extremely pregnant, easily ready to drop. Positioning you over the edge of her bed, she mounts you and begins to enjoy herself. Between the sensations within your pussy, <<if $PC.dick != 0>>your dick's motions against her satin sheets,<</if>>and her belly rubbing up and down your ass and lower back; you quickly tense up in orgasm, prompting her to cum strongly into your pussy. You help her onto her couch and head on your way, but not before she informs you that she'll be waiting to fuck you when you are as pregnant as she is now. - <<set $preggoCount++>> <<elseif $preggoCount == 1>> You arrive at the apartment of the heavily pregnant futa. When she answers the door and you are greeted by an even larger belly than last time it becomes abundantly clear that the two of you are on similar reproductive schedules. Noticing your look, she grabs your hands and happily says "Twins!" You wrap your arms around your lover for the evening and help her back to her bed, enjoying the weight of her middle. She stops you once she takes a seat and asks "You know, I have some fertility drugs if you want to get as big as me this time, cutie?" You shake your head "no"; being that pregnant would certainly impede your ability to run the arcology. She sighs and lies back, her stiff prick pressed against the underside of her belly, and invites you to ride her cock. You waste no time in mounting her, the feel of <<if $PC.dick != 0>>your own erection rubbing between your bellies<<else>>the underside of her pregnancy pushing into your own middle<</if>> as she thrusts up into you, driving you wild with lust. It doesn't take long for you to start bucking with orgasm and wrapping your arms around her gravid middle. Her occupants send several kicks your way as she quickens her pace, grabs your hips, and thrusts hard, cumming deep in your pussy. Panting, you slide off her and snuggle up beside her as you catch your breath. "You're looking good after having a child, you know? But obviously you looked even better heavy with my child. I'm keeping those pictures of you close!" she says with a giggle as you rise. With a gentle pat on your bottom, she sends you on your way. - <<set $preggoCount++>> <<else>> You arrive once more at the apartment of the heavily pregnant futa, though this time she takes a while to reach the door by the sound of it. When it opens, you are greeted by her usual smile and an octuplets stuffed belly. She grabs your hand and pulls it to her taut middle. "Feel them kick! There's so many of them, it feels amazing!" You wrap your arms around your heavy lover for the evening and help her back to her bed, savoring the weight of her pregnancy. She stops you once she takes a seat and asks "My offer still stands, cutie. I assure you it feels amazing to be so full of babies." You shake your head "no"; being that pregnant would definitely impede your ability to run the arcology and even enjoy your slaves properly. She lies back, before shifting her weight to her side out of discomfort. Her belly is really big, and hangs low enough that reaching her needy cock is quite the challenge; you take a moment to think of a good position to receive her. You take her dick, and gently sliding yourself between her legs, fit it into your pussy. The two of you buck against each other as best you can; a struggle, seeing as you are bearing the weight of her children right now. You have no choice but to wrap your arms around the eagerly kicking mass<<if $PC.dick != 0>>, trapping your dick between it and yourself,<</if>> as you near your climax. You feel your nethers clamp down as she cums, hard, deep into your pussy. Her children shift under your arms as her water breaks onto you. You quickly untangle yourself and help her to her feet; you can't help but enjoy the feeling of her close contractions under your hand. She points you to her bathroom; "Water birth," she pants, struggling to not give birth where she stands. The tub is already prepared for her, so you help her into it. She refuses to let go of your hand, pleading "Join me?" You take her up on the offer and slide in behind her. You massage her taxed stomach as she struggles to bring her children into the world. A loud moan escapes her lips as the first of her children slips from her pussy and into your waiting hands. Setting her aside, you prepare for the next. After several hours, and a mutual shower, you and her recover together with her eight children; as thanks, you have one milky nipple all to yourself. When it's time to leave, she blows you a kiss and thanks you sincerely for helping her through this. - <<set $preggoCount++>> <</if>> + <<set $preggoCount++>> <</switch>> diff --git a/src/pregmod/surrogacyWorkaround.tw b/src/pregmod/surrogacyWorkaround.tw index 9c14fab263ba5300eb1a33bd7d30bc333e9d2823..bd91bb8e4d804ca87f40de112a44452f6c59cf0c 100644 --- a/src/pregmod/surrogacyWorkaround.tw +++ b/src/pregmod/surrogacyWorkaround.tw @@ -72,7 +72,7 @@ __Chosen surrogate: _receive __ <<capture _sw1>> <<if ($slaves[_sw1].ovaries > 0 || $slaves[_sw1].mpreg > 0) && isSlaveAvailable($slaves[_sw1]) && $slaves[_sw1].preg >= 0 && $slaves[_sw1].preg < 4 && $slaves[_sw1].pregWeek >= 0 && $slaves[_sw1].pubertyXX == 1 && $slaves[_sw1].pregType < 12 && $slaves[_sw1].bellyImplant == -1 && $slaves[_sw1].broodmother == 0 && $slaves[_sw1].inflation <= 2 && $slaves[_sw1].physicalAge < 70>> <<set _name2 = SlaveFullName($slaves[_sw1])>> - <br>[[_name2|Surrogacy Workaround][$receptrix = $slaves[_sw1]]] <<if $slaves[_sw1].pregType >= 4>>//Using a slave carrying multiples is unadvisable//<</if>> + <br>[[_name2|Surrogacy Workaround][$receptrix = $slaves[_sw1]]] <<if $slaves[_sw1].pregType >= 4>>//Using a slave carrying multiples is inadvisable//<</if>> <<set _eligibility2 = 1>> <</if>> <</capture>> diff --git a/src/pregmod/theBlackMarket.tw b/src/pregmod/theBlackMarket.tw index 154e06b2d1f5b890115bb5077194b120714b4ab6..8b886f07e1d616ac4cbd78b46c7e1fc5abed58f5 100644 --- a/src/pregmod/theBlackMarket.tw +++ b/src/pregmod/theBlackMarket.tw @@ -362,7 +362,7 @@ He gestures to a door in the back of the stall. "The good shit's back there<<if <</if>> <</if>> - /* Stop fucking enabling this, it breaks everything. + /* Stop fucking enabling this, it breaks everything. <<if $farmyard>> <<if $thisWeeksIllegalWares[_bim] == "AnimalOrgans">> <br> diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index 1bf25410eaea12d9422eaa84b74bd98a6a60d61a..72201cb8885ebed92a2f86ff4118ec083a0fbb24 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -770,7 +770,7 @@ <</if>> <<set WombInit(_newPC)>> - + <<set $PC = clone(_newPC)>> Standardizing player object... Done!<br> <</if>> diff --git a/src/uncategorized/REFI.tw b/src/uncategorized/REFI.tw index 21e0e20dd581543af47276255fb4560e12934082..363ef0f7e955100722f0c55baaa23aa7b8a01c56 100644 --- a/src/uncategorized/REFI.tw +++ b/src/uncategorized/REFI.tw @@ -697,7 +697,7 @@ It seems $he passed by while you were buttfucking $subSlave.slaveName and found <<else>> <<if $activeSlave.nipples != "fuckable">>$his nipples are hard and <</if>>there is a clear scent of lust around $him. <</if>> -It seems $he passed by while $subSlave.slaveName was <<if $PC.dick == 0>>in the midst of _his2 little oral party<<else>>blowing you<</if>>. $He swallows painfully at the <<if canSee($activeSlave)>>sight of the satisfied cumslut swirling the ejaculate around _his2 mouth<<elseif canHear($activeSlave)>>sound of the satisfied cumslut savoring the fresh load<<else>>reminder of the taste and texture of the cum<</if>>. It should be possible to either encourage this fascination or steer $him away from it for now. +It seems $he passed by while $subSlave.slaveName was <<if $PC.dick == 0>>in the midst of _his2 little oral party<<else>>blowing you<</if>>. $He swallows painfully at the <<if canSee($activeSlave)>>sight of the satisfied cumslut swirling the ejaculate around _his2 mouth<<elseif canHear($activeSlave)>>sound of the satisfied cumslut savoring the fresh load<<else>>reminder of the <<if canTaste($activeSlave)>>taste<<else>>warmth<</if>> and texture of the cum<</if>>. It should be possible to either encourage this fascination or steer $him away from it for now. <<case "humiliation">> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 88fb05939963e8e4b403b7b16aea340e629e9324..5bcd5f755f4a6db6e38a22e5e87e3c548b29b17e 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -6489,7 +6489,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<case "submissive">> and begs him submissively to do whatever he wants to $him. <<case "cumslut">> - and begs him to come over and feed $him his delicious cum. + and begs him to come over and feed $him his <<if canTaste($activeSlave)>>delicious<<else>>warm<</if>> cum. <<case "humiliation">> as $he begins to wordlessly writhe and blush with the @@.hotpink;excitement@@ of this humiliating situation. <<set $activeSlave.devotion += 2>> @@ -10832,7 +10832,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><<link "Make $him cum like a girl">> <<EventNameDelink $activeSlave>> <<replace "#result">> - You order $him to get $his ass up on your desk. $He obeys, though not without a flicker of trepidation. $He points $his butt at you like a sex slave should, and doesn't crane around to see what you're doing behind $him, but $he's stiff with the awareness that <<if $PC.dick != 0>>there's almost certainly a hard<<if $PC.vagina != -1>> futa<</if>> dick about<<else>>you're almost certainly donning a strap-on<</if>> to slide inside $his girly asspussy. $He's not wrong, and $he lets out a little moan as <<if $PC.dick != 0>>your cockhead<<if $PC.vagina != -1>>, which you kindly lubed with a bit of your pussyjuice,<</if>><<else>>its broad tip<</if>> <<if $activeSlave.anus > 2>>slides easily inside $his whorish anus<<elseif $activeSlave.anus == 2>>slides up $his experienced butthole<<else>>forces its way inside $his tight sphincter<</if>>. + You order $him to get $his ass up on your desk. $He obeys, though not without a flicker of trepidation. $He points $his butt at you like a sex slave should, and doesn't crane around to <<if canSee($activeSlave)>>see<<else>>feel<</if>> what you're doing behind $him, but $he's stiff with the awareness that <<if $PC.dick != 0>>there's almost certainly a hard<<if $PC.vagina != -1>> futa<</if>> dick about<<else>>you're almost certainly donning a strap-on<</if>> to slide inside $his girly asspussy. $He's not wrong, and $he lets out a little moan as <<if $PC.dick != 0>>your cockhead<<if $PC.vagina != -1>>, which you kindly lubed with a bit of your pussyjuice,<</if>><<else>>its broad tip<</if>> <<if $activeSlave.anus > 2>>slides easily inside $his whorish anus<<elseif $activeSlave.anus == 2>>slides up $his experienced butthole<<else>>forces its way inside $his tight sphincter<</if>>. <br><br> As you fuck $him, you pull $his torso up so you can play with $his <<if $activeSlave.boobs > 2000>>udders<<elseif $activeSlave.boobs > 800>>tits<<else>>nipples<</if>> and whisper manipulation into $his ear. You tell $him $he's about to cum like a girl. $He says nothing, but $his body language communicates incomprehension. Girls, you tell $him, cum when they get fucked. They cum when <<if $PC.title == 1>>guys<<else>>their betters<</if>> stick dick inside them. $He bursts into tears, sobbing with shame and degradation even as $he shakes and <<if $activeSlave.balls > 0>>squirts cum<<else>>dribbles ejaculate<</if>>. The next time $he sees you, <<if (random(0,1) == 1)>> @@ -11168,7 +11168,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<elseif $activeSlave.lips > 10>> average <<else>> - miniscule + minuscule <</if>> lips are level with your <<if $PC.dick == 0>>fake dick<<else>>dick<</if>><<if $activeSlave.belly >= 100000>>, straddle $his _belly belly<</if>>, and push it into $his mouth without waiting for $him to get ready. $He gags, but does $his best to work $his tired mouth. When you're finally satisfied and you let $him up, you aim another slap at $his <<if ($activeSlave.butt > 12)>> @@ -12910,7 +12910,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<link "Not so fast">> <<EventNameDelink $activeSlave>> <<replace "#result">> - As $he goes, $he follows the natural human impulse when embarrassed, and turns $his head resolutely away from you, trying very hard to forget making such a fool of $himself. This means that $he does not see your rapid, predatory pursuit of $him; nor does $he <<if canHear($activeSlave)>>hear<<else>>notice<</if>> your careful stride across the flooring. $His first indication that $he's prey is when your hands grab $him around $his + As $he goes, $he follows the natural human impulse when embarrassed, and turns $his head resolutely away from you, trying very hard to forget making such a fool of $himself. This means that $he does not see your rapid, predatory pursuit of $him, nor does $he <<if canHear($activeSlave)>>hear<<else>>notice<</if>> your careful stride across the flooring. $His first indication that $he's prey is when your hands grab $him around $his <<if $activeSlave.bellyPreg >= 5000>> pregnant belly <<elseif $activeSlave.belly >= 5000>> @@ -18438,7 +18438,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<else>> thin <</if>> - lips part and you insert all three of your fingers into $his hot mouth. $He quivers at the intimacy of the gesture, and the taste of $his own juices. The tremor sends a delicious motion through $his + lips part and you insert all three of your fingers into $his hot mouth. $He quivers at the intimacy of the gesture, and the <<if canTaste($activeSlave)>>taste<<else>>feel<</if>> of $his own juices. The tremor sends a delicious motion through $his <<if ($activeSlave.boobsImplant == 0) && ($activeSlave.boobs > 300)>> natural <<if $activeSlave.boobs > 2000>> @@ -18758,7 +18758,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <<link "Follow $him">> <<EventNameDelink $activeSlave>> <<replace "#result">> - $His sheer joie de vivre is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where $he's going, so you catch up quickly. $He gives you the careful measuring glance of a devoted sex slave who's checking whether $his owner wants to fuck $him right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction $he was going, and $he follows. "<<Master>>," $he <<say>>s hesitantly, "I hope that wa<<s>> an okay thing for me to do." You assure $him it was. "Thank<<s>>, <<Master>>," $he beams, grinning like an idiot. Smiling at $his infectious enthusiasm for life, you ask $him why $he's so happy this morning. $He looks momentarily perplexed<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>, not a common look for a slave as smart as $him<</if>>. "I don't know! I just woke up thi<<s>> morning feeling really, really good. <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>I'm sure the fact that I'm benefiting from incredibly advanced medi<<c>>ine ha<<s>> <<s>>omething to do with it; thank you very much for that, <<Master>>. Other than that,<</if>> + $His sheer 'joie de vivre' is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where $he's going, so you catch up quickly. $He gives you the careful measuring glance of a devoted sex slave who's checking whether $his owner wants to fuck $him right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction $he was going, and $he follows. "<<Master>>," $he <<say>>s hesitantly, "I hope that wa<<s>> an okay thing for me to do." You assure $him it was. "Thank<<s>>, <<Master>>," $he beams, grinning like an idiot. Smiling at $his infectious enthusiasm for life, you ask $him why $he's so happy this morning. $He looks momentarily perplexed<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>, not a common look for a slave as smart as $him<</if>>. "I don't know! I just woke up thi<<s>> morning feeling really, really good. <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>I'm sure the fact that I'm benefiting from incredibly advanced medi<<c>>ine ha<<s>> <<s>>omething to do with it; thank you very much for that, <<Master>>. Other than that,<</if>> I ju<<s>>t feel happy." This has to be some sort of milestone for $him, and for you, and maybe for slavery in general: if $he can be this pleased with life, something must be going right. You walk $him to where $he's going <<switch $activeSlave.assignment>> <<case "whore">>(one of the arcology's nicer streets, where $he'll spend the day selling $his body), diff --git a/src/uncategorized/RETS.tw b/src/uncategorized/RETS.tw index f36ca921fc7d3bdc432b91050197874e7e84a418..24b8934053dfc121e9bd271f85bc5e44db446c58 100644 --- a/src/uncategorized/RETS.tw +++ b/src/uncategorized/RETS.tw @@ -2015,103 +2015,103 @@ $he adds impishly. <<if canHear($subSlave)>>Hearing this<<else>>Realizing your p <</replace>> <</link>> <<if $subSlave.energy > 40>> -<<if $subSlave.fetishKnown>> -<br><<link "Effect a trade">> - <<EventNameDelink $activeSlave>> - <<replace "#result">> - $subSlave.slaveName has a perfectly healthy libido; there has to be something _he2'd like getting from $activeSlave.slaveName in turn. You clear your throat, getting the slaves' attention, and ask $subSlave.slaveName if there's anything _he2'd like $activeSlave.slaveName to do for _him2 in return for sex. $activeSlave.slaveName is so desperate that $he makes a suggestion before $subSlave.slaveName can open _his2 mouth. Everyone knows $subSlave.slaveName - <<run Enunciate($activeSlave)>> - <<switch $subSlave.fetish>> - <<case "submissive">> - is a shameless submissive and loves to be fucked. $activeSlave.slaveName must know $he's being had, at least a little. "$subSlave.slaveName," $he purrs, "I'll fuck you <<if hasAnyLegs($subSlave)>>until your toe<<s>> curl<<else>><<s>>en<<s>>ele<<ss>><</if>>." - <<case "cumslut">> - loves the taste of cum. "I promi<<s>>e to pull out and let you drink my cum, <<s>>traight from my cock," $he purrs. - <<set $activeSlave.counter.penetrative++, $penetrativeTotal++>> - <<set $subSlave.counter.oral++, $oralTotal++>> - <<case "humiliation">> - loves to be humiliated. "Let'<<s>> go down to the dormitory, and I'll <<s>>lide <<if _vaginal>>your pu<<ss>>y<<else>>your butthole<</if>> down on top of my cock right there, in the middle of the doorway, <<s>>o everyone ha<<s>> to <<s>>tep over you a<<s>> you ride my dick." - <<case "buttslut">> - loves anal. - <<if canDoAnal($subSlave)>> - $activeSlave.slaveName - <<if $activeSlave.dick > 3>> - strokes $himself a couple of times, showing off $his <<if $activeSlave.dick > 5>>monstrous penis<<else>>big dick<</if>>. "Come on, don't you want thi<<s>> thing up your a<<ss>>?" $he asks. + <<if $subSlave.fetishKnown>> + <br><<link "Effect a trade">> + <<EventNameDelink $activeSlave>> + <<replace "#result">> + $subSlave.slaveName has a perfectly healthy libido; there has to be something _he2'd like getting from $activeSlave.slaveName in turn. You clear your throat, getting the slaves' attention, and ask $subSlave.slaveName if there's anything _he2'd like $activeSlave.slaveName to do for _him2 in return for sex. $activeSlave.slaveName is so desperate that $he makes a suggestion before $subSlave.slaveName can open _his2 mouth. Everyone knows $subSlave.slaveName + <<run Enunciate($activeSlave)>> + <<switch $subSlave.fetish>> + <<case "submissive">> + is a shameless submissive and loves to be fucked. $activeSlave.slaveName must know $he's being had, at least a little. "$subSlave.slaveName," $he purrs, "I'll fuck you <<if hasAnyLegs($subSlave)>>until your toe<<s>> curl<<else>><<s>>en<<s>>ele<<ss>><</if>>." + <<case "cumslut">> + loves <<if canTaste($subSlave)>>the taste of<<else>>swallowing<</if>> cum. "I promi<<s>>e to pull out and let you drink my cum, <<s>>traight from my cock," $he purrs. + <<set $activeSlave.counter.penetrative++, $penetrativeTotal++>> + <<set $subSlave.counter.oral++, $oralTotal++>> + <<case "humiliation">> + loves to be humiliated. "Let'<<s>> go down to the dormitory, and I'll <<s>>lide <<if _vaginal>>your pu<<ss>>y<<else>>your butthole<</if>> down on top of my cock right there, in the middle of the doorway, <<s>>o everyone ha<<s>> to <<s>>tep over you a<<s>> you ride my dick." + <<case "buttslut">> + loves anal. + <<if canDoAnal($subSlave)>> + $activeSlave.slaveName + <<if $activeSlave.dick > 3>> + strokes $himself a couple of times, showing off $his <<if $activeSlave.dick > 5>>monstrous penis<<else>>big dick<</if>>. "Come on, don't you want thi<<s>> thing up your a<<ss>>?" $he asks. + <<else>> + gestures to $his <<if $activeSlave.dick > 1>>modest<<else>>pathetic<</if>> penis. "I know it'<<s>> really <<s>>mall," $he <<say>>s. "But I'll u<<s>>e finger<<s>>, too. I'll make <<s>>ure you get off." + <</if>> + <<else>> + "I know you can't take it up your a<<ss>> right now," says $activeSlave.slaveName, "but can't I rim you for a while fir<<s>>t?" + <<set $activeSlave.counter.oral++, $oralTotal++>> + <<set $subSlave.counter.oral++, $oralTotal++>> + <</if>> + <<case "boobs">> + <<if $subSlave.lactation>> + loves nothing more than to have _his2 udders lovingly sucked dry. "I'll drain you," <<say>>s $activeSlave.slaveName, sticking $his tongue out to make $his meaning lewdly clear. "I'll nur<<s>>e from you until you come." + <<else>> + can't resist having _his2 breasts pampered. "I'll give you a boob ma<<ss>>age," <<say>>s $activeSlave.slaveName, and puts up $his hands, flexing $his fingers lewdly. "A really good one. I'll be thorough!" + <</if>> + <<case "pregnancy">> + loves to be inseminated, + <<if $subSlave.pregKnown == 1>> + even though _he2's already pregnant. "Come on, you know you want my <<s>>emen," <<say>>s $activeSlave.slaveName, idly toying with the precum gathering at $his tip. "<<if _vaginal>>I'll do my be<<s>>t to <<sh>>oot it all the way up into your womb. I might even make you pregnant twi<<c>>e, I'll cum in you <<s>>o hard<<else>>I'll fill your a<<ss>> up<</if>>." + <<set $subSlave.lactationDuration = 2>> + <<set $subSlave.boobs -= $subSlave.boobsMilk, $subSlave.boobsMilk = 0>> + <<else>> + regardless of whether _he2 can actually get pregnant <<if _vaginal>>right this second<<else>>in _his2 anus<</if>>. "Come on, you know you want my <<s>>emen," <<say>>s $activeSlave.slaveName, idly toying with the precum gathering at $his tip. "I'll fill you up." + <</if>> + <<case "dom">> + prefers to be on top. "Of cour<<s>>e you can fuck me too," $activeSlave.slaveName hurries to add. + <<if canDoVaginal($activeSlave.slaveName)>> + $He reaches down and spreads $his<<if $subSlave.labia > 0>> ample<</if>> labia, showing off $his pink channel. + <<elseif canDoAnal($activeSlave.slaveName)>> + $He spins, cocks $his hips, spreads $his asscheeks, and winks $his anus invitingly. + <<else>> + $He gets right down on $his knees and uses $his hands to spread $his lips as wide as they'll go. "'ou can 'a<<c>>e 'uck me," $he intones with difficulty. + <</if>> + "You can go fir<<s>>t! <<if canAchieveErection($subSlave)>>Get your cock out<<else>>Grab a <<s>>trap-on<</if>>, let'<<s>> trade hole<<s>>!" + <<case "sadist">> + is a sexual sadist. $activeSlave.slaveName swallows nervously, visibly weighing whether $he wants to offer what $he'll need to offer, and then takes the plunge. "You can hurt me," $he says in a small voice. + <<case "masochist">> + is a slut for pain. "I'll hurt you," <<say>>s $activeSlave.slaveName hesitantly. Seeing that this is well received, $he plunges on. "I'll rape you. Come on, I'm going to pound you <<s>>o hard and twi<<s>>t your nipple<<s>> until you don't know what hurt<<s>> wor<<s>>t, your tit<<s>> or your <<if _vaginal>>cunt<<else>>butthole<</if>>." + <<default>> + is pretty vanilla in bed. "Come on," <<say>>s $activeSlave.slaveName reassuringly. "You'll come more than I do, I promi<<s>>e. Fir<<s>>t I'll <<if $subSlave.dick > 0>>blow you<<else>>eat you out<</if>>. Then we'll make love. <<if $activeSlave.dick > 2>>Thi<<s>> dick will make you <<sh>>udder<<else>>I'm kind of <<s>>mall down there, but I'll u<<s>>e my hand<<s>> too<</if>>." + <<set $activeSlave.counter.oral++, $oralTotal++>> + <<set $subSlave.counter.oral++, $oralTotal++>> + <</switch>> + <br><br> + <<run Enunciate($subSlave)>> + $subSlave.slaveName is a seasoned sex slave but that doesn't stop _him2 from blushing a little at such a blunt suggestion. "Okay," _he2 says, biting _his2 <<if $activeSlave.lips > 40>>absurdly generous<<elseif $activeSlave.lips > 10>>full<<else>>thin<</if>> lower lip cutely. "I wa<<s>> actually going to <<s>>ay ye<<s>> anyway, but it'<<s>> really ni<<c>>e to have <<s>>omeone like you a<<s>>k me for it like that. I'm <<s>>orry I made you beg." + <br><br> + <<run Enunciate($activeSlave)>> + "Don't care!" <<say>>s $activeSlave.slaveName exultantly, and grabs $his conquest, planting a lusty kiss on $subSlave.slaveName's giggling mouth and <<if _vaginal>>rubbing $his erection against $subSlave.slaveName's<<if $subSlave.labia > 0>> puffy<</if>> pussylips<<else>>reaching around $subSlave.slaveName to start teasing _his2 asshole<</if>>. "Don't care, a<<s>> long a<<s>> I get to fuck your <<if _vaginal>>hot cunt<<else>>beautiful a<<ss>><</if>>!" Your work here is done, and once $he's done blowing $his load inside $subSlave.slaveName<<if !_vaginal>>'s anus<</if>>, $activeSlave.slaveName should remember to be @@.mediumaquamarine;grateful@@ to you for the reminder on how to seduce + <<switch $subSlave.fetish>> + <<case "submissive">>coquettish subs. + <<case "cumslut">>tired cumsluts. + <<case "humiliation">>reluctant exhibitionists. + <<case "buttslut">>tired anal whores. + <<case "boobs">>coquettish mammary sluts. + <<case "pregnancy">>reluctant pregsluts. + <<case "dom">>tired doms. + <<case "sadist">>tired sadists. + <<case "masochist">>silly masochists. + <<default>>vanilla <<print _girl2>>s. + <</switch>> + <<set $activeSlave.trust += 5, $activeSlave.counter.penetrative++, $penetrativeTotal++>> + <<if _vaginal>> + <<set $subSlave.counter.vaginal++, $vaginalTotal++>> + <<if canPenetrate($activeSlave) && canImpreg($subSlave, $activeSlave)>> + <<= knockMeUp($subSlave, 5, 0, $activeSlave.ID, 1)>> + <</if>> <<else>> - gestures to $his <<if $activeSlave.dick > 1>>modest<<else>>pathetic<</if>> penis. "I know it'<<s>> really <<s>>mall," $he <<say>>s. "But I'll u<<s>>e finger<<s>>, too. I'll make <<s>>ure you get off." + <<set $subSlave.counter.anal++, $analTotal++>> + <<if canPenetrate($activeSlave) && canImpreg($subSlave, $activeSlave)>> + <<= knockMeUp($subSlave, 5, 1, $activeSlave.ID, 1)>> + <</if>> <</if>> - <<else>> - "I know you can't take it up your a<<ss>> right now," says $activeSlave.slaveName, "but can't I rim you for a while fir<<s>>t?" - <<set $activeSlave.counter.oral++, $oralTotal++>> - <<set $subSlave.counter.oral++, $oralTotal++>> - <</if>> - <<case "boobs">> - <<if $subSlave.lactation>> - loves nothing more than to have _his2 udders lovingly sucked dry. "I'll drain you," <<say>>s $activeSlave.slaveName, sticking $his tongue out to make $his meaning lewdly clear. "I'll nur<<s>>e from you until you come." - <<else>> - can't resist having _his2 breasts pampered. "I'll give you a boob ma<<ss>>age," <<say>>s $activeSlave.slaveName, and puts up $his hands, flexing $his fingers lewdly. "A really good one. I'll be thorough!" - <</if>> - <<case "pregnancy">> - loves to be inseminated, - <<if $subSlave.pregKnown == 1>> - even though _he2's already pregnant. "Come on, you know you want my <<s>>emen," <<say>>s $activeSlave.slaveName, idly toying with the precum gathering at $his tip. "<<if _vaginal>>I'll do my be<<s>>t to <<sh>>oot it all the way up into your womb. I might even make you pregnant twi<<c>>e, I'll cum in you <<s>>o hard<<else>>I'll fill your a<<ss>> up<</if>>." - <<set $subSlave.lactationDuration = 2>> - <<set $subSlave.boobs -= $subSlave.boobsMilk, $subSlave.boobsMilk = 0>> - <<else>> - regardless of whether _he2 can actually get pregnant <<if _vaginal>>right this second<<else>>in _his2 anus<</if>>. "Come on, you know you want my <<s>>emen," <<say>>s $activeSlave.slaveName, idly toying with the precum gathering at $his tip. "I'll fill you up." - <</if>> - <<case "dom">> - prefers to be on top. "Of cour<<s>>e you can fuck me too," $activeSlave.slaveName hurries to add. - <<if canDoVaginal($activeSlave.slaveName)>> - $He reaches down and spreads $his<<if $subSlave.labia > 0>> ample<</if>> labia, showing off $his pink channel. - <<elseif canDoAnal($activeSlave.slaveName)>> - $He spins, cocks $his hips, spreads $his asscheeks, and winks $his anus invitingly. - <<else>> - $He gets right down on $his knees and uses $his hands to spread $his lips as wide as they'll go. "'ou can 'a<<c>>e 'uck me," $he intones with difficulty. - <</if>> - "You can go fir<<s>>t! <<if canAchieveErection($subSlave)>>Get your cock out<<else>>Grab a <<s>>trap-on<</if>>, let'<<s>> trade hole<<s>>!" - <<case "sadist">> - is a sexual sadist. $activeSlave.slaveName swallows nervously, visibly weighing whether $he wants to offer what $he'll need to offer, and then takes the plunge. "You can hurt me," $he says in a small voice. - <<case "masochist">> - is a slut for pain. "I'll hurt you," <<say>>s $activeSlave.slaveName hesitantly. Seeing that this is well received, $he plunges on. "I'll rape you. Come on, I'm going to pound you <<s>>o hard and twi<<s>>t your nipple<<s>> until you don't know what hurt<<s>> wor<<s>>t, your tit<<s>> or your <<if _vaginal>>cunt<<else>>butthole<</if>>." - <<default>> - is pretty vanilla in bed. "Come on," <<say>>s $activeSlave.slaveName reassuringly. "You'll come more than I do, I promi<<s>>e. Fir<<s>>t I'll <<if $subSlave.dick > 0>>blow you<<else>>eat you out<</if>>. Then we'll make love. <<if $activeSlave.dick > 2>>Thi<<s>> dick will make you <<sh>>udder<<else>>I'm kind of <<s>>mall down there, but I'll u<<s>>e my hand<<s>> too<</if>>." - <<set $activeSlave.counter.oral++, $oralTotal++>> - <<set $subSlave.counter.oral++, $oralTotal++>> - <</switch>> - <br><br> - <<run Enunciate($subSlave)>> - $subSlave.slaveName is a seasoned sex slave but that doesn't stop _him2 from blushing a little at such a blunt suggestion. "Okay," _he2 says, biting _his2 <<if $activeSlave.lips > 40>>absurdly generous<<elseif $activeSlave.lips > 10>>full<<else>>thin<</if>> lower lip cutely. "I wa<<s>> actually going to <<s>>ay ye<<s>> anyway, but it'<<s>> really ni<<c>>e to have <<s>>omeone like you a<<s>>k me for it like that. I'm <<s>>orry I made you beg." - <br><br> - <<run Enunciate($activeSlave)>> - "Don't care!" <<say>>s $activeSlave.slaveName exultantly, and grabs $his conquest, planting a lusty kiss on $subSlave.slaveName's giggling mouth and <<if _vaginal>>rubbing $his erection against $subSlave.slaveName's<<if $subSlave.labia > 0>> puffy<</if>> pussylips<<else>>reaching around $subSlave.slaveName to start teasing _his2 asshole<</if>>. "Don't care, a<<s>> long a<<s>> I get to fuck your <<if _vaginal>>hot cunt<<else>>beautiful a<<ss>><</if>>!" Your work here is done, and once $he's done blowing $his load inside $subSlave.slaveName<<if !_vaginal>>'s anus<</if>>, $activeSlave.slaveName should remember to be @@.mediumaquamarine;grateful@@ to you for the reminder on how to seduce - <<switch $subSlave.fetish>> - <<case "submissive">>coquettish subs. - <<case "cumslut">>tired cumsluts. - <<case "humiliation">>reluctant exhibitionists. - <<case "buttslut">>tired anal whores. - <<case "boobs">>coquettish mammary sluts. - <<case "pregnancy">>reluctant pregsluts. - <<case "dom">>tired doms. - <<case "sadist">>tired sadists. - <<case "masochist">>silly masochists. - <<default>>vanilla <<print _girl2>>s. - <</switch>> - <<set $activeSlave.trust += 5, $activeSlave.counter.penetrative++, $penetrativeTotal++>> - <<if _vaginal>> - <<set $subSlave.counter.vaginal++, $vaginalTotal++>> - <<if canPenetrate($activeSlave) && canImpreg($subSlave, $activeSlave)>> - <<= knockMeUp($subSlave, 5, 0, $activeSlave.ID, 1)>> - <</if>> - <<else>> - <<set $subSlave.counter.anal++, $analTotal++>> - <<if canPenetrate($activeSlave) && canImpreg($subSlave, $activeSlave)>> - <<= knockMeUp($subSlave, 5, 1, $activeSlave.ID, 1)>> - <</if>> + <<set $slaves[$slaveIndices[$subSlave.ID]] = $subSlave>> + <</replace>> + <</link>> <</if>> - <<set $slaves[$slaveIndices[$subSlave.ID]] = $subSlave>> - <</replace>> -<</link>> -<</if>> <</if>> <br><<link "Assert your dominance">> <<EventNameDelink $activeSlave>> diff --git a/src/uncategorized/arcmgmt.tw b/src/uncategorized/arcmgmt.tw index edebd87d70bf2b8138bd307e5631bb87750b5128..ff9a3d4f0de0156575b06ecbb6a01e9b92a1be66 100644 --- a/src/uncategorized/arcmgmt.tw +++ b/src/uncategorized/arcmgmt.tw @@ -1108,7 +1108,7 @@ _SCD = Math.trunc(($upperClass * (2 + _slaveDemandU)) + ($topClass * (12 + _slav _enslaved += _intellectualDependencyEnslaved, $lowerClass += _LCImmigration>> @@.green;<<print _intellectualDependencyEnslaved>> dumb immigrants@@ were enslaved for their own good. - <<else>> + <<else>> <<set _LCImmigration = Math.trunc((_LCD - $lowerClass) * (0.3 * _terrain)) + 1, $lowerClass += _LCImmigration>> <</if>> diff --git a/src/uncategorized/buildingWidgets.tw b/src/uncategorized/buildingWidgets.tw index ad609ec1ca4fa716ce7983a97b15d7ac37226559..7ce4c1952801094d6bd209cf054ecf1513a8ba6f 100644 --- a/src/uncategorized/buildingWidgets.tw +++ b/src/uncategorized/buildingWidgets.tw @@ -56,43 +56,43 @@ Yes, I am aware this is horrible. If anyone can figure out how to get widgets to td#Farmyard { border-color: brown; } td#Nursery { border-color: deepskyblue; } - .arcology .penthouse { - display: inline-block; - } - .arcology .penthouse .info:before { content: "("; } - .arcology .penthouse .info:after { content: ")"; } - .arcology .penthouseWrapper { - display: inline-block; - } - .arcology.verticalLinks .penthouse{ - display:block; - } - .arcology.griddedLinks .penthouseWrapper { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - } - .arcology.griddedLinks .penthouse .info:before, - .arcology.griddedLinks .penthouse .info:after { - content: ""; - } - .arcology.griddedLinks .penthouse .info { - display: block; - line-height: 0.75; - margin-top: -0.2em; - margin-bottom: 0.2em; - } - .arcology.griddedLinks .penthouseWrapper .penthouse { - flex-grow: 1; - box-sizing: border-box; - justify-content: space-between; - } - .arcology.grid2 .penthouseWrapper .penthouse { - width: 45%; - } - .arcology.grid3 .penthouseWrapper .penthouse { - width: 30%; - } + .arcology .penthouse { + display: inline-block; + } + .arcology .penthouse .info:before { content: "("; } + .arcology .penthouse .info:after { content: ")"; } + .arcology .penthouseWrapper { + display: inline-block; + } + .arcology.verticalLinks .penthouse{ + display:block; + } + .arcology.griddedLinks .penthouseWrapper { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + } + .arcology.griddedLinks .penthouse .info:before, + .arcology.griddedLinks .penthouse .info:after { + content: ""; + } + .arcology.griddedLinks .penthouse .info { + display: block; + line-height: 0.75; + margin-top: -0.2em; + margin-bottom: 0.2em; + } + .arcology.griddedLinks .penthouseWrapper .penthouse { + flex-grow: 1; + box-sizing: border-box; + justify-content: space-between; + } + .arcology.grid2 .penthouseWrapper .penthouse { + width: 45%; + } + .arcology.grid3 .penthouseWrapper .penthouse { + width: 30%; + } </style> <<script>> @@ -176,77 +176,77 @@ if(!Macro.has('sectorblock')) { <center> <<set _arcologyTableClass = "arcology">> <<switch $verticalizeArcologyLinks>> - <<case 1>> - <<set _arcologyTableClass += " verticalLinks">> - <<case 2>> - <<set _arcologyTableClass += " griddedLinks grid2">> - <<case 3>> - <<set _arcologyTableClass += " griddedLinks grid3">> + <<case 1>> + <<set _arcologyTableClass += " verticalLinks">> + <<case 2>> + <<set _arcologyTableClass += " griddedLinks grid2">> + <<case 3>> + <<set _arcologyTableClass += " griddedLinks grid3">> <</switch>> <table @class="_arcologyTableClass"> <tr> /* Level 9, penthouse, sector 0 */ <td colspan="3"></td> <td id="Penthouse" colspan="4"> - <span class="penthouse"> - <<link "Penthouse">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Penthouse">><</link>> @@.cyan;[P]@@ - </span> - <div class="penthouseWrapper"> + <span class="penthouse"> + <<link "Penthouse">><<set $nextButton = "Back", $nextLink = _Pass>><<goto "Manage Penthouse">><</link>> @@.cyan;[P]@@ + </span> + <div class="penthouseWrapper"> <<if $masterSuite>> - <span class="penthouse masterSuite"> + <span class="penthouse masterSuite"> <span class="name"><<print MasterSuiteUIName()>></span><span class="info">$MastSiIDs.length/$masterSuite<<if $Concubine>>, C<</if>></span> - </span> + </span> <</if>> <<if $HGSuite>> - <span class="penthouse headGirlSuite"> + <span class="penthouse headGirlSuite"> <span class="name"><<print HeadGirlSuiteUIName()>></span><<if $HeadGirl != 0>><span class="info">HG<<if $HGSuiteiIDs.length > 0>>, 1<</if>></span><</if>> - </span> + </span> <</if>> <<if $dojo > 1>> - <span class="penthouse armory"> + <span class="penthouse armory"> <span class="name">[[Armory|BG Select]]</span><<if $Bodyguard != 0>> <span class="info">BG</span><</if>> - </span> + </span> <</if>> <<if $servantsQuarters>> - <span class="penthouse servantsQuarters"> + <span class="penthouse servantsQuarters"> <span class="name"><<print ServantQuartersUIName()>></span><span class="info">$ServQiIDs.length/$servantsQuarters<<if $Stewardess>>, L<</if>></span> - </span> + </span> <</if>> <<if $spa>> - <span class="penthouse spa"> + <span class="penthouse spa"> <span class="name"><<print SpaUIName()>></span><span class="info">$SpaiIDs.length/$spa<<if $Attendant>>, L<</if>></span> - </span> + </span> <</if>> <<if $nursery>> - <span class="penthouse nursery"> + <span class="penthouse nursery"> <span class="name"><<print NurseryUIName()>></span><span class="info"><<= numberWithPluralOne($nursery-$nurseryBabies, "empty room")>>, $NurseryiIDs.length/$nurseryNannies<<if $Matron>>, L<</if>></span> <<if $readyChildren > 0>>@@.yellow;[!]@@<</if>> - </span> + </span> <</if>> <<if $clinic>> - <span class="penthouse clinic"> + <span class="penthouse clinic"> <span class="name"><<print ClinicUIName()>></span><span class="info">$CliniciIDs.length/$clinic<<if $Nurse>>, L<</if>></span> - </span> + </span> <</if>> <<if $schoolroom>> - <span class="penthouse schoolroom"> + <span class="penthouse schoolroom"> <span class="name"><<print SchoolRoomUIName()>></span><span class="info">$SchlRiIDs.length/$schoolroom<<if $Schoolteacher>>, L<</if>></span> - </span> + </span> <</if>> <<if $cellblock>> - <span class="penthouse cellblock"> + <span class="penthouse cellblock"> <span class="name"><<print CellblockUIName()>></span><span class="info">$CellBiIDs.length/$cellblock<<if $Wardeness>>, L<</if>></span> - </span> + </span> <</if>> <<if $incubator>> - <span class="penthouse incubator"> + <span class="penthouse incubator"> <span class="name"><<print IncubatorUIName()>></span><span class="info"><<=numberWithPluralOne($incubator-$tanks.length, "empty tank")>></span> <<if $readySlaves > 0>>@@.yellow;[!]@@<</if>> - </span> + </span> <</if>> <<if $researchLab.level > 0>> - <span class="penthouse researchLab"> + <span class="penthouse researchLab"> <span class="name">[[Prosthetic Lab]]</span> - </span> + </span> <</if>> - </div> + </div> </td> <td colspan="3"></td> </tr> diff --git a/src/uncategorized/findSlave.tw b/src/uncategorized/findSlave.tw index 991d56cb61dea865aa93a15d36472e3396e5e589..e61fae8de3c45bc1ef640553f4193ed36566e61f 100644 --- a/src/uncategorized/findSlave.tw +++ b/src/uncategorized/findSlave.tw @@ -4,29 +4,29 @@ After spending a minute trying to remember some details about one of your slaves, you sit down behind your desk and tell $assistantName that you need to locate a particular slave's records.<br><br> -"Certainly, <<= properMaster()>>. What can you tell me about them?"<br><br> +"Certainly, <<= properMaster()>>. What can you tell me about them?"<br><br> "They're called something like: <<textbox "_nameSearch" "" autofocus>> <<link "Locate">> - <<script>>$('#slaveList').empty().append(App.FindSlave.searchByName(State.temporary.nameSearch));<</script>> + <<script>>$('#slaveList').empty().append(App.FindSlave.searchByName(State.temporary.nameSearch));<</script>> <</link>> <br>//(Enter a fragment of their nickname, name, surname, birth name, or birth surname)//<br><br> "In the past, they were: <<textbox "_backgroundSearch" "">> <<link "Locate">> - <<script>>$('#slaveList').empty().append(App.FindSlave.searchByBackground(State.temporary.backgroundSearch));<</script>> + <<script>>$('#slaveList').empty().append(App.FindSlave.searchByBackground(State.temporary.backgroundSearch));<</script>> <</link>> <br>//(Enter a fragment of their origin or past job, for example, "shelter" or "lawyer")//<br><br> "Their data should meet this condition: <<textbox "_dataSearch" "">> <<link "Locate">> - <<script>>$('#slaveList').empty().append(App.FindSlave.searchByExpression(State.temporary.dataSearch));<</script>> + <<script>>$('#slaveList').empty().append(App.FindSlave.searchByExpression(State.temporary.dataSearch));<</script>> <</link>> <br>//(Enter a conditional expression which evaluates to true for the slave you want to find, such as "slave.physicalAge >= 18 && slave.physicalAge < 21")// <br><br> <span id="slaveList"> - /* results list gets populated here by jQuery */ + /* results list gets populated here by jQuery */ </span> diff --git a/src/uncategorized/newSlaveIntro.tw b/src/uncategorized/newSlaveIntro.tw index 4da2e2e5bfd87d6055326a0f8672305d05611384..f70c859d19e07a14f0b16a8cfef8eab3af0fc2d4 100644 --- a/src/uncategorized/newSlaveIntro.tw +++ b/src/uncategorized/newSlaveIntro.tw @@ -218,7 +218,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<set $activeSlave.devotion += 10>> <<set $activeSlave.trust += 10>> <<else>> - Seeing that you're a fellow futanari, $he's @@.mediumaquamarine;relieved@@ that $he's going to be your slave, not to mention @@.hotpink;quite eager@@ to have sex with you. + <<if canSee($activeSlave)>>Seeing<<else>>Learning<</if>> that you're a fellow futanari, $he's @@.mediumaquamarine;relieved@@ that $he's going to be your slave, not to mention @@.hotpink;quite eager@@ to have sex with you. <<set $activeSlave.devotion += 5>> <<set $activeSlave.trust += 5>> <</if>> @@ -308,7 +308,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<if $PC.boobs >= 1400>> <<if $activeSlave.fetish == "boobs">> <<if $activeSlave.fetishKnown == 0>> - $He keeps stealing glances at your huge rack<<if canAchieveErection($activeSlave)>>, $his dick rapidly hardening<</if>>. You stretch, giving $him a fantastic view of your breasts, before circling around behind $him and cupping $his chest. Between your tits against $his back, and how teasingly big you are pretending $his breasts will be, $he can't contain $himself; $he cums from overstimulation, completely pinning $him @@.green;as a breast fetishist!@@ + $He keeps stealing glances at your huge rack<<if canAchieveErection($activeSlave)>>, $his dick rapidly hardening<</if>>. You stretch<<if canSee($activeSlave)>>, giving $him a fantastic view of your breasts,<</if>> before circling around behind $him and cupping $his chest. Between your tits against $his back, and how teasingly big you are pretending $his breasts will be, $he can't contain $himself; $he cums from overstimulation, completely pinning $him @@.green;as a breast fetishist!@@ <<set $activeSlave.fetishKnown = 1>> <<else>> $He keeps stealing glances at your huge rack<<if canAchieveErection($activeSlave)>>, $his dick rapidly hardening<</if>>. As you inspect $him, you take care to keep "accidentally" bumping $him with your tits, before "tripping" and landing with $his face buried in your chest. $He is practically bursting with lust by the end and @@.hotpink;eager to please you@@ so $he can be close to those boobs. @@ -346,11 +346,11 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<set $activeSlave.devotion -= 10>> <<set $activeSlave.trust += 10>> <<elseif ($PC.career == "servant")>> - Seeing you in your <<if $PC.title == 0>>maid's dress<<else>>maid's outfit<</if>> @@.mediumaquamarine;calms $his fears;@@ however, $he is unwilling to @@.mediumorchid;listen to a servant.@@ + <<if canSee($activeSlave)>>Seeing<<else>>Having<</if>> you in your <<if $PC.title == 0>>maid's dress<<else>>maid's outfit<</if>> @@.mediumaquamarine;calms $his fears;@@ however, $he is unwilling to @@.mediumorchid;listen to a servant.@@ <<set $activeSlave.devotion -= 3>> <<set $activeSlave.trust += 10>> <<elseif ($PC.career == "gang")>> - $He recognizes you from various crime reports @@.gold;filling $him with fear@@ over what life under you will be like. + $He recognizes you from various crime reports, @@.gold;filling $him with fear@@ over what life under you will be like. <<set $activeSlave.trust -= 10>> <</if>> @@ -855,7 +855,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<if canDoAnal($activeSlave)>> | <<link "Put $him in $his place">> <<replace "#introResult">> - You stand up and tell $him to strip. $He hesitates, staring at you in dawning apprehension, until $he sees that you're stepping into a strap-on. $He unconsciously takes a step backward, but that's as far as $he gets before you cover the ground between you, grab $him by the throat, and push $his back until $he falls onto the couch. You drag the head of the fake phallus down over $his pussylips, and $he shivers, but you keep going, telling $him that you'll only be fucking $him there when $he's good. When $he's bad, you'll assfuck $him. $His eyes fly open and $he tries to struggle, but you give $him a warning slap and then push yourself home. $He starts to cry, more from hopelessness than anal pain, knowing that @@.mediumorchid;you're a slaveowner like any other,@@ more likely to @@.gold;abuse $him@@ than be sympathetic. + You stand up and tell $him to strip. $He hesitates, staring at you in dawning apprehension, until $he <<if canSee($activeSlave)>>sees<<else>>realizes<</if>> that you're stepping into a strap-on. $He unconsciously takes a step backward, but that's as far as $he gets before you cover the ground between you, grab $him by the throat, and push $his back until $he falls onto the couch. You drag the head of the fake phallus down over $his pussylips, and $he shivers, but you keep going, telling $him that you'll only be fucking $him there when $he's good. When $he's bad, you'll assfuck $him. $His eyes fly open and $he tries to struggle, but you give $him a warning slap and then push yourself home. $He starts to cry, more from hopelessness than anal pain, knowing that @@.mediumorchid;you're a slaveowner like any other,@@ more likely to @@.gold;abuse $him@@ than be sympathetic. <</replace>> <<set $activeSlave.devotion -= 5>> <<set $activeSlave.trust -= 5>> @@ -1342,7 +1342,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <br> <<link "Threaten $his pregnancy">> <<replace "#introResult">> - You place an innocuous-looking drug injector on your desk, and let $him <<if !canSee($activeSlave)>>blindly <</if>>stare at it for a long moment. Then, you roll the cylinder slowly across the smooth surface, rotating it until its label comes into $his view. It depicts the silhouette of a pregnant woman, with a red "X" over it. Abortifacients. After an <<if !canSee($activeSlave)>>short period<<else>>instant<</if>> of horrified comprehension, $he flings $himself at your feet, crying, begging, promising. $He pledges to @@.hotpink;submit to you,@@ <<if $PC.dick != 0>><<if $PC.vagina != -1>>eat you out, <</if>>suck your cock, take it in $his pussy, take it up $his ass<<else>>eat you out, worship you with $his pussy, serve you with $his ass<</if>>, anything, as long as @@.gold;you don't hurt $his baby.@@ You observe that $he'll do all of those things, regardless of what you decide to do about $his pregnancy, but for now, you'll keep $him as a pregnant slut. $He thanks you through $his tears. + You place an innocuous-looking drug injector on your desk, and let $him <<if !canSee($activeSlave)>>blindly <</if>>stare at it for a long moment. Then, you roll the cylinder slowly across the smooth surface, rotating it until its label comes into <<if canSee($activeSlave)>>$his<<else>>your<</if>> view. It depicts the silhouette of a pregnant woman, with a red "X" over it. Abortifacients. After an <<if !canSee($activeSlave)>>short period<<else>>instant<</if>> of horrified comprehension, $he flings $himself at your feet, crying, begging, promising. $He pledges to @@.hotpink;submit to you,@@ <<if $PC.dick != 0>><<if $PC.vagina != -1>>eat you out, <</if>>suck your cock, take it in $his pussy, take it up $his ass<<else>>eat you out, worship you with $his pussy, serve you with $his ass<</if>>, anything, as long as @@.gold;you don't hurt $his baby.@@ You observe that $he'll do all of those things, regardless of what you decide to do about $his pregnancy, but for now, you'll keep $him as a pregnant slut. $He thanks you through $his tears. <</replace>> <<set $activeSlave.devotion += 10>> <<set $activeSlave.trust -= 10>> @@ -1928,7 +1928,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <br> <<link "Let your ample bust dominate $his pathetic one">> <<replace "#introResult">> - You quickly strip off your shirt and draw close to $activeSlave.slaveName. You grab $him as $he attempts to back away and pull $his tits directly into your own. Both of sets of <<if canSee($activeSlave)>>eyes lock onto their pair of breasts<<else>>tits push out against each other<</if>>, or they would have, had yours not utterly eclipsed their rival. Scoffing, you release the confused $girl and walk away; leaving $him cupping $his own breasts and feeling uncertain about $himself. $He gets caught up in how small they really are, and how much @@.hotpink;lesser@@ than $his <<= WrittenMaster($activeSlave)>> $he is. + You quickly strip off your shirt and draw close to $activeSlave.slaveName. You grab $him as $he attempts to back away and pull $his tits directly into your own. Both sets of <<if canSee($activeSlave)>>eyes lock onto their pair of breasts<<else>>tits push out against each other<</if>>, or they would have, had yours not utterly eclipsed their rival. Scoffing, you release the confused $girl and walk away; leaving $him cupping $his own breasts and feeling uncertain about $himself. $He gets caught up in how small they really are, and how much @@.hotpink;lesser@@ than $his <<= WrittenMaster($activeSlave)>> $he is. <<if $activeSlave.fetish == "boobs">> <<if $activeSlave.fetishKnown == 0>> You did note one thing when your breasts touched: $his nipples <<if $activeSlave.nipples == "fuckable">>tightened around yours<<else>>got very hard<</if>>. @@.green;Looks like $he's a breast fetishist!@@ @@ -2189,7 +2189,15 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<link "Threaten $him with the Industrial Dairy">> <<setNonlocalPronouns $seeDicks>> <<replace "#introResult">> - You tell $him that it's in $his interests to be a good $girl. $He does not react immediately, perhaps wondering if you think such a trite statement will have a real impact, but then you point at a wallscreen behind $him. $He turns, and beholds a live feed from the Industrial Dairy. $He gazes spellbound at the interleaved row of bodies intertwined with machines in embraces far more intimate than any lover could hope to match. The gently heaving masses of breastflesh hold $his fascinated and horrified attention until one of the machines fortuitously chooses this moment to cycle its occupant's anal hydration regimen. It withdraws its horse-sized phallus from the slave's anus, leaving _hisU gape pulsing gently as it awaits the resumption of the endless assrape. $activeSlave.slaveName lets out a huge sob and turns to you, @@.gold;fear suffusing $him@@ as $he promises to @@.hotpink;be a good $girl.@@ + You tell $him that it's in $his interests to be a good $girl. $He does not react immediately, perhaps wondering if you think such a trite statement will have a real impact, but then you <<if canSee($activeSlave)>>point at<<else>>direct $him towards<</if>> a wallscreen behind $him. $He turns, and beholds a live feed from the Industrial Dairy. + <<if canSee($activeSlave)>> + $He gazes spellbound at the interleaved row of bodies intertwined with machines in embraces far more intimate than any lover could hope to match. The gently heaving masses of breastflesh hold $his fascinated and horrified attention until one of the machines fortuitously chooses this moment to cycle its occupant's anal hydration regimen. + <<elseif canHear($activeSlave)>> + $He listens entranced by the steady rhythm of the machines collecting their occupants' bodily fluids. The muffled moans and groans of the restrained slaves hold $his fascinated and horrified attention until one of the machines fortuitously chooses this moment to cycle its occupant's anal hydration regimen. + <<else>> + Such a broadcast would normally be pointless for a senseless slave like $activeSlave.slaveName, but you've taken precautions to accommodate such slaves. The wallscreen is connected to the heating, air conditioning, and sprinkler systems in order to accurately replicate the aura of an industrial slave dairy, so $he is fully immersed in the scene when one of the machines fortuitously chooses this moment to cycle its occupant's anal hydration regimen. + <</if>> + It withdraws its horse-sized phallus from the slave's anus, leaving _hisU gape pulsing gently as it awaits the resumption of the endless assrape. $activeSlave.slaveName lets out a huge sob and turns to you, @@.gold;fear suffusing $him@@ as $he promises to @@.hotpink;be a good $girl.@@ <</replace>> <<set $activeSlave.devotion += 10>> <<set $activeSlave.trust -= 10>> @@ -2245,7 +2253,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << You stroke $his gurgling stomach slowly, before turning off the valve, unfastening $his binds and leaving your @@.hotpink;very pleased@@ cum balloon to savor $his meal. You'll make sure to set aside enough cum from your cumslaves for $him to drink $himself stupid with, and, glancing over your shoulder, find $him eagerly masturbating to $his cum filled gut. $He'll probably intend to keep $himself filled to the brim, which is fine by you. <<set $activeSlave.devotion += 5>> <<else>> - <<if $activeSlave.eyes <= -2>>$His face swells<<else>>$His eyes swell<</if>> with horror, but $he does not flinch or make a sound. $His belly also swells, from a few months of apparent pregnancy, to "spent too much time at the buffet", till it finally stops wobbling, grows taut and forces $his belly button into an outie. Satisfied, you shut off the valve, deciding to leave $him to consider $his cum filled middle. Time passes. $His <<if $activeSlave.eyes <= -2>>blind face is distant<<else>>eyes are glazed over<</if>>, but $he tolerates you slowly stroking $his stomach @@.hotpink;without apparent resentment.@@ You'll make sure to keep $him like this for the time being. + <<if $activeSlave.eyes <= -2>>$His face swells<<else>>$His eyes swell<</if>> with horror, but $he does not flinch or make a sound. $His belly also swells, from a few months of apparent pregnancy, to 'spent too much time at the buffet', till it finally stops wobbling, grows taut and forces $his belly button into an outie. Satisfied, you shut off the valve, deciding to leave $him to consider $his cum filled middle. Time passes. $His <<if $activeSlave.eyes <= -2>>blind face is distant<<else>>eyes are glazed over<</if>>, but $he tolerates you slowly stroking $his stomach @@.hotpink;without apparent resentment.@@ You'll make sure to keep $him like this for the time being. <<set $activeSlave.devotion += 4>> <</if>> <<else>> @@ -2276,7 +2284,7 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <br><br> You pause to examine the tap, making sure it is set to milk, before releasing the valve and unleashing a steady flow. The feeder bucks against $his face as creamy, white liquid rushes downward towards the helpless slave. <<if $activeSlave.behavioralFlaw == "gluttonous">> - <<if $activeSlave.eyes <= -2>>$His face swells<<else>>$His eyes swell<</if>> with horror, but $he does not flinch or make a sound. $His belly also swells, from a few months of apparent pregnancy, to "spent too much time at the buffet", till it finally stops wobbling, grows taut and forces $his belly button into an outie. Satisfied, you shut off the valve, deciding to leave $him to consider $his milk filled middle. Time passes. $His<<if $activeSlave.eyes <= -2>> blind face is distant<<else>> eyes are glazed over<</if>>, but $he tolerates you slowly stroking $his stomach @@.hotpink;without apparent resentment.@@ You'll make sure to keep $him like this for the time being. + <<if $activeSlave.eyes <= -2>>$His face swells<<else>>$His eyes swell<</if>> with horror, but $he does not flinch or make a sound. $His belly also swells, from a few months of apparent pregnancy, to 'spent too much time at the buffet', till it finally stops wobbling, grows taut and forces $his belly button into an outie. Satisfied, you shut off the valve, deciding to leave $him to consider $his milk filled middle. Time passes. $His<<if $activeSlave.eyes <= -2>> blind face is distant<<else>> eyes are glazed over<</if>>, but $he tolerates you slowly stroking $his stomach @@.hotpink;without apparent resentment.@@ You'll make sure to keep $him like this for the time being. <<set $activeSlave.devotion += 5>> <<else>> $He gasps in horror, and starts to struggle frantically against $his bonds, <<if $activeSlave.voice != 0>>struggling to scream in panic.<<else>>$his whole body begging to scream.<</if>> However, as the fluid reaches $him, $he seems to despair and resigns $himself to $his fate. As $his belly swells, you find yourself comparing $him first to a binge eater, then some of the chubbier citizens you've seen, a large pregnancy, and finally a water balloon ready to burst. You stop the flow, and rest a hand on $his heaving stomach. $His @@.gold;terrified@@ breathing and distant expression are clearly due to the pain, not lust, but it's also now quite clear to $him who is in charge here. You have little intent on letting $his stomach empty and will be setting aside enough milk to keep $him bloated into submission. @@ -2295,7 +2303,15 @@ The legalities completed, ''__@@.pink;<<= SlaveFullName($activeSlave)>>@@__'' << <<link "Threaten $him with the Arcade">> <<setNonlocalPronouns $seeDicks>> <<replace "#introResult">> - You tell $him that it's in $his best interests to be a good $girl. $He does not react immediately, perhaps wondering if you think such a trite statement will have a real impact, but then you point at a wallscreen behind $him. $He turns, and beholds a live feed from $arcadeName. $He gazes at the row of butts sticking out of the wall at dick height, not quite realizing what $he's seeing. Then $he notices that there are citizens pumping away in front of two of the butts, and $he understands. As $he watches, terrified, first one citizen and then the other finishes and steps away. The first arcade inmate's <<if $seeDicks != 100>>pussy<<else>>butt<</if>> is left looking sore until $arcadeName's systems cover _himU for a quick cleaning, and the second inmate's asshole <<if $seeDicks != 0>>has obviously seen severe use, since the poor _girlU doesn't have a pussy to spread the load<<else>>is loose enough that the machines have to clean up the cum it drools onto the floor<</if>>. $activeSlave.slaveName lets out a huge sob and turns to you, @@.gold;fear suffusing $him@@ as $he promises to @@.hotpink;be a good $girl.@@ + You tell $him that it's in $his best interests to be a good $girl. $He does not react immediately, perhaps wondering if you think such a trite statement will have a real impact, but then you <<if canSee($activeSlave)>>point at<<else>>direct $him towards<</if>> a wallscreen behind $him. $He turns, and beholds a live feed from $arcadeName. + <<if canSee($activeSlave)>> + $He gazes at the row of butts sticking out of the wall at dick height, not quite realizing what $he's seeing. Then $he notices that there are citizens pumping away in front of two of the butts, and $he understands. + <<elseif canHear($activeSlave)>> + $He listens to the wet sounds of flesh on flesh, not quite realizing what $he's hearing. Then $he picks out the sound of your citizens grunting and moaning as they pound away, and $he understands. + <<else>> + Such a broadcast would normally be pointless for a senseless slave like $activeSlave.slaveName, but you've taken precautions to accommodate such slaves. The wallscreen is connected to the heating, air conditioning, and sprinkler systems in order to accurately replicate the feeling of standing in front of a row of restrained public sex slaves, so the meaning of the scene in front of $him is not lost. + <</if>> + As $he <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>stands there<</if>>, terrified, first one citizen and then the other finishes and steps away. The first arcade inmate's <<if $seeDicks != 100>>pussy<<else>>butt<</if>> is left looking sore until $arcadeName's systems cover _himU for a quick cleaning, and the second inmate's asshole <<if $seeDicks != 0>>has obviously seen severe use, since the poor _girlU doesn't have a pussy to spread the load<<else>>is loose enough that the machines have to clean up the cum it drools onto the floor<</if>>. $activeSlave.slaveName lets out a huge sob and turns to you, @@.gold;fear suffusing $him@@ as $he promises to @@.hotpink;be a good $girl.@@ <</replace>> <<set $activeSlave.devotion += 10>> <<set $activeSlave.trust -= 10>> diff --git a/src/uncategorized/pHostageAcquisition.tw b/src/uncategorized/pHostageAcquisition.tw index a5de5f44f8edb121f27c195fb04123ae0fa95a9f..ba79a11e8554bbcd2e7bce899d422202951e5bd1 100644 --- a/src/uncategorized/pHostageAcquisition.tw +++ b/src/uncategorized/pHostageAcquisition.tw @@ -189,7 +189,7 @@ Your hired mercenaries are en route now with your precious cargo. <<elseif $rivalryDuration <= 10>> Upon seeing you, $activeSlave.slaveName gingerly approaches, uncertain if $he should. You pull $him into your <<if $PC.boobs >= 650>>ample bust<<else>>chest<</if>> as $he breaks down in tears. "They broke my butthole!" $He's exactly as you remember, minus $his loose rear. <<elseif $rivalryDuration <= 15>> - Upon seeing you, $activeSlave.slaveName shifts $his weight back and forth, unsure of what to make of you. As you step forward, $he hesitatingly approaches. Once $he is close enough $he says "Do you want to fuck my butt?<<if $seeDicks != 0>> Maybe touch my peni<<s>>?<</if>>" While $he looks the same as you remember, minus $his very loose butthole<<if $seeDicks != 0>> and miniscule dick<</if>>, $he certainly doesn't think the same anymore. + Upon seeing you, $activeSlave.slaveName shifts $his weight back and forth, unsure of what to make of you. As you step forward, $he hesitatingly approaches. Once $he is close enough $he says "Do you want to fuck my butt?<<if $seeDicks != 0>> Maybe touch my peni<<s>>?<</if>>" While $he looks the same as you remember, minus $his very loose butthole<<if $seeDicks != 0>> and minuscule dick<</if>>, $he certainly doesn't think the same anymore. <<elseif $rivalryDuration <= 20>> <<set $activeSlave.trust = 60>> Upon seeing you, $activeSlave.slaveName shifts $his weight back and forth, unsure of what to make of you. As you step forward, $he quickly steps back. After several steps, $he bluntly says "Pi<<ss>> off vagina fucker, <<s>>lave<<s>>' a<<ss>>e<<s>> are for pounding!" before swinging around revealing $his gaping butthole. While $he looks the same as you remember, minus $his gaping anus<<if $seeDicks != 0>>, tiny cock, and testicles<</if>>, $he definitely doesn't think the same anymore. diff --git a/src/uncategorized/pRivalryActions.tw b/src/uncategorized/pRivalryActions.tw index cd662d6e4ef45c1d468cd63f6a5ba75c66e2fe3b..e7e0be82389a7e727685fbe6d3036d87e1438d89 100644 --- a/src/uncategorized/pRivalryActions.tw +++ b/src/uncategorized/pRivalryActions.tw @@ -14,6 +14,7 @@ /* 000-250-006 */ <<setLocalPronouns $hostage>> + <<run Enunciate($hostage)>> <</if>> <<setAssistantPronouns>> @@ -607,7 +608,7 @@ Your inter-arcology war with the arcology owner behind the Daughters of Liberty <<set $hostage.hLength += 7>> <<set $hostage.fetish = "humiliation">> <<set $hostage.fetishStrength = 10>> - uncontrollably masturbating as $he stuggles to stay coherent. "I need it... I can't stop... Need more..." $He orgasms in full view of the camera and passes out. + uncontrollably masturbating as $he struggles to stay coherent. "I need it... I can't <<s>>top... Need more..." $He orgasms in full view of the camera and passes out. <<case "Petite Admiration">> <<set $hostage.trust -= 5>> <<set $hostage.devotion -= 5>> @@ -625,7 +626,7 @@ Your inter-arcology war with the arcology owner behind the Daughters of Liberty <<set $hostage.counter.anal += 7>> <<set $hostage.fetish = "dom">> <<set $hostage.fetishStrength = 10>> - blushing as $he thinks about possibly dominating $his miniscule harasser. + blushing as $he thinks about possibly dominating $his minuscule harasser. <<default>> <<set $hostage.trust -= 5>> <<set $hostage.devotion -= 5>> @@ -1330,7 +1331,7 @@ Your inter-arcology war with the arcology owner behind the Daughters of Liberty <<set $hostage.pregWeek = 8>> <<set WombImpregnate($hostage, $hostage.pregType, 0, $hostage.preg)>> <<run SetBellySize($hostage)>> - A very pregnant slut pokes at the curve of $his belly and declares $him preggo, to which $he waves it off as 'obviously having sucked too much dick'. + A very pregnant slut pokes at the curve of $his belly and declares $him preggo, to which $he waves it off as "obviou<<s>>ly having <<s>>ucked too much dick". <</if>> <<case "Petite Admiration">> <<set $hostage.trust -= 5>> @@ -1597,7 +1598,7 @@ Your inter-arcology war with the arcology owner behind the Daughters of Liberty <<set $hostage.skill.anal = 100>> <<set $hostage.skill.vaginal = 100>> <<set $hostage.skill.whoring = 100>> - sealing a business deal for $his owner. Buy the end of the meeting, the client is thoroughly exhuasted from $his skill 'negotiations' and eager to listen to the terms entrusted to $him. + sealing a business deal for $his owner. Buy the end of the meeting, the client is thoroughly exhausted from $his skill 'negotiations' and eager to listen to the terms entrusted to $him. <<case "Slave Professionalism">> <<set $hostage.intelligenceImplant = 0>> <<set $hostage.intelligence = -100>> @@ -2950,7 +2951,7 @@ Your inter-arcology war with the arcology owner behind the Daughters of Liberty <<set $hostage.pregWeek++>> <<run SetBellySize($hostage)>> <</if>> - <<set _hostageAction.push("taking as many dicks as $he canthink of; one in the mouth, two in each hole, and another in each hand.")>> + <<set _hostageAction.push("taking as many dicks as $he can think of: one in the mouth, two in <<if $hostage.vagina > -1>>each<<else>>$his<</if>> hole, and another in each hand.")>> <<set _hostageAction.push("pushing on a sliding door, begging to be let out.")>> <<set _hostageAction.push("checking out $his reflection in a window, blissfully unaware of the show $he is giving to street below.")>> <</if>> diff --git a/src/uncategorized/persBusiness.tw b/src/uncategorized/persBusiness.tw index 1b5432153347a9c3fc5d4551632a82dad5d063e1..c54d799f36d83737603cf14c8742356e03b60c4c 100644 --- a/src/uncategorized/persBusiness.tw +++ b/src/uncategorized/persBusiness.tw @@ -93,9 +93,9 @@ <<set $enduringRep *= .5>> <<elseif ($personalAttention == "upkeep")>> <<if $PC.belly >= 5000>> - You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 20%. Your pregnancy slows you down some, but you're used to working around it. + You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 20%. Your <<if $PC.preg > 0>>pregnancy<<else>>big belly<</if>> slows you down some<<if $PC.counter.birthMaster > 0>>, but you're used to working around it<</if>>. <<else>> - You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 25%. <<if $PC.counter.birthMaster > 0>>This is much easier to do without a big baby bump in the way.<</if>> + You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 25%.<<if $PC.counter.birthMaster > 0>> This is much easier to do without a big baby bump in the way.<</if>> <</if>> <<elseif ($personalAttention == "proclamation")>> /* handled after this if chain */ @@ -407,7 +407,7 @@ <</if>> <<set $SecExp.proclamation.cooldown = 4, $personalAttention = "business">> <<else>> - As you currently lack the minimum amount of your chosen proclamation currency, $SecExp.proclamation.currency, it woudld be unwise to attempt execution of your $SecExp.proclamation.type this week. + As you currently lack the minimum amount of your chosen proclamation currency, $SecExp.proclamation.currency, it would be unwise to attempt execution of your $SecExp.proclamation.type this week. <</if>> <</if>> diff --git a/src/uncategorized/reFSAcquisition.tw b/src/uncategorized/reFSAcquisition.tw index 6e783aedc02e45f8fc688d54b4021dc0dbfab5a4..b029be5062ed722c04dde13ae03d396ca06810aa 100644 --- a/src/uncategorized/reFSAcquisition.tw +++ b/src/uncategorized/reFSAcquisition.tw @@ -1564,7 +1564,7 @@ The call comes in from an office, and you suppress the urge to check whether $as <<case "Paternalist Two">> $He speaks to you as a free $woman throughout the enslavement process, but as soon as it is completed, $he stops and waits for instruction before talking. $He may not have had many prospects in $his life back home, but if $he remains this obedient $he'll fit right in here in the Free Cities. <<case "Degradationist">> - When $he arrives as part of the anonymous slave transfers that make up a good part of the inter-arcology commerce, $he has clearly had some time to mull over $his situation. As soon as $he sees you, $he blurts out, "Whatever that fucker told you, it isn't true. I'll be your little bitch bimbo, whatever you want. Ju<<s>>t don't — ju<<s>>t don't fucking hurt me." $He sticks out $his chest in a clear attempt to entice you with $his fake tits. + When $he arrives as part of the anonymous slave transfers that make up a good part of the inter-arcology commerce, $he has clearly had some time to mull over $his situation. As soon as $he sees you, $he blurts out, "Whatever that fucker told you, it i<<s>>n't true. I'll be your little bitch bimbo, whatever you want. Ju<<s>>t don't — ju<<s>>t don't fucking hurt me." $He sticks out $his chest in a clear attempt to entice you with $his fake tits. <<case "Degradationist Two">> When $he arrives as part of the anonymous slave transfers that make up a good part of the inter-arcology commerce, $he has clearly had some time to mull over $his situation. As soon as $he sees you, $he glares deep into your eyes and addresses you directly, "Tho<<s>>e fucker<<s>> threw everything they could at me; you can't break me. No one can." <<case "Intellectual Dependency">> @@ -1617,7 +1617,7 @@ The call comes in from an office, and you suppress the urge to check whether $as <<case "Chattel Religionist Two">> You complete the legalities and a clearly improvised VTOL craft arrives at $arcologies[0].name, broadcasting an erratic array of IFF codes. It seems this group hasn't quite mastered the intricacies of air travel. The aircraft doesn't seem capable of the delicate feat of landing on the pad it had been directed to: it simply hovers <<if $showInches == 2>>six feet<<else>>two meters<</if>> off the pad for the five seconds it takes to shove a canvas bag that obviously contains a struggling human form out of the side door. The condemned prays tirelessly throughout the biometric scanning process, utterly shocked and disgusted by what they've witnessed in just the few minutes they've been in your arcology. Then it's off to the penthouse for basic slave induction. <<case "Roman Revivalist">> - $He arrives wide-eyed and enthusiastic about the historical style $he saw on the way in. $He swallows nervously throughout the enslavement process and even cries a little at the end. $He's slow to undress, and when $he's finished, $he covers $his modest breasts with one arm and $his mons with the other. It seems that $he's about to have a rude awakening about the realities of being a house slave. + $He arrives wide-eyed and enthusiastic about the historical style $he <<if canSee($activeSlave)>>saw<<elseif canHear($activeSlave)>>heard<<else>>felt<</if>> on the way in. $He swallows nervously throughout the enslavement process and even cries a little at the end. $He's slow to undress, and when $he's finished, $he covers $his modest breasts with one arm and $his mons with the other. It seems that $he's about to have a rude awakening about the realities of being a house slave. <<case "Aztec Revivalist">> $He arrives awestruck by <<if canSee($activeSlave)>>all the sights<<else>>everything<</if>> $he passed through to get to your abode. $He probably didn't see anything too extreme, but $he will soon. Feeling your gaze on $his body, $he quickly abandons all fears from $his past life, strips off $his clothes, and submits to you fully. Only time will tell if $he made a mistake. <<case "Edo Revivalist">> diff --git a/src/uncategorized/reShelterInspection.tw b/src/uncategorized/reShelterInspection.tw index a822feebf94b9a1a930ab25a51eba72dc1ead4d3..21b3b0ed78be60412593b800d858dc12b319fdbc 100644 --- a/src/uncategorized/reShelterInspection.tw +++ b/src/uncategorized/reShelterInspection.tw @@ -309,7 +309,7 @@ Not waiting to be greeted, the inspector looks up at the nearest camera and dema "And the<<s>>e work too, right?" _he2 asks as _he2 points to $his dangling balls. "<<S>>o <<he>> ha<<s>> been fully re<<s>>tored; that'<<s>> <<s>>omething." The inspector adds another positive note to the inspection. <<set _inspectionResult-->> <<else>> - "I take it the<<s>>e testicle<<s>> are more than ju<<s>>t an implant? I'm <<s>>ure <<he>> appre<<c>>iate<<s>> the ge<<s>>ture, though what good are they without a peni<<s>>?" The inspector shakes _his2 head and notes your attempt to undo the damages to _Inspectee.slaveName. + "I take it the<<s>>e te<<s>>ticle<<s>> are more than ju<<s>>t an implant? I'm <<s>>ure <<he>> appre<<c>>iate<<s>> the ge<<s>>ture, though what good are they without a peni<<s>>?" The inspector shakes _his2 head and notes your attempt to undo the damages to _Inspectee.slaveName. <</if>> <</if>> diff --git a/src/uncategorized/remMerger.tw b/src/uncategorized/remMerger.tw index 1b8d080f8d0891be945ce7dc557d5754167523f7..e2c71a9aab351ad1cde21356c3c1583f8309c661 100644 --- a/src/uncategorized/remMerger.tw +++ b/src/uncategorized/remMerger.tw @@ -4,15 +4,15 @@ <<set $nextLink = "RIE Eligibility Check">> <<set _slaveCompany = App.Corporate.divisionList - .filter(div => div.founded && div.hasMergers) - .map (div => div.mergerChoices.map((merger, index) => ({merger, index, division:div}))) - .flat ()>> + .filter(div => div.founded && div.hasMergers) + .map (div => div.mergerChoices.map((merger, index) => ({merger, index, division:div}))) + .flat ()>> <<set _maxCompanies = Math.trunc(Math.log2(App.Corporate.divisionList.filter(div => div.founded).length)) + 1>> <<set _numCompanies = random(1, _maxCompanies)>> <<set _companies = []>> <<for _index = 0; _index < _numCompanies; ++_index>> - <<run _companies.push(_slaveCompany.pluck())>> + <<run _companies.push(_slaveCompany.pluck())>> <</for>> <<set _assistant = $assistantName>> @@ -21,43 +21,43 @@ <<if _companies.length == 1>> - <<set _company = _companies[0]>> - <div class="majorText">This week you come across <<= _company.merger.text.trouble >></div> + <<set _company = _companies[0]>> + <div class="majorText">This week you come across <<= _company.merger.text.trouble >></div> <<else>> - <<for _index, _company range _companies>> - <div class="majorText">The <<= ordinalSuffixWords(_index + 1)>> is <<= _company.merger.text.trouble >></div> - <</for>> + <<for _index, _company range _companies>> + <div class="majorText">The <<= ordinalSuffixWords(_index + 1)>> is <<= _company.merger.text.trouble >></div> + <</for>> <</if>> <div id="result"> <<for _company range _companies>> - <<capture _company>> + <<capture _company>> <div> - <<set _absorbName = "Absorb the " + _company.merger.name>> - <<link _absorbName>> + <<set _absorbName = "Absorb the " + _company.merger.name>> + <<link _absorbName>> <<replace "#result">> - You quickly acquire the <<= _company.merger.name>><<= _company.merger.text.acquire >> - <<set _devCount = _company.merger.result.development, - _slaveCount = _company.merger.result.slaves>> - <<if _devCount != null>> - <<set _company.division.developmentCount += _devCount>> - <</if>> - <<if _slaveCount != null>> - <<set _company.division.activeSlaves += _slaveCount>> - <</if>> - <<set _cost = (_company.merger.cost || 50) * 1000 >> - <<if _devCount != null && _slaveCount != null>> - <<set App.Corporate.chargeAsset(_cost / 2, "development")>> - <<set App.Corporate.chargeAsset(_cost / 2, "slaves")>> - <<elseif _devCount != null>> - <<set App.Corporate.chargeAsset(_cost, "development")>> - <<elseif _slavecount != null>> - <<set App.Corporate.chargeAsset(_cost, "slaves")>> - <<else>> - @@.red;ERROR! No changes to the corporation are made!@@ - <</if>> + You quickly acquire the <<= _company.merger.name>><<= _company.merger.text.acquire >> + <<set _devCount = _company.merger.result.development, + _slaveCount = _company.merger.result.slaves>> + <<if _devCount != null>> + <<set _company.division.developmentCount += _devCount>> + <</if>> + <<if _slaveCount != null>> + <<set _company.division.activeSlaves += _slaveCount>> + <</if>> + <<set _cost = (_company.merger.cost || 50) * 1000 >> + <<if _devCount != null && _slaveCount != null>> + <<set App.Corporate.chargeAsset(_cost / 2, "development")>> + <<set App.Corporate.chargeAsset(_cost / 2, "slaves")>> + <<elseif _devCount != null>> + <<set App.Corporate.chargeAsset(_cost, "development")>> + <<elseif _slavecount != null>> + <<set App.Corporate.chargeAsset(_cost, "slaves")>> + <<else>> + @@.red;ERROR! No changes to the corporation are made!@@ + <</if>> <</replace>> <</link>> - </div> - <</capture>> + </div> + <</capture>> <</for>> </div> diff --git a/src/uncategorized/saDiet.tw b/src/uncategorized/saDiet.tw index 5b60b88913a8ccc28e45a861bbc180950eaf0e62..a32538c6e7bca1b58e6017788b62465dc50b036a 100644 --- a/src/uncategorized/saDiet.tw +++ b/src/uncategorized/saDiet.tw @@ -313,7 +313,7 @@ <<if $slaves[$i].behavioralFlaw == "anorexic">> and $his cum addiction trumps $his desire to remain thin. $He <<else>> - $he + $he <</if>> is @@.hotpink;thrilled to get extra this week.@@ $He gobbles down every last drop like the happy <<if $slaves[$i].weight < 0>>little <<else>>chubby <</if>>cum addict $he is. <<set $slaves[$i].devotion += 2>> <</if>> diff --git a/src/uncategorized/saDrugs.tw b/src/uncategorized/saDrugs.tw index 205a55bd984400cdbe0e8533fd3012bfd99b16cf..e369bd38aa742b8c9488de15894173b05eb7aa73 100644 --- a/src/uncategorized/saDrugs.tw +++ b/src/uncategorized/saDrugs.tw @@ -964,7 +964,7 @@ $He receives @@.lime;direct injections of atrophiers right into $his penis,@@ causing $his body to begin pulling resources from it<<if $slaves[$i].geneMods.NCS == 1>>, $his @@.orange;NCS@@ amplifies the effectiveness<</if>>. <<set _shrinkage = 0>> <<if $slaves[$i].dick == 1>> - $His penis is now so miniscule that further drug use will fail to shrink it further; @@.yellow;$his drug regimen has been ended.@@ + $His penis is now so minuscule that further drug use will fail to shrink it further; @@.yellow;$his drug regimen has been ended.@@ <<set $slaves[$i].drugs = "no drugs">> <<elseif $slaves[$i].dick >= 20>> @@.lime;$His cock shrinks painfully,@@ becoming massively shorter and thinner. diff --git a/src/uncategorized/saPleaseYou.tw b/src/uncategorized/saPleaseYou.tw index 7dfc748cb3705f9a8efa2e93dc401ded887648b0..7b6720083fdf3a030d7b14f77846d294ff51a0d8 100644 --- a/src/uncategorized/saPleaseYou.tw +++ b/src/uncategorized/saPleaseYou.tw @@ -387,7 +387,7 @@ serves you this week. <</if>> <<if $slaves[$i].fetish == "cumslut">> <<if $slaves[$i].fetishKnown == 1>> - $He @@.hotpink;quivers with ecstasy@@ just from the taste of your <<if $PC.dick == 0>>girl<</if>>cum on $his tongue. + $He @@.hotpink;quivers with ecstasy@@ just from the <<if canTaste($slaves[$i])>>taste<<else>>feeling<</if>> of your <<if $PC.dick == 0>>girl<</if>>cum on $his tongue. <<else>> $He @@.hotpink;seems to enjoy@@ $his role as a cum receptacle more than you'd expect. <</if>> diff --git a/src/uncategorized/shops.tw b/src/uncategorized/shops.tw index 5c06ee8e39f73f01a7d4bd7c4673350b3edbbe9f..8b5e83f6905091ff93ecdf32238fae0f4c229760 100644 --- a/src/uncategorized/shops.tw +++ b/src/uncategorized/shops.tw @@ -96,7 +96,7 @@ This is a section of the promenade dedicated to Petite Admiration. The shops here are mostly focused on providing the tools and equipment a short slave will need to properly care for their Master and his abode. Several fashion lines have cropped up to provide matching clothing tailored to the shorter clientele and their often taller owners. There's even a sex shop that specializes in extreme differences in height. <<if $PC.height >= 170>> <span id="result"><<link "Take a harness out for a spin">><<replace "#result">> - The shop has a selection of harnesses available for testing and a number of miniscule slave<<print _girlU>>s to try out. You fasten one on and carry on browsing the rest of the stores. + The shop has a selection of harnesses available for testing and a number of minuscule slave<<print _girlU>>s to try out. You fasten one on and carry on browsing the rest of the stores. <<if $PC.dick > 0>> The squirming _girlU currently housing your cock makes it very difficult to focus on anything else, so you mostly just walk the hall, busting load after load into the overstimulated slave and effectively giving the store free advertisement. <<else>> diff --git a/src/uncategorized/slaveStats.tw b/src/uncategorized/slaveStats.tw index 94bcf449df526a8dad9fc690c4670bca1399358e..4cf2b2e94975c2d75ee9bd5e24a559b48d13dd57 100644 --- a/src/uncategorized/slaveStats.tw +++ b/src/uncategorized/slaveStats.tw @@ -14,63 +14,63 @@ Surname: $activeSlave.slaveSurname <br>Nationality: $activeSlave.nationality <br>Cost: $activeSlave.slaveCost -<br>Week: -Acquired: $activeSlave.weekAcquired, +<br>Week: +Acquired: $activeSlave.weekAcquired, Birth: $activeSlave.birthWeek <br>Pronoun: $activeSlave.pronoun <br>Career: $activeSlave.career <br>Origin: $activeSlave.origin <br>ID: $activeSlave.ID -<br>Prestige: $activeSlave.prestige, +<br>Prestige: $activeSlave.prestige, Desc: $activeSlave.prestigeDesc <br>CustomDesc: $activeSlave.custom.desc -<br>Indenture: $activeSlave.indenture, +<br>Indenture: $activeSlave.indenture, Restrictions: $activeSlave.indentureRestrictions -<br>Sentence: $activeSlave.sentence, +<br>Sentence: $activeSlave.sentence, Training: $activeSlave.training <br>BreedingMark: $activeSlave.breedingMark <br>Assignment: $activeSlave.assignment, -Visible: $activeSlave.assignmentVisible, +Visible: $activeSlave.assignmentVisible, choosesOwn: $activeSlave.choosesOwnAssignment -<br>Title: -Custom: $activeSlave.custom.title, -Lisp: $activeSlave.custom.titleLisp, +<br>Title: +Custom: $activeSlave.custom.title, +Lisp: $activeSlave.custom.titleLisp, Rude: $activeSlave.rudeTitle <br>Custom.label: $activeSlave.custom.label -<br><br>Drugs: $activeSlave.drugs, -Curatives: $activeSlave.curatives, -Chem: $activeSlave.chem, +<br><br>Drugs: $activeSlave.drugs, +Curatives: $activeSlave.curatives, +Chem: $activeSlave.chem, Aphrodisiacs: $activeSlave.aphrodisiacs <br>Induce: $activeSlave.induce -<br><br>Rules: -Current: $activeSlave.currentRules, -Living: $activeSlave.rules.living, -Speech: $activeSlave.rules.speech, +<br><br>Rules: +Current: $activeSlave.currentRules, +Living: $activeSlave.rules.living, +Speech: $activeSlave.rules.speech, Release: $activeSlave.rules.release -<br>Standard: -Punishment: $activeSlave.rules.punishment, +<br>Standard: +Punishment: $activeSlave.rules.punishment, Reward: $activeSlave.rules.reward -<br>UseRulesAssistant: $activeSlave.useRulesAssistant, +<br>UseRulesAssistant: $activeSlave.useRulesAssistant, ChoosesOwnChastity: $activeSlave.choosesOwnChastity -<br><br>Lifetime: -<br> Cash: -Expenses: <<= num($activeSlave.lifetimeCashExpenses)>>, +<br><br>Lifetime: +<br> Cash: +Expenses: <<= num($activeSlave.lifetimeCashExpenses)>>, Income: <<= num($activeSlave.lifetimeCashIncome)>> -<br> Rep: -Expenses: <<= num($activeSlave.lifetimeRepExpenses)>>, +<br> Rep: +Expenses: <<= num($activeSlave.lifetimeRepExpenses)>>, Income: <<= num($activeSlave.lifetimeRepIncome)>> -<br>LastWeeks: +<br>LastWeeks: <br> CashIncome: <<= num($activeSlave.lastWeeksCashIncome)>> -<br> Rep: -Expenses: <<= num($activeSlave.lastWeeksRepExpenses)>>, +<br> Rep: +Expenses: <<= num($activeSlave.lastWeeksRepExpenses)>>, Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br> @@ -118,30 +118,30 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <div id="Mental" class="tabcontent"> <div class="content"> Intelligence: $activeSlave.intelligence - <br>Attraction: - XX: $activeSlave.attrXX, + <br>Attraction: + XX: $activeSlave.attrXX, XY: $activeSlave.attrXY - <br>Fetish: - Strength: $activeSlave.fetishStrength, + <br>Fetish: + Strength: $activeSlave.fetishStrength, Known: $activeSlave.fetishKnown - <br>Behavioral: - Flaw: $activeSlave.behavioralFlaw, + <br>Behavioral: + Flaw: $activeSlave.behavioralFlaw, Quirk: $activeSlave.behavioralQuirk - <br>Sexual: - Flaw: $activeSlave.sexualFlaw, + <br>Sexual: + Flaw: $activeSlave.sexualFlaw, Quirk: $activeSlave.sexualQuirk - - <br>Energy: $activeSlave.energy, + + <br>Energy: $activeSlave.energy, Tired: $activeSlave.tired - <br>Need: $activeSlave.need, + <br>Need: $activeSlave.need, Cap: $activeSlave.needCap <br>Addict: $activeSlave.addict - <br>Hormones: $activeSlave.hormones, + <br>Hormones: $activeSlave.hormones, Balance: $activeSlave.hormoneBalance - <br>Trust: $activeSlave.trust, - Previous: $activeSlave.oldTrust - <br>Devotion: $activeSlave.devotion, + <br>Trust: $activeSlave.trust, + Previous: $activeSlave.oldTrust + <br>Devotion: $activeSlave.devotion, Previous: $activeSlave.oldDevotion </div> </div> @@ -155,20 +155,20 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>Fuckdoll: $activeSlave.fuckdoll <br>ToyHole: $activeSlave.toyHole <br>PLimb: $activeSlave.PLimb - + <br><br>BodySwap: $activeSlave.bodySwap - <br>origBodyOwner: $activeSlave.origBodyOwner, + <br>origBodyOwner: $activeSlave.origBodyOwner, ID: $activeSlave.origBodyOwnerID - - <br><br>Age: + + <br><br>Age: Actual: $activeSlave.actualAge, Visual: $activeSlave.visualAge, - PhysicalAge: $activeSlave.physicalAge, + PhysicalAge: $activeSlave.physicalAge, Adjust: $activeSlave.ageAdjust - <br>PubertyAge: - XX: $activeSlave.pubertyAgeXX, + <br>PubertyAge: + XX: $activeSlave.pubertyAgeXX, XY: $activeSlave.pubertyAgeXY - + <br><br>Brand: <<for _brandName, _brand range $activeSlave.brand>> _brandName: _brand, @@ -177,91 +177,91 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <<for _scarName, _scar range $activeSlave.scar>> _scarName: _scar, <</for>> - - <br><br>Broodmother: - Fetuses: $activeSlave.broodmotherFetuses, + + <br><br>Broodmother: + Fetuses: $activeSlave.broodmotherFetuses, CountDown: $activeSlave.broodmotherCountDown - - <br>Diet: - Current: $activeSlave.diet, - Cum: $activeSlave.dietCum, + + <br>Diet: + Current: $activeSlave.diet, + Cum: $activeSlave.dietCum, Milk: $activeSlave.dietMilk - + <br><br> <h2>Upper</h2> - - Hair: - Length: $activeSlave.hLength, - Style: $activeSlave.hStyle, - <br>Color: $activeSlave.hColor, - Orig: $activeSlave.origHColor, + + Hair: + Length: $activeSlave.hLength, + Style: $activeSlave.hStyle, + <br>Color: $activeSlave.hColor, + Orig: $activeSlave.origHColor, Override: $activeSlave.override_H_Color - - <br>Pubic Hair: - Style: $activeSlave.pubicHStyle, + + <br>Pubic Hair: + Style: $activeSlave.pubicHStyle, Color: $activeSlave.pubicHColor, Override: $activeSlave.override_Pubic_H_Color <br><br>Eyes: <br>Eyes: $activeSlave.eyes, Color: $activeSlave.eyeColor, - Orig: $activeSlave.origEye, + Orig: $activeSlave.origEye, Override: $activeSlave.override_Eye_Color <br>eyewear: $activeSlave.eyewear <br>pupil: $activeSlave.pupil <br>sclerae: $activeSlave.sclerae - - <br><br>Ears: - Hearing: $activeSlave.hears, + + <br><br>Ears: + Hearing: $activeSlave.hears, Wear: $activeSlave.earwear - + <br><br>Face: - <br>Face: $activeSlave.face, + <br>Face: $activeSlave.face, Shape: $activeSlave.faceShape <br>Lips: $activeSlave.lips <br>Oral count: $activeSlave.counter.oral <br>Teeth: $activeSlave.teeth - + <br>Voice: $activeSlave.voice <br>Accent: $activeSlave.accent <br>Eyebrow: - <br>Fullness: $activeSlave.eyebrowFullness, - Color: $activeSlave.eyebrowHColor, + <br>Fullness: $activeSlave.eyebrowFullness, + Color: $activeSlave.eyebrowHColor, Style: $activeSlave.eyebrowHStyle, Override: $activeSlave.override_Brow_H_Color <br>Smells: $activeSlave.smells <br>Tastes: $activeSlave.tastes <br>Makeup: $activeSlave.makeup - + <br>Race: $activeSlave.race, - Orig: $activeSlave.origRace, + Orig: $activeSlave.origRace, Override: $activeSlave.override_Race <br>Skin: $activeSlave.skin, - Orig: $activeSlave.origSkin, + Orig: $activeSlave.origSkin, Override: $activeSlave.override_Skin - + <br>Haircuts: $activeSlave.haircuts, Bald: $activeSlave.bald - + <br>Collar: $activeSlave.collar <br>Height: $activeSlave.height <br>Clothes: $activeSlave.clothes, ChoosesOwn: $activeSlave.choosesOwnClothes - + <br>Shoulders: $activeSlave.shoulders <br>ArmAccessory: $activeSlave.armAccessory <br>Muscles: $activeSlave.muscles - <br>Arms: $activeSlave.arms, - <br>UnderArm: - HColor: $activeSlave.underArmHColor, - Style: $activeSlave.underArmHStyle, + <br>Arms: $activeSlave.arms, + <br>UnderArm: + HColor: $activeSlave.underArmHColor, + Style: $activeSlave.underArmHStyle, Override H Colour: $activeSlave.override_Arm_H_Color - + <br>Nails: $activeSlave.nails - + <br><br>Boobs: $activeSlave.boobs, - <br>Milk: $activeSlave.boobsMilk, - Type: $activeSlave.boobsImplantType, + <br>Milk: $activeSlave.boobsMilk, + Type: $activeSlave.boobsImplantType, Qunantity: $activeSlave.counter.milk <br>Shape: $activeSlave.boobShape <br>nipples: $activeSlave.nipples, @@ -275,38 +275,38 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>MammaryCount: $activeSlave.counter.mammary <br>LactationRules: $activeSlave.rules.lactation <br>BreastMesh: $activeSlave.breastMesh - + <br><br> <h2>Lower</h2> - + Weight: $activeSlave.weight <br>Waist: $activeSlave.waist <br>Hips: $activeSlave.hips - + <br><br>Belly: $activeSlave.belly, Preg: $activeSlave.bellyPreg, Fluid: $activeSlave.bellyFluid, Sag: $activeSlave.bellySag, SagPreg: $activeSlave.bellySagPreg, - Pain: $activeSlave.bellyPain, + Pain: $activeSlave.bellyPain, Accessory: $activeSlave.bellyAccessory <br>Burst: $activeSlave.burst - <br>Inflation: $activeSlave.inflation, - Type: $activeSlave.inflationType, + <br>Inflation: $activeSlave.inflation, + Type: $activeSlave.inflationType, Method: $activeSlave.inflationMethod - <br>Source: - Milk: $activeSlave.milkSource, + <br>Source: + Milk: $activeSlave.milkSource, Cum: $activeSlave.cumSource - + <br><br>Anus: $activeSlave.anus, Area: $activeSlave.analArea, Count: $activeSlave.counter.anal <br>Butt: $activeSlave.butt, Type: $activeSlave.buttImplantType, - Plug: $activeSlave.buttplug, + Plug: $activeSlave.buttplug, PlugAttachment: $activeSlave.buttplugAttachment <br>Mpreg: $activeSlave.mpreg - + <br><br>Foreskin: $activeSlave.foreskin, <br>Dick: $activeSlave.dick, Accessory: $activeSlave.dickAccessory @@ -316,7 +316,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> Type: $activeSlave.ballType <br>Scrotum: $activeSlave.scrotum <br>Cum released: $activeSlave.counter.cum - + <br><br>Vagina: $activeSlave.vagina, Lube: $activeSlave.vaginaLube, Accessory: $activeSlave.vaginalAccessory, @@ -325,12 +325,12 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>EggType: $activeSlave.eggType <br>Ovaries: $activeSlave.ovaries <br>OvaryAge: $activeSlave.ovaryAge - + <br><br>Labia: $activeSlave.labia, <br>Clit: $activeSlave.clit, Setting: $activeSlave.clitSetting - - <br>LeftLeg: $activeSlave.leg.left.type, + + <br>LeftLeg: $activeSlave.leg.left.type, RightLeg: $activeSlave.leg.right.type Accessory: $activeSlave.legAccessory <br>Heels: $activeSlave.heels @@ -347,50 +347,50 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>WeeklySpending: $activeSlave.porn.spending <br>Prestige: $activeSlave.porn.prestige PrestigeDesc: $activeSlave.porn.prestigeDesc - + <br><br> <h2>Type</h2> General: $activeSlave.porn.fame.general <br>Fuckdoll: $activeSlave.porn.fame.fuckdoll <br>Rape: $activeSlave.porn.fame.rape, Unflinching: $activeSlave.porn.fame.unflinching - - <br>Preggo: $activeSlave.porn.fame.preggo, - Pregnancy: $activeSlave.porn.fame.pregnancy, + + <br>Preggo: $activeSlave.porn.fame.preggo, + Pregnancy: $activeSlave.porn.fame.pregnancy, Breeder: $activeSlave.porn.fame.breeder - - <br>BBW: $activeSlave.porn.fame.BBW, + + <br>BBW: $activeSlave.porn.fame.BBW, Gainer: $activeSlave.porn.fame.gainer <br>Stud: $activeSlave.porn.fame.stud <br>Loli: $activeSlave.porn.fame.loli - <br>DeepThroat: $activeSlave.porn.fame.deepThroat, + <br>DeepThroat: $activeSlave.porn.fame.deepThroat, StruggleFuck: $activeSlave.porn.fame.struggleFuck <br>Painal: $activeSlave.porn.fame.painal <br>Tease: $activeSlave.porn.fame.tease - <br>Romantic: $activeSlave.porn.fame.romantic, + <br>Romantic: $activeSlave.porn.fame.romantic, Caring: $activeSlave.porn.fame.caring <br>Pervert: $activeSlave.porn.fame.pervert - + <br>SizeQueen: $activeSlave.porn.fame.sizeQueen - - <br>CumSlut: $activeSlave.porn.fame.cumSlut, + + <br>CumSlut: $activeSlave.porn.fame.cumSlut, <br>CumAddict: $activeSlave.porn.fame.cumAddict - <br>Anal: $activeSlave.porn.fame.anal, + <br>Anal: $activeSlave.porn.fame.anal, AnalAddict: $activeSlave.porn.fame.analAddict <br>AttentionWhore: $activeSlave.porn.fame.attentionWhore - - <br>Abusive: $activeSlave.porn.fame.abusive, - Malicious: $activeSlave.porn.fame.malicious, - <br>Neglectful: $activeSlave.porn.fame.neglectful, + + <br>Abusive: $activeSlave.porn.fame.abusive, + Malicious: $activeSlave.porn.fame.malicious, + <br>Neglectful: $activeSlave.porn.fame.neglectful, SelfHating: $activeSlave.porn.fame.selfHating - - <br>BreastGrowth: $activeSlave.porn.fame.breastGrowth, + + <br>BreastGrowth: $activeSlave.porn.fame.breastGrowth, Boobs: $activeSlave.porn.fame.boobs <br>Humiliation: $activeSlave.porn.fame.humiliation - - <br>Dom: $activeSlave.porn.fame.dom, + + <br>Dom: $activeSlave.porn.fame.dom, Sub: $activeSlave.porn.fame.sub - <br>Sadist: $activeSlave.porn.fame.sadist, + <br>Sadist: $activeSlave.porn.fame.sadist, Masochist: $activeSlave.porn.fame.masochist <br> </div> @@ -398,7 +398,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <div id="Impants_Piercings_Tattoos" class="tabcontent"> <div class="content"> - + <h2>Impants</h2> Height: $activeSlave.heightImplant <br>Ears: $activeSlave.earImplant @@ -415,7 +415,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>Intelligence: $activeSlave.intelligenceImplant <br>Cervix: $activeSlave.cervixImplant <br>Butt: $activeSlave.buttImplant - + <br><br> <h2>Piercings</h2> Ears: $activeSlave.earPiercing <br>Face: $activeSlave.lipsPiercing @@ -430,7 +430,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>Vagina: $activeSlave.vaginaPiercing <br>Dick: $activeSlave.dickPiercing <br>Anus: $activeSlave.anusPiercing - + <br><br> <h2>Tattoos</h2> Custom: $activeSlave.custom.tattoo <br>Shoulders: $activeSlave.shouldersTat @@ -458,20 +458,20 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> Mother: $activeSlave.mother <br>Daughters: $activeSlave.daughters, Sisters: $activeSlave.sisters - <br>Fathered: slaves: $activeSlave.counter.slavesFathered, + <br>Fathered: slaves: $activeSlave.counter.slavesFathered, PCChildren: $activeSlave.counter.PCChildrenFathered - <br>KnockedUp: slaves: $activeSlave.counter.slavesKnockedUp, + <br>KnockedUp: slaves: $activeSlave.counter.slavesKnockedUp, <br>PC: $activeSlave.counter.PCKnockedUp <br>labor: $activeSlave.labor, Count: $activeSlave.counter.laborCount <br>Births: $activeSlave.counter.births, Total: $activeSlave.counter.birthsTotal <br>PrematureBirth: $activeSlave.prematureBirth - - <br> <h2>Mods</h2> - NCS: $activeSlave.geneMods.NCS, - RapidCellGrowth: $activeSlave.geneMods.rapidCellGrowth, - + + <br> <h2>Mods</h2> + NCS: $activeSlave.geneMods.NCS, + RapidCellGrowth: $activeSlave.geneMods.rapidCellGrowth, + <br><br> <h2>Relationships</h2> <br>Rules: $activeSlave.rules.relationship <br>Relation: $activeSlave.relation, @@ -481,7 +481,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>Rivalry: $activeSlave.rivalry, Target: $activeSlave.rivalryTarget <br>SubTarget: $activeSlave.subTarget - + <br><br> <h2>Genetic Quirks</h2> Gigantism: $activeSlave.geneticQuirks.gigantism, @@ -489,24 +489,24 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <br>Fertility: $activeSlave.geneticQuirks.fertility, Hyper: $activeSlave.geneticQuirks.hyperFertility <br>Superfetation: $activeSlave.geneticQuirks.superfetation - + <br>Dwarfism: $activeSlave.geneticQuirks.dwarfism <br>Pface: $activeSlave.geneticQuirks.pFace <br>Uface: $activeSlave.geneticQuirks.uFace <br>Albinism: $activeSlave.geneticQuirks.albinism <br>RearLipedema: $activeSlave.geneticQuirks.rearLipedema <br>WellHung: $activeSlave.geneticQuirks.wellHung - <br>Weight: - Gain: $activeSlave.geneticQuirks.wGain, + <br>Weight: + Gain: $activeSlave.geneticQuirks.wGain, Loss: $activeSlave.geneticQuirks.wLoss <br>Androgyny: $activeSlave.geneticQuirks.androgyny - + <br><br> <h2>Pregmancy</h2> - <br>Week: $activeSlave.pregWeek, - isPreg: $activeSlave.preg, - Source: $activeSlave.pregSource, - Type: $activeSlave.pregType, + <br>Week: $activeSlave.pregWeek, + isPreg: $activeSlave.preg, + Source: $activeSlave.pregSource, + Type: $activeSlave.pregType, Adaptation: $activeSlave.pregAdaptation <br>Control: $activeSlave.pregControl <br>PeakFertility: $activeSlave.fertPeak @@ -517,7 +517,7 @@ Income: <<= num($activeSlave.lastWeeksRepIncome)>> <div class="content"> <br>Recruiter: $activeSlave.recruiter <br>Deadliness <<print Deadliness($activeSlave)>> - <br>Count: Penetrative: $activeSlave.counter.penetrative, + <br>Count: Penetrative: $activeSlave.counter.penetrative, Public: $activeSlave.counter.publicUse <br>pitKills: $activeSlave.counter.pitKills </div> diff --git a/src/uncategorized/storyCaption.tw b/src/uncategorized/storyCaption.tw index ae1184e974f4ed04861c314c488080a8831e1db4..e3657f4bb4645529f48380ea41dde34b079ce151 100644 --- a/src/uncategorized/storyCaption.tw +++ b/src/uncategorized/storyCaption.tw @@ -21,7 +21,7 @@ <</widget>> <<widget "security">> - <<if ($SF.Toggle && $SF.Active >= 1) || $secExpEnabled > 0 && ($SecExp.buildings.propHub.active + $secHQ + $SecExp.buildings.barracks.active + $riotCenter) > 1>> + <<if ($SF.Toggle && $SF.Active >= 1) || $secExpEnabled > 0 && ($SecExp.buildings.propHub.active + $secHQ + $SecExp.buildings.barracks.active + $riotCenter) > 1>> <br> <</if>> <<if $SF.Toggle && $SF.Active >= 1 && _Pass != "Firebase">> diff --git a/src/uncategorized/universalRules.tw b/src/uncategorized/universalRules.tw index 3cbb439bf8fd394f0ad31b707182bf698d695c0b..e6803999d8bb30cde3cae45f063456a44f1c64d4 100644 --- a/src/uncategorized/universalRules.tw +++ b/src/uncategorized/universalRules.tw @@ -456,57 +456,57 @@ Slave nicknames are Future society names for new slaves are currently @@.red;NOT APPLIED.@@ [[Apply|Universal Rules][$useFSNames = 1]] <<else>> Future society names for new slaves are currently @@.cyan;APPLIED.@@ [[Stop applying|Universal Rules][$useFSNames = 0]] - + <<if $FSNamePref == 0>> - You are currently not setting direction towards which Future Society names are preferred. + You are currently not setting direction towards which Future Society names are preferred. <<elseif $FSNamePref == 1>> - New Slaves are currently being given devotional names. + New Slaves are currently being given devotional names. <<elseif $FSNamePref == 2>> - New slaves are currently being named according to Roman Custom. + New slaves are currently being named according to Roman Custom. <<elseif $FSNamePref == 3>> - New slaves are currently being named according to ancient Aztec Custom. + New slaves are currently being named according to ancient Aztec Custom. <<elseif $FSNamePref == 4>> - New slaves are currently being named according to ancient Egyptian Custom. + New slaves are currently being named according to ancient Egyptian Custom. <<elseif $FSNamePref == 5>> - New slaves are currently being named according to feudal Japanese Custom. + New slaves are currently being named according to feudal Japanese Custom. <<elseif $FSNamePref == 6>> - New slaves are currently being named according to Degradationalist Custom. + New slaves are currently being named according to Degradationalist Custom. <<elseif $FSNamePref == 7>> - New slaves are currently being named according to Paternalist Custom. + New slaves are currently being named according to Paternalist Custom. <<elseif $FSNamePref == 8>> - New slaves are currently being given simple bimbo names. + New slaves are currently being given simple bimbo names. <<elseif $FSNamePref == 9>> - New Slaves are currently being named according to Pastoralist Custom. + New Slaves are currently being named according to Pastoralist Custom. <</if>> - + <br> - + <<if $FSNamePref != 0>> - [[No Longer Specify which Future Society to Draw Names From.|Universal Rules][$FSNamePref = 0]] <br> + [[No Longer Specify which Future Society to Draw Names From.|Universal Rules][$FSNamePref = 0]] <br> <</if>> <<if $FSNamePref != 1 && $arcologies[0].FSChattelReligionist >= 20>> - [[Give New Slaves Devotional Names|Universal Rules][$FSNamePref = 1]] <br> + [[Give New Slaves Devotional Names|Universal Rules][$FSNamePref = 1]] <br> <</if>> <<if $FSNamePref != 2 && $arcologies[0].FSRomanRevivalist > 20>> - [[Give New slaves Roman Names|Universal Rules][$FSNamePref = 2]] <br> + [[Give New slaves Roman Names|Universal Rules][$FSNamePref = 2]] <br> <</if>> <<if $FSNamePref != 3 && $arcologies[0].FSAztecRevivalist > 20>> - [[Give New Slaves Ancient Aztec Names.|Universal Rules][$FSNamePref = 3]] <br> + [[Give New Slaves Ancient Aztec Names.|Universal Rules][$FSNamePref = 3]] <br> <</if>> <<if $FSNamePref != 4 && $arcologies[0].FSEgyptianRevivalist > 20>> - [[Give New Slaves Ancient Egyptian Names|Universal Rules][$FSNamePref = 4]] <br> + [[Give New Slaves Ancient Egyptian Names|Universal Rules][$FSNamePref = 4]] <br> <</if>> <<if $FSNamePref != 5 && $arcologies[0].FSEdoRevivalist > 20>> - [[Give New Slaves Feudal Japanese Names|Universal Rules][$FSNamePref = 5]] <br> + [[Give New Slaves Feudal Japanese Names|Universal Rules][$FSNamePref = 5]] <br> <</if>> <<if $FSNamePref != 6 && $arcologies[0].FSDegradationist !== "unset">> - [[Give New Slaves Degrading Names|Universal Rules][$FSNamePref = 6]] <br> + [[Give New Slaves Degrading Names|Universal Rules][$FSNamePref = 6]] <br> <</if>> <<if $FSNamePref != 7 && $arcologies[0].FSPaternalist >= 20>> - [[Give New Slaves Paternalist Names|Universal Rules][$FSNamePref = 7]] <br> + [[Give New Slaves Paternalist Names|Universal Rules][$FSNamePref = 7]] <br> <</if>> <<if $FSNamePref != 8 && $arcologies[0].FSIntellectualDependency >= 20>> - [[Give New Slaves Simple Bimbo Names|Universal Rules][$FSNamePref = 8]] + [[Give New Slaves Simple Bimbo Names|Universal Rules][$FSNamePref = 8]] <</if>> <</if>> <</if>> diff --git a/src/utility/birthWidgets.tw b/src/utility/birthWidgets.tw index 727818a51506e21d95ec60768ec66137ccef4baa..4ddd9bfd54b761f1ea6800b916cd6b78da9be41a 100644 --- a/src/utility/birthWidgets.tw +++ b/src/utility/birthWidgets.tw @@ -1791,7 +1791,7 @@ Feeling childbirth approaching, $slaves[$i].slaveName is helped to $his prepared <<else>> Quickly $he spreads $his legs apart and begins pushing out <<if $slaves[$i].broodmother > 0>><<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby<<else>>$his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>><</if>>.<<if $slaves[$i].fetish == "humiliation">> $He is thrilled that $his underwear reveals what's happening between $his legs<<else>> $He does $his best to hide what's happening between $his legs<</if>>. <</if>> - + <<case "a t-shirt and thong" "a thong" "a tube top and thong" "a bimbo outfit">> <<if $slaves[$i].fetish == "mindbroken">> Instinctively, $he begins to push out <<if $slaves[$i].broodmother > 0>><<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby<<else>>$his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>><</if>>, indifferent to the thong covering $his <<if $slaves[$i].mpreg == 1>>anus<<else>>vagina<</if>>. $He crowns into the straining undergarment until the straps give out and clear $his <<if $slaves[$i].mpreg == 1>>anus<<else>>birth canal<</if>>, allowing $him to carry on with childbirth. @@ -1812,7 +1812,7 @@ Feeling childbirth approaching, $slaves[$i].slaveName is helped to $his prepared <<else>> Quickly $he spreads $his legs apart and begins pushing out <<if $slaves[$i].broodmother > 0>><<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby<<else>>$his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>><</if>>.<<if $slaves[$i].fetish == "humiliation">> $He is thrilled that $his swimsuit fully reveals what's happening between $his legs<<else>> $He does $his best to hide what's happening between $his legs<</if>>. <</if>> - + <<case "a courtesan dress">> <<if $slaves[$i].fetish == "mindbroken">> Instinctively, $he begins to push out <<if $slaves[$i].broodmother > 0>><<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby<<else>>$his bab<<if $slaves[$i].pregType > 1>>ies<<else>>y<</if>><</if>>, indifferent to who may be watching the show under $his parted dress. diff --git a/src/utility/descriptionWidgetsFlesh.tw b/src/utility/descriptionWidgetsFlesh.tw index 4cd8914ed198b50129656c165c877f8f523ef35e..bb36bbde986cc95b3d30922690ce23240a36a6cd 100644 --- a/src/utility/descriptionWidgetsFlesh.tw +++ b/src/utility/descriptionWidgetsFlesh.tw @@ -3845,7 +3845,7 @@ $He's got a <<if $activeSlave.dick == 0>> Bizarrely, $he's been given a functional prostate gland. It's attached to $his urethra, of course, <<if $activeSlave.balls > 0>>which in combination with $his testicles make $his squirt unreasonable volume of fluids and semen with each orgasm<<else>>meaning that when $he orgasms, $he squirts an unreasonable volume of fluid<</if>>. <<if $activeSlave.prostate > 2>> - With the implant embedded in it; that gush is insane. Everything around $him is at risk of being splashed. Changes of clothes are a must with $him, as are supplies to mop up afterwards. + With the implant embedded in it, that gush is insane. Everything around $him is at risk of being splashed. Changes of clothes are a must with $him, as are supplies to mop up afterwards. <</if>> <</if>> <</if>>