diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts index 9f8c72766ed438f881c229c9737aab89eb17a506..ffb6d0fe960be775b1f138652e27ffc57165a809 100644 --- a/devTools/types/FC/human.d.ts +++ b/devTools/types/FC/human.d.ts @@ -270,7 +270,7 @@ declare global { type PiercingType = 0 | 1 | 2; type ClitoralPiercingType = PiercingType | 3; type Race = "amerindian" | "asian" | "black" | "indo-aryan" | "latina" | "malay" | "middle eastern" | "mixed race" | - "pacific islander" | "semitic" | "southern european" | "white"; + "pacific islander" | "catgirl" | "semitic" | "southern european" | "white"; type SizingImplantType = WithNone<"normal" | "string" | "fillable" | "advanced fillable" | "hyper fillable">; type SmartPiercingSetting = WithNone<"off" | "all" | "no default setting" | "random" | "women" | "men" | "vanilla" | "oral" | "anal" | "boobs" | "submissive" | "humiliation" | "pregnancy" | "dom" | "masochist" | "sadist" | "anti-women" | "anti-men">; diff --git a/devTools/types/SugarCubeExtensions.d.ts b/devTools/types/SugarCubeExtensions.d.ts index 7ba3bb2d452634df9d7011a38951498d121bb069..d4b18a0a50ce841e21a86df911895f1937e34645 100644 --- a/devTools/types/SugarCubeExtensions.d.ts +++ b/devTools/types/SugarCubeExtensions.d.ts @@ -19,6 +19,7 @@ declare module "twine-sugarcube" { whiteAmericanMaleNames: string[]; whiteAmericanSlaveNames: string[]; whiteAmericanSlaveSurnames: string[]; + catSlaveNames: string []; fakeBellies: string[]; filterRaces: Map<FC.Race, string>; diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index a40856cf4c2809a5051f981dfd2e4877c0c01ead..14621008d8bd88a1189f94284c44e4b0fb1f1476 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -120,6 +120,7 @@ App.Data.defaultGameStateVariables = { seeDicks: 25, seeDicksAffectsPregnancy: 1, seeExtreme: 0, + seeCats: 0, seeFCNN: 1, seeFaces: 1, seeHeight: 0, @@ -234,6 +235,19 @@ App.Data.CorpInitData = { SpecRaces: [] }; +App.Data.projectN = { + status: 0, + public: 0, + wellFunded: 0, + poorlyFunded: 0, + phase1: 0, + phase2: 0, + phase3: 0, + phase4: 0, + decisionMade: 0, + techReleased: 0, +}; + // Black Market App.Data.FSWares = [ "AssetExpansionistResearch", @@ -1010,6 +1024,22 @@ App.Data.resetOnNGPlus = { cloningSystem: 0, geneticFlawLibrary: 0, + projectN: App.Data.projectN, + bodyPuristRiot: 0, + puristsFurious: 0, + puristRiotDone: 0, + subjectDeltaName: "Bubbles", + growingNewCat: 0, + + catPresent: 0, + noDeadShit: 0, + niceCatPresent: 0, + junkCatPresent: 0, + deadCatPresent: 0, + + sniperEscape: 0, + sekhmetBombPlot: 0, + surgeryUpgrade: 0, barracks: 0, diff --git a/js/003-data/miscDataNames.js b/js/003-data/miscDataNames.js index c56d6149598271a96e1c5bbafa69dfb5b3c9a785..849d1d719254445c88c50e7cce4f82babdbdeede 100644 --- a/js/003-data/miscDataNames.js +++ b/js/003-data/miscDataNames.js @@ -893,6 +893,7 @@ App.Data.misc.zimbabweanSlaveNames = ["Aida", "Aides", "Albertine", "Alfreda", " App.Data.misc.zimbabweanMaleNames = ["Aaron", "Abel", "Adam", "Addison", "Alan", "Alexander", "Alfonso", "Alfred", "Allan", "Andrew", "Anthony", "Antipass", "Arnold", "Arthur", "Banga", "Barry", "Basildon", "Benjamin", "Bernard", "Betserai", "Bill", "Brendan", "Brian", "Canaan", "Cecil", "Cephas", "Chaga", "Changa", "Charles", "Chenjerai", "Chenzira", "Chirikure", "Chiwira", "Christopher", "Connie", "Constantino", "Cont", "Crispen", "Cuthbert", "Cyprian", "Dakarai", "Dambudzo", "Daniel", "David", "Dennis", "Dereck", "Desmond", "Dickson", "Doesmatter", "Dominic", "Douglas", "Dudley", "Earnest", "Edgar", "Edward", "Elijah", "Elisha", "Elliot", "Emmerson", "Ernest", "Evan", "Fabian", "Farai", "Faudi", "Felix", "Francis", "Fredrik", "Fungai", "Gabriel", "Gamba", "Garikai", "Garin", "Gary", "George", "Gilbert", "Glen", "Goredenna", "Gray", "Guy", "Harnden", "Henry", "Herbert", "Hondo", "Howard", "Hugh", "Iain", "Ian", "Itayi", "Jabulani", "Jack", "Jacob", "James", "Jeremy", "Jerry", "Jesse", "Jiri", "John", "Johnathan", "Johnson", "Jonas", "Jose", "Joseph", "Joshua", "Josiah", "Julius", "Juma", "Kamali", "Karikoga", "Kaseko", "Kasirayi", "Katura", "Kayisa", "Keegan", "Kembo", "Ken", "Kenias", "King", "Kokayi", "Langton", "Learnmore", "Leopold", "Lewis", "Lloyd", "Lobengula", "Lucian", "Mark", "Marwin", "Mashama", "Masimba", "Mathias", "Mathumo", "Matope", "Maxwell", "Melford", "Meshack", "Mhlangano", "Michael", "Mike", "Millen", "Morgan", "Moussa", "Moyo", "Mqabukonyongolo", "Mudiwa", "Mukomana", "Munacho", "Munashe", "Munya", "Musaemura", "Naison", "Nathan", "Ndaba", "Ndabaningi", "Ndabazinhle", "Ngidhi", "Ngonidzashe", "Nokuthula", "Nomore", "Nyenyedzi", "Otto", "Pardon", "Passmore", "Patric", "Patrick", "Penias", "Peter", "Petiri", "Phelekezela", "Philemon", "Philip", "Phillimon", "Phillip", "Pierre", "Robert", "Robson", "Rodney", "Roland", "Ronnie", "Roy", "Rudo", "Runako", "Rutendo", "Samson", "Samuel", "Savieri", "Sekayi", "Sidney", "Sifiye", "Silas", "Simba", "Simon", "Simpson", "Sivuyile", "Sodindo", "Solomon", "Stanley", "Stephen", "Sydney", "Tafadzwa", "Tapfumaneyi", "Tatenda", "Tawanda", "Tendai", "Tendekayi", "Terence", "Thamsanqa", "Theunis", "Thomas", "Tichaona", "Tichawonno", "Timothy", "Tinashe", "Togara", "Tommy", "Tongayi", "Tonny", "Trevor", "Ushindi", "Veriyas", "Vincent", "Vito", "Warren", "Wesley", "Weston", "William", "Wirimai", "Yandikani", "Young", "Zephaniah", "Ziyapaya", "Zuka"]; App.Data.misc.zimbabweanSlaveSurnames = ["Abrams", "Asante", "Ba", "Bagguley", "Bakasa", "Bakker", "Banana", "Banda", "Banga", "Batista", "Benade", "Bhasopo", "Bhebhe", "Birir", "Blatchford", "Boelsma", "Bonde", "Bota", "Bradley", "Brown", "Buka", "Bungwe", "Butcher", "Bwerinofa", "Carney", "Chakaipa", "Chakanyuka", "Chamberlin", "Chari", "Chatima", "Chatterton", "Chatya", "Chauke", "Chawira", "Chibanda", "Chibaya", "Chidyausiku", "Chidzero", "Chidzeru", "Chidziva", "Chifamba", "Chigudu", "Chihota", "Chikomo", "Chikwata", "Chimanikire", "Chimusasa", "Chinyama", "Chiparaushe", "Chirandu", "Chirombo", "Chirume", "Chitepo", "Chitsika", "Chitsiko", "Chitsvatsva", "Chiwara", "Chiwasa", "Chiweshe", "Chiwira", "Chrima", "Chuma", "Clements", "Coetzee", "Cooke", "Cowherd", "Crowe", "Dale", "Dangarembga", "Davis", "Denenga", "Dhlamini", "Dhliwayo", "Dickson", "Dimond", "Dlamini", "Dludlu", "Dringirai", "Drummond", "Dube", "Dzingai", "Dzoma", "Emmaculate", "Emmanuel", "Eppel", "Felgate", "Findlay", "Finlay", "Fletcher", "Fulton", "Furusa", "Fuyana", "Gatsi", "Gerber", "Gola", "Gomo", "Gondo", "Gonzo", "Goreraza", "Gray", "Griffith", "Grobler", "Groenewald", "Gumbo", "Gumede", "Gwenzi", "Hadebe", "Hanneck", "Harnden", "Hein", "Hepple", "Hermandishi", "Hockey", "Holland", "Homela", "Hopkins", "Hove", "Hubbard", "Hungwe", "James", "Jeke", "Jimu", "John", "Johnson", "Jonga", "Jongwe", "Kagona", "Kainga", "Kaitano", "Kamangila", "Kamhai", "Kamungeremu", "Kamusewu", "Kangwena", "Kanongo", "Kapfumvuti", "Karanga", "Karimanzira", "Kaseke", "Katiyo", "Katomeni", "Katsande", "Katsaruwsre", "Kay", "Ken", "Khumalo", "Khupe", "King", "Kuimba", "Kunaka", "Kuruneri", "Kwari", "LaBerge", "Lambourn", "Landsburg", "Lazarus", "Lenneiye", "Lesabe", "Lieros", "Likoto", "Little", "Lovejoy", "Lunga", "Maasdorp", "Mabhena", "Mabika", "Macedo", "Machingura", "Madondo", "Madzinga", "Madziva", "Madzoko", "Mafu", "Mafukidze", "Mafuta", "Magaya", "Magwede", "Mahachi", "Mahamba", "Mahanya", "Mahlangu", "Mahoso", "Majika", "Majoni", "Makaza", "Makhalisa", "Makhulu", "Makombe", "Makoni", "Makore", "Makoto", "Makumbe", "Makusha", "Makuyana", "Malinga", "Mamvura", "Mandaza", "Mandebele", "Mandizvidza", "Mangena", "Mangwiro", "Maniwa", "Mankaba", "Mantsebo", "Manyika", "Mapfumo", "Maphosa", "Maponga", "Maposa", "Mapulazi", "Mapuranga", "Marabini", "Maraire", "Marakurwa", "Marandure", "Marange", "Marechera", "Marimo", "Maringapasi", "Marowa", "Marufu", "Marukutira", "Marume", "Masaku", "Masando", "Masango", "Masawi", "Maseko", "Masendeke", "Mashava", "Mashingaidze", "Mashiri", "Mashonganyika", "Masiya", "Masuka", "Masuku", "Masunda", "Masvarise", "Matambanadzo", "Matambo", "Matare", "Matchaba", "Matende", "Mathe", "Matonhodze", "Matsika", "Matute", "Mavhera", "Mavugara", "Mawire", "Mawoko", "Mazhindu", "Mbangwn", "Mbayago", "Mbedzi", "Mbewe", "Mbiza", "McCall", "McDonald", "McGahan", "Mdhlongwa", "Meikle", "Mgabe", "Mguni", "Mhaka", "Mhembere", "Mhlanga", "Midzi", "Mjaoni", "Mkandla", "Mkondo", "Mkwananzi", "Mlalazi", "Mlambo", "Mlilo", "Mlotshwa", "Mnangagwa", "Mohamed", "Mombeshora", "Moodie", "Motsi", "Moya", "Moyo", "Mpala", "Mphoko", "Mpofu", "Msika", "Msipa", "Mtetwa", "Mubaiwa", "Mubako", "Muchemwa", "Muchena", "Muchenje", "Mudenda", "Mudimba", "Mudimu", "Mudyirwa", "Mudzingwa", "Mugabe", "Mugadza", "Mugwagwa", "Mujuru", "Mukonoweshuro", "Mukumana", "Muleya", "Mumbengegwi", "Mumpande", "Munemo", "Munetsi", "Mungoshi", "Munkombwe", "Munkuli", "Munsaka", "Munsake", "Munyaka", "Munyoro", "Mupingiza", "Mupudzi", "Murerwa", "Murombedzi", "Murphy", "Murwira", "Musa", "Musambasi", "Musariri", "Musarurwa", "Musekiwa", "Mushaninga", "Mushayakarara", "Mushonga", "Musodza", "Musonza", "Musundire", "Mutale", "Mutandwa", "Mutasa", "Mutema", "Mutero", "Mutize", "Mutokuto", "Mutonono", "Mutswairo", "Muyaba", "Muyama", "Muyambo", "Muza", "Muzamba", "Muzanenhamo", "Muzenda", "Muzondo", "Muzongondi", "Muzorewa", "Mvumvure", "Mwale", "Mwanza", "Mwembe", "Mwinde", "Ncube", "Ndaba", "Ndebele", "Ndewere", "Ndhlovu", "Ndiweni", "Ndlovu", "Ndoro", "Ndou", "Neshamba", "Ngidhi", "Ngirazi", "Ngorima", "Ngulube", "Nguni", "Ngwenya", "Nhamo", "Nhongo", "Nkala", "Nkhoma", "Nkiwane", "Nkomo", "Ntini", "Nyagumbo", "Nyakudya", "Nyamadzawo", "Nyamande", "Nyamanjiva", "Nyamapfene", "Nyandoro", "Nyasango", "Nyathi", "Nyatoti", "Nyaumwe", "Nyika", "Nyikadzino", "Nyoni", "Nzenza", "Odendaal", "Olonga", "Otter", "Page", "Paradza", "Phillip", "Phiri", "Pietersen", "Powell", "Pratt", "Pugh", "Pullen", "Redrupp", "Rhodes", "Rise", "Rowland", "Rubenstein", "Rugare", "Rukwava", "Rungano", "Rusere", "Ruzvidzo", "Sagwette", "Sakala", "Sakara", "Sale", "Sande", "Saruchera", "Savieri", "Schadie", "Sekeramayi", "Seranika", "Shadwell", "Shamuyarira", "Shava", "Shereni", "Shoko", "Shonhiwa", "Shoniwa", "Shumba", "Siamusiye", "Sibambo", "Sibanda", "Sibindi", "Sigauke", "Sikara", "Sim", "Simango", "Sita", "Sithole", "Siwela", "Siziba", "Smallman", "Smith", "Spencer", "Steenkamp", "Stravens", "Suluma", "Taderera", "Tafirenyika", "Takawira", "Tapera", "Taruvinga", "Tavengwa", "Tawanda", "Taylor", "Tekene", "Tekere", "Tembo", "Templer", "Tfumaindiru", "Thorn", "Tigere", "Tongagara", "Tora", "Tsatsa", "Tseriwa", "Tshuma", "Tsimba", "Tsumba", "Tsuro", "Tungamirai", "Tungwarara", "Vambe", "Van Heerden", "Vera", "Vermeulen", "Wafawanaka", "Ward", "Whitfield", "Whyte", "Young", "Zhou", "Zhuwao", "Zimunya", "Zindoga", "Zinyama", "Zuenyika", "Zulu", "Zuze", "Zvobgo", "Zwangobani"]; +App.Data.misc.catSlaveNames = ["Abbie", "Ada", "Alex", "Alice", "Amber", "Angel", "Anna", "Ash", "Auburn", "Aussie", "Bailey", "Bangles", "Basil", "Beauty", "Bella", "Bobo", "Boots", "Bootsie", "Bonkers", "Brownie", "Bobcat", "Bimbo", "Buddy", "Bobbi", "Blackie", "Calico", "Carmen", "Charlie", "Chipper", "Choco", "Charcoal", "Cleo", "Cinnamon", "Clawless", "Clueless", "Cody", "Corkey", "Daisy", "Dancer", "Dandy", "Dino", "Dot", "Dusty", "Darling", "Eagle", "Ellie", "Erica", "Emily", "Fable", "Felix", "Fleabag", "Flicker", "Floozy", "Flopper", "Floppa", "Fritz", "Furball", "Fluffy", "Gabby", "Gigi", "Garfield", "Georgie", "Goober", "Grace", "Haley", "Harriet", "Holly", "Hunter", "Ice", "Ida", "Inky", "Isabel", "Ivy", "Itsy", "Jack", "Jade", "Jasmine", "Jangles", "Jasper", "Jiggly", "Jiggles", "Jewel", "Kara", "Kassie", "Kibble", "King", "Kissy", "Kenzie", "Kiwi", "Kitsy", "Kitty", "Kitcat", "Kitkat", "Lady", "Lottie", "Lily", "Lilac", "Lizzie", "Lucy", "Lulu", "Lucky", "Mac", "Maddie", "Mango", "Marvel", "Max", "Maxie", "Maybelle", "Milky", "Missy", "Moody", "Muffin", "Muddy", "Nala", "Napoleon", "Nappy", "Nellie", "Nut", "Olivia", "Ollie", "Oreo", "Orange", "Paws", "Patches", "Panther", "Peaches", "Peanut", "Pearl", "Pebbles", "Peggy", "Perky", "Pistol", "Pixie", "Pinky", "Polkadot", "Pretty", "Pringles", "Prune", "Prissy", "Pushy", "Pumpkin", "Queenie", "Rachel", "Ragdoll", "Raggles", "Rainbow", "Raisin", "Rascal", "Rebecca", "Red", "Rosie", "Roxie", "Rusty", "Sable", "Sam", "Samantha", "Sapphire", "Sarge", "Sassy", "Sasha", "Scrappy", "Scarlet", "Scruffy", "Sir Lancelot", "Skippy", "Sissy", "Smiley", "Snickers", "Smoochers", "Sniffer", "Softy", "Snowflake", "Snowball", "Snuggles", "Sparky", "Sphinx", "Strings", "Sweetpea", "Sylvia", "TJ", "Taylor", "Tessa", "Tex", "Tickles", "Tiger", "Tiny", "Tricks", "Troy", "Ulysses", "Valerie", "Valentine", "Vandal", "Virginia", "Whitepaw", "Wiggles", "Winnie", "Xara", "Yankee", "Zapper", "Zelda", "Zipper", "Zippy"]; App.Data.misc.cowSlaveNames = ["Abby", "Aberdeen Angus", "Adorabull", "Africander", "Ajax", "Akabeko", "Alderney", "Alfalfa", "Alice", "Amazone", "Amber", "Andalusian", "Angel", "Angus", "Anna", "Annabelle", "Annie", "Apple", "April", "Arabella", "Arbuckle", "Arizona", "Arizone", "Audrey", "Aurochs", "Autumn", "Ayrshire", "Babe", "Babette", "Babs", "Baby", "Barbara", "Baron", "Bebop", "Beefalo", "Beefcake", "Beefhide", "Beefsteak", "Beefy", "Bella", "Belle", "Belted Galloway", "Bernice", "Berry", "Bertha", "Bess", "Bessie", "Bessy", "Beth", "Betsy", "Betty Sue", "Betty", "Beulah", "Big Mac", "Big Mama", "Biscuit", "Black Angus", "Blanca", "Blanche", "Blimey", "Blue Moon", "Blue", "Booboo", "Boomboom", "Boot", "Bootsy", "Bossy", "Bovine", "Brahman", "Brisket", "Brooke", "Brown Cow", "Brown Swiss", "BrownCow", "Brownie", "Bubba", "Bubble", "Bubbles", "Buckaroo", "Budder", "Buddy", "Buffalo", "Bulldozer", "Bullock", "Bullseye", "Bullwinkle", "Bumble", "Bumbles", "Butter", "Butterball", "Buttercup", "Butterfly", "Buttermilk", "Butters", "Butterworth", "Button", "Buttons", "Cadence", "Candie", "Caramel", "Caramelle", "Cattalo", "Chancey", "Charme", "Charolais", "Cheddar", "Cheeseburger", "Cheesehead", "Cheesy", "Cheezy", "Chip", "Chloe", "Chocolate Chip", "Chocolate", "Chunky", "Cinnamon", "Clarabell", "Clarabelle", "Clover", "Coco", "Cocoa", "Colostrum", "Cookie", "Copper", "Cornflower", "Corona", "Cowbell", "Cowey", "Cowgirl", "Cowhand", "Cowhide", "Cowlick", "Cowpea", "Cowpox", "Cowpunk", "Cowsy", "Cowtow", "Cream", "Creame", "Creamie", "Creampie", "Creamy", "Creme", "Crunchy", "Cud", "Cupcake", "Curtsy", "Custard", "Cutie Pie", "Cutie", "Daffodil", "Dahlia", "Dairy Queen", "Daisy", "Dala", "Danielle", "Darcy", "Darla", "Dear", "Delilah", "Devon", "Dew", "Dexter", "Dezzie", "Diamond", "Dimples", "Dogie", "Dolly", "Dora", "Doreen", "Doris", "Dorothy", "Dot", "Dottie", "Dozer", "Dream", "Duchess", "Dulcie", "Dumpling", "Dun", "Durham", "Dutch Belted", "Dutchess", "Dutchie", "Egyptian", "Eleanor", "Ella", "Elsie", "Elvis", "Emily", "Emma", "Empress", "Ernestine", "Esmeralda", "Estelle", "Ethel", "Europa", "Fancy", "Fanny", "Fergie", "Fleur", "Florida", "Florinda", "Flower", "Fortuna", "Fortune", "Forty-One", "Freckles", "French Canadian", "Fribourg", "Gale", "Galloway", "Gambles", "Gertie", "Ginger", "Gladys", "Goldenrod", "Goldie", "Gozu", "Grace", "Gracie", "Grady", "Grass-Fed", "Grassyella", "Grayce", "Grazer", "Guernica", "Guernsey", "Gussie", "Gwen", "Gypsy", "Gyr", "Hailey", "Hamburger", "Harrietta", "Harvey", "Hathor", "Hattie", "Hazel", "Heifer", "Henrietta", "Hera", "Hereford", "Hershey Kiss", "Hershey", "Holstein-Friesian", "Holstein", "Holy", "Honey", "Honeybun", "Humphry", "Ice Cream", "Icelandic", "Irene", "Isabella", "Isabelle", "Jade", "Jane", "Jasmayne", "Jasmine", "Jersey Highball", "Jersey", "Jess", "Jubilee", "July", "June", "Kamdhenu", "Kharta", "Kudzu", "Lacteal", "Lactose", "Lacy", "Lady", "Lavender", "Lee", "Lilac", "Lilly", "Lily", "Lilypad", "Lincoln Red", "Linda", "Lois", "Lola", "Longhorn", "LovaBull", "Lulu", "Mad Milk", "Madonna", "Mae", "Maggie", "Magnolia", "Maple", "Marge", "Margie", "Marie", "Marigold", "Martha", "Mary", "Maud", "Maude", "Maudine", "May", "Meadow", "Meenie", "Meg", "Midnight", "Milch", "Milk Dud", "Milk Queen", "Milk River", "Milka", "Milkcow", "MilkDrop", "Milkers", "Milkie", "Milkmaid", "Milkshake", "Milksop", "Milky Way", "Milky", "Milkybar", "Milquetoast", "Minnie", "Minos", "Missy", "Miura", "Molly Mood", "Molly", "Mona", "Moo Moo", "Moo-Cow", "Moo-Moo", "Moode", "Moofasa", "Mooffin", "Moogy", "Moolawn", "Moolissa", "Moolly", "Mooly", "Moomee", "Moomin", "Moomoo", "MooMoo", "Moomy", "Moona", "Moonbeam", "Moonica", "Moonpie", "Moonshine", "Moonwalker", "Mootilda", "Moscow", "Mud Pie", "Muddy", "Muffin", "Nacho", "Nanette", "Nellie", "Nemoo", "Nettie", "Nighte", "Nina", "Nora", "Norwegian Red", "O'Leary", "Old Girl", "Olive", "Olivia", "Ollie", "Ongole", "Ophelia", "Oreo", "Otis", "Oxhead", "Patches", "Patience", "Pattycake", "Pauline", "Peanut", "Pearl", "Peggy", "Penelope", "Penny", "Pepper", "Petunia", "Pickle", "Pickles", "Pinkie", "Pinky", "Pogo", "Polka", "Polled Durham", "Polled Hereford", "Polly", "Poppie", "Porterhouse", "Pox", "Precious", "Princess", "Prudence", "Pumpkin", "Queen", "Queenie", "Queso", "Queste", "Rainbow", "Ranger", "Red Poll", "Red Polled", "Red Sindhi", "Rhonda", "Rhubarb", "Rocky", "Rose", "Rosebud", "Rosie", "Ruby", "Rump Roast", "Rustler", "Sable", "Santa Gertrudis", "Sasha", "Satin", "Savanah", "Scotch", "Shade", "Shadow", "Shelly", "Sherbert", "Shetland", "Shorthorn", "Sirloin", "Skim", "Snow", "Snowdrop", "Snowflake", "Sparkle", "Spot", "Spots", "Spring", "Sprinkle", "Sprinkles", "Stargazer", "Steakhouse", "Strawberry", "Stroganoff", "Sue", "Sugar", "Summer", "Sunbeam", "Sunny Milk", "Sunny", "Sunshine", "Supercow", "Susie", "Sussex", "Sweet Alice", "Sweetie", "Sweetpea", "Swiss Miss", "Sydney", "T-Bone", "Taurus", "Tenderloin", "Tex", "Tiny", "Tippy", "Toro", "Ubre", "Udderly", "Udders", "Unicorn", "Vaca", "Valentine", "Veal", "Vechur", "Vegas", "Viola", "Violet", "Waffles", "Wagyu", "Wasabi", "Welsh Black", "Welsh", "Wendy", "West Highland", "Whey", "Willow", "Winnie", "Winter", "Wisconsin", "Wisent", "Wonder", "Xena", "Yancy", "Yodel", "Yogurt", "Yvonne", "Zebu", "Zipper", "Zippy", "Zoey"]; diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js index 9c980c4f04abb1bae7d184e48709e36aa2163f1d..4d98c87515aff9da4a80f4da67afec60426240a7 100644 --- a/js/003-data/policiesData.js +++ b/js/003-data/policiesData.js @@ -1272,6 +1272,19 @@ App.Data.Policies.Selection = { note: `Will reduce slaving profits, damaging the arcology's prosperity` } ], + "arcologies[0].FSBodyPuristCatLaw": [ + { + title: "Nonhuman Purity Standards", + titleClass: "lime", + text: "engage in targeted social engineering to make unmodified catgirls palatable to body purist tastes.", + activatedText: "catgirls are seen as pretty in their own distinct fashion, so long as they are pure and natural.", + get requirements() { return (V.puristRiotDone === 1); }, + onImplementation: function() { + repX(-2000, "policies"); + }, + note: `Will damage your reputation but change beauty standards to make natural catgirls acceptable` + } + ], }, FSTransformationFetishist: { "arcologies[0].FSTransformationFetishistSMR": [ diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js index 885401b115068bd5ef88ff31e886a154c1bb628e..29eeddb9d31fc0ca7a850ee3bb0e7ad991c07070 100644 --- a/js/003-data/slaveMods.js +++ b/js/003-data/slaveMods.js @@ -428,8 +428,8 @@ App.Medicine.Modification.eyeShape = [ {value: "wide-eyed"} ]; -App.Medicine.Modification.naturalSkins = ["pure white", "ivory", "white", "extremely pale", "very pale", "pale", "extremely fair", "very fair", "fair", "light", "light olive", "tan", "olive", "bronze", "dark olive", "dark", "light beige", "beige", "dark beige", "light brown", "brown", "dark brown", "black", "ebony", "pure black"]; -App.Medicine.Modification.dyedSkins = ["camouflage patterned", "dyed blue", "dyed gray", "dyed green", "dyed pink", "dyed red", "tiger striped"]; +App.Medicine.Modification.naturalSkins = ["pure white", "ivory", "white", "extremely pale", "very pale", "pale", "extremely fair", "very fair", "fair", "light", "light olive", "tan", "olive", "bronze", "dark olive", "dark", "light beige", "beige", "dark beige", "light brown", "brown", "dark brown", "black", "ebony", "pure black", "black and white striped", "red", "yellow"]; +App.Medicine.Modification.dyedSkins = ["camouflage patterned", "dyed blue", "dyed gray", "dyed green", "dyed pink", "dyed red", "tiger striped", "dyed purple"]; App.Medicine.Modification.naturalNippleColors = ["black", "brown", "dark brown", "ebony", "ivory", "light brown", "pale pink", "pink"]; App.Medicine.Modification.eyebrowStyles = new Set(["shaved", "straight", "rounded", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved"]); App.Medicine.Modification.eyebrowFullness = new Set(["pencil-thin", "thin", "threaded", "natural", "tapered", "thick", "bushy"]); diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js index 82896614a8fa6ad834f7b34fdb6b4ee56e1ca74d..c0933de54d97f45575dedee55e82c5a8609af8ae 100644 --- a/js/003-data/slaveSummaryData.js +++ b/js/003-data/slaveSummaryData.js @@ -1298,6 +1298,7 @@ App.Data.SlaveSummary = { "middle eastern": "ME", "black": "B", "pacific islander": "PI", + "catgirl": "CT", "malay": "M", "amerindian": "AI", "semitic": "S", @@ -1319,6 +1320,9 @@ App.Data.SlaveSummary = { "tan": "Tan", "bronze": "Bron", "ebony": "Ebon", + "black and white striped": "BnW", + "red": "Rd", + "yellow": "Ylw", "pure black": "P. Bla", "dark": "Dark", "fair": "Fair", diff --git a/js/utils.js b/js/utils.js index 6f40c2bcfe984c7b01c501bc0b17b1b41213dc9c..3ef5bd4eee47a1e3dc98cb2a3d5c84c062e176ce 100644 --- a/js/utils.js +++ b/js/utils.js @@ -410,6 +410,14 @@ function deepAssign(target, source) { } } +function raceMap() { + const map = new Map(App.Data.misc.filterRaces); + if (V.seeCats) { + map.set("catgirl", "Catgirl"); + } + return map; +} + /** * Returns the median value for an array * diff --git a/saveTools/fc_edit_save.py b/saveTools/fc_edit_save.py index 2fb96f25d87c0e490b3f0971d58347fa48733925..9868a8a245b581d29419100ea026c0fda6dbb9c4 100755 --- a/saveTools/fc_edit_save.py +++ b/saveTools/fc_edit_save.py @@ -257,7 +257,7 @@ SLAVE_ACTIONS = { "shouldersImplant=0", "hips=0~3", "hipsImplant=0", "boobsImplant=0", "boobsImplantType=none", "butt=1~4", "buttImplant=0", "buttImplantType=none", "face=atleast:50~100", "faceImplant=0", - "faceShape=normal|cute|sensual|exotic", "lips=21~70", "lipsImplant=0", + "faceShape=normal|cute|sensual|feline|exotic", "lips=21~70", "lipsImplant=0", "bellySag=0", "belly=0", "bellyImplant=0" ], "beautiful": [ diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index 2fea3ba36c58fd04e8637aab63dcbbd5983c7556..af8a891d0223a285fdb082d7eeeb5705a4399b8d 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -1752,6 +1752,7 @@ accepts string "middle eastern" "indo-aryan" "mixed race" +"catgirl" - catmod exclusive origRace: @@ -1793,6 +1794,9 @@ accepts string "black" "ebony" "pure black" +"black and white striped" -- catmod exclusive +"yellow" -- catmod exclusive +"red" -- catmod exclusive origSkin: @@ -2416,6 +2420,7 @@ accepts string (will be treated as "normal") "cute" "sensual" "exotic" +"feline" -- catmod exclusive lips: diff --git a/src/events/001-base/baseEvent.js b/src/004-base/baseEvent.js similarity index 100% rename from src/events/001-base/baseEvent.js rename to src/004-base/baseEvent.js diff --git a/src/Mods/Catmod/events/CMRESS/annoyingcat.js b/src/Mods/Catmod/events/CMRESS/annoyingcat.js new file mode 100644 index 0000000000000000000000000000000000000000..b8c8cde8f6eca38e60be2c24c9370374ec29c3df --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/annoyingcat.js @@ -0,0 +1,100 @@ +App.Events.CMRESSAnnoyingCat = class CMRESSAnnoyingCat extends App.Events.BaseEvent { + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + canMove, + s => s.race === "catgirl", + s => s.trust > 35, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, girl + } = getPronouns(eventSlave); + const {s, title} = getEnunciation(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let t = []; + t.push(`Although your catgirl slaves are beautiful, intelligent, and move across your penthouse with an almost supernatural grace, their feline charm and beauty comes at the expense of a number of less desirable feline traits coded deeply into their spliced DNA. One of these irritating genetic leftovers is their exceptional neediness, which, when combined with their playful nature, gives them an unfortunate tendency to attempt to get your attention through minor annoyances. Well, when they aren't terrified of you, at least.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`Sometimes this comes in the form of erotic teasing, offering calculated, teasing glimpses of their butts or tits to try and win your eye when they want attention. Other times, like when ${eventSlave.slaveName} loudly meows when you walk by, it's just by being a nuisance. Normally, such a little thing would be totally beneath your notice, but ${he}'s been purring annoyingly at your heels all day, flicking ${his} tail up against the base of your hips, and mrowling whenever you come close. ${He} doesn't even seem to want anything in particular, and the minor catlike annoyances have finally gotten on your nerves.`); + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + canDoAnal(eventSlave) + ? new App.Events.Result(`Roughly fuck ${his} ass to shut ${him} up`, annoyedfuck, analVirginWarning()) + : new App.Events.Result(), + new App.Events.Result(`Tell ${him} to stop being such a nuisance`, stopit), + new App.Events.Result(`Ignore ${him}`, ignore), + ]); + + function analVirginWarning() { + if (eventSlave.anus === 0) { + return `This option will take ${his} anal virginity`; + } + } + + function annoyedfuck() { + t = []; + t.push(`As ${eventSlave.slaveName} meows at you, you order the irritating cat${girl} to turn around, drop ${his} bottoms, lift ${his} tail and spread ${his} cheeks. As though to make the command's intent even more obvious, you ${PC.dick !== 0 ? "pull your cock free from your pants" : "take a strapon and slide it up your legs"} as the furball look at you in surprise for a moment. Without a word of protest, the cat${girl} simply turns, pulls ${his} bottoms just under ${his} asscheeks, and lifts up ${his} tail to show you ${his}`); + if (eventSlave.butt > 12) { + t.push("enormous, view-dominating furry ass."); + } else if (eventSlave.butt > 5) { + t.push("huge, rounded fluffy ass-globes."); + } else if (eventSlave.butt > 2) { + t.push("fat cat ass."); + } else { + t.push("slender kitten rear."); + } + App.Events.addParagraph(node, t); + t = []; + t.push(`${He} twists ${his} head to look at you as though to say something, but you don't give ${him} the chance as you grab ${him} by the hips, not so much as bothering to spit down for the slightest semblance of lube, and slam ${PC.dick !== 0 ? "your cock" : "the strapon"} into the cat${girl}'s round, furry ass, forcing yourself past the resistance of ${his} sphincter. You ruthlessly pound ${eventSlave.slaveName}'s ${eventSlave.skin} butt, holding ${him} in place around the hips as`); + if (PC.dick === 1) { + if (eventSlave.dick > 0) { + t.push(`your fat nuts batter ${his} pair into submission, bruising the low-hanging targets along with ${his} asshole with each extremely gay thrust. The violent, squirting orgasm ${he} has within a minute is probably no thanks to how hard you're busting ${his} furry balls with your own as you core out ${his} rear.`); + } + } else { + t.push(`${He} squeals and mrowls, writhing against you as you pound ${his} ass into submission until ${he} jerks out with an explosive, wriggling squirtgasm against the floor.`); + } + t.push(`Shortly after, you ${PC.dick !== 0 ? "hilt yourself in the betacat's furry butt and shoot a half-dozen thick, hot ropes of cum up their colon" : "achieve a powerful, mind-fogging orgasm yourself"}, pulling yourself free and releasing the annoying cat's hips. ${eventSlave.slaveName} gasps like ${he}'s out of oxygen, fluid dripping out from ${his} brutalized asshole, and <span class="devotion inc"> yips out a brief, happy-sounding apology for being annoying.</span>`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.devotion += 2; + seX(eventSlave, "anal", V.PC, "penetrative"); + return t; + } + + function stopit() { + let t = []; + t.push(`You grab ${eventSlave.slaveName} by the hand and tell ${him} to stop being so goddamn annoying. ${He} cocks ${his} head at you, apparently genuinely confused, and then huffs out a loud exhale. ${canTalk(eventSlave) ? `"Uh, ${s}orry, ${title}, I wa${s}n't trying to be annoying or anything..." ${He} mewls,` : `${He} makes a second weird, apologetic sounding noise,`} then scurries off when you let ${him} go with ${his} <span class = "trust dec">ears flat against ${his} head.</span>`); + eventSlave.trust -= 3; + return t; + } + + function ignore() { + let t = []; + t.push(`You completely ignore ${eventSlave.slaveName} as ${he} mrowls at you and go about your day. You're far too busy to deal with some needy cat nonsense. ${eventSlave.slaveName} gets a little louder, and then louder still throughout the day, subtly demanding your attention for no particular reason, until ${he} finally gets that you're outright ignoring ${him} and trots off somewhere to <span class = "devotion dec">sulk</span> angrily at you not playing into ${his} childish - or at least animalistic - antics.`); + eventSlave.devotion -= 3; + return t; + } + } +}; diff --git a/src/Mods/Catmod/events/CMRESS/catLove.js b/src/Mods/Catmod/events/CMRESS/catLove.js new file mode 100644 index 0000000000000000000000000000000000000000..9629b74a34fdb502cf32bdcbca7a47fb3e68dbfd --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/catLove.js @@ -0,0 +1,133 @@ +App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent { + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + canMove, + s => s.race === "catgirl", + s => s.devotion > 90, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, His, him, himself, girl + } = getPronouns(eventSlave); + const {s, title} = getEnunciation(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let t = []; + t.push(`As you walk out from the office to your bedroom late in the evening, ${eventSlave.slaveName} approaches you in the halls, holding something behind ${his} back with both hands. ${His} tail swishes nervously from side to side behind ${him}. The instant you open your mouth to ask what ${he}'s holding, the quivering cat${girl} thrusts out ${his} arms in front of ${him} to show you`); + if (eventSlave.intelligence + eventSlave.intelligenceImplant > 80) { + t.push("a beautiful, handdrawn icon portraying you as a godlike figure above a large collection of distinct catgirl faces."); + App.Events.addParagraph(node, t); + + t = []; + t.push(`${eventSlave.slaveName} ${him}self is prominently displayed at the center of the catfolk at the bottom of the image, all of whom are looking up to you with big, worshipful smiles across their faces, pointed ears perked up. The bright golden hues make it look like a religious icon, but instead of a halo you're surrounded by two complex-looking genetic tubes; the faces of Dr. Nieskowitz and some other wizened scientists hang around you like angels. It's incredibly well-made, and even inlaid with a few sparkly things that seem to be whatever ${eventSlave.slaveName} could find lying around. ${canTalk(eventSlave) ? `"I, uhm, wanted to make you ${s}omething nice, ${title}..." ${eventSlave.slaveName} meows out sheepishly as ${he} holds the icon out towards you. "You made all of u${s}, and um, well, you're ${s}o good and pretty and everything..." ` : `${He} just holds out the icon, staring at you with big ${App.Desc.eyesColor(eventSlave)} that hope you get the meaning.`}`); + App.Events.addParagraph(node, t); + } else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) { + t.push("an elegant, small clay sculpture portraying you surrounded by a few happy catgirls."); + App.Events.addParagraph(node, t); + + t = []; + t.push(`${He} holds the little sculpture out to you with wobbly hands, finding it hard to balance the unwieldy thing as you examine ${his} craftscatship. The sculpture is surprisingly pretty; one of the slaves around you is obviously supposed to be ${eventSlave.slaveName}, and they're all burshing up against you lovingly with individual expressions of happiness tediously moulded onto their faces. ${canTalk(eventSlave) ? `"I thought you might like a better gift, so I found ${s}ome clay in the workshop and made thi${s}, ${title}." ${eventSlave.slaveName} says, struggling to hold the awkward sculpture. "You're ${s}o nice to me and I like you ${s}o much, I, um, wanted to give you ${s}omething to ${s}how how much I love you..." ` : `${He} holds the sculpture out obediently as you examine it, ears twitching atop ${his} head as ${he} eagerly awaits your judgement.`}`); + App.Events.addParagraph(node, t); + } else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 35) { + t.push("a pretty drawing of the two of you cuddling one another happily."); + App.Events.addParagraph(node, t); + + t = []; + t.push(`${He} displays the drawing proudly. It's surprisingly well-drawn, especially considering ${his} awkward, furry hands, and ${he}'s rendered all your features flatteringly with ${eventSlave.slaveName} lovingly cradling up against your chest like an old-world girlfriend. It's obvious that ${he}'s put a lot of work into drawing this, likely in ${his} spare time after finishing the day's assignments. ${canTalk(eventSlave) ? `"I hope you like it, ${title}!" ${eventSlave.slaveName} says, eagerly watching your face as you study the nice drawing. "I worked really hard on it, but it'${s} okay, becau${s}e I got to look at your face the whole time, and you're really really pretty, ${title}..." ` : `${He} holds the drawing out enthusiastically, obviously proud of ${his} work and silently waiting for you to decide whether you're proud of it too.`}`); + App.Events.addParagraph(node, t); + } else { + t.push("a heart cut out of red construction paper showing crude figures of you and a catgirl holding hands and smiling."); + App.Events.addParagraph(node, t); + + t = []; + t.push(`Upon closer inspection, the crude cat figure is clearly intended to be ${eventSlave.slaveName}, and the two of you are standing above big white text written in what looks like crayon reading "I LUV U ${V.PC.title !== 0 ? `MASTER` : `MISTRESS`}". ${eventSlave.slaveName} trembles a little as you look at the simple drawing. ${canTalk(eventSlave) ? `"I'm ${s}-${s}orry ${title}..." ${eventSlave.slaveName} meows weakly, still holding out ${his} heart. "I w-wanted to make you ${s}omething pretty like everybody else because I love you ${s}o m-much, but I can't draw good like them, ${title}... I h-hope you like it..." ` : `${He} holds hi${s} little paper heart out for you, staring at you with big wide ${App.Desc.eyesColor(eventSlave)} as ${his} ears flatten preemptively, apparently expecting you to hate the crude offering.`}`); + App.Events.addParagraph(node, t); + } + + App.Events.addResponses(node, [ + new App.Events.Result(`Tell ${him} that ${he} can show ${his} devotion best with a heartfelt ${PC.dick !== 0 ? "blowjob" : "cunnilingus sesh"}`, blowjob), + new App.Events.Result(`Take the present and let ${him} cuddle up to you`, cuddle), + new App.Events.Result(`Hang it in your display case`, displaycase), + new App.Events.Result(`Tear it in two, scold ${him} for wasting time making worthless trinkets, and tell ${him} to get back to work`, breakheart), + ]); + + function blowjob() { + let t = []; + t.push(`You take ${eventSlave.slaveName}'s present and tell ${him} that ${he} can better show you just how much ${he} cares by getting on ${his} knees and giving you ${PC.dick !== 0 ? "a blowjob" : "some pussy eating"} from the heart.`); + if (eventSlave.sexualFlaw !== "hates oral") { + t.push(`The cat${girl} flashes you a smile full of sharp feline fangs that makes you rethink your decision for a brief moment before ${he} squats down, pressing out ${his} ass far enough to give you a good view of those furry cheeks as ${he} works your pants down, and`); + if (eventSlave.skill.oral >= 80) { + t.push(`${PC.dick !== 0 ? `gives you a magnificient, loving throatjob, taking your cock as far as it can bury itself in ${his} throat while working every last drop of cum out from your balls with ${his} soft, furry hands,` : `eats you out skillfully and intensely, working ${his} rough cat tongue deep into your pussy until ${he} brings you to a shuddering orgasm,`}`); + t.push(`<span class="devotion inc">pointy ears twitching happily atop ${his} head the entire time.</span>`); + } else if (eventSlave.skill.oral > 40) { + t.push(`${PC.dick !== 0 ? `gives you a skillful blowjob, carefully avoiding scratching your dick on ${his} fangs as ${he} soon brings you to a powerful orgasm down ${his} throat,` : `tongefucks you hard, burying ${his} soft button nose against your clit as ${he} works out an orgasm from your pussy,`}`); + t.push(`<span class="devotion inc">fluffy tail waggling behind ${him} the whole time almost doggishly.</span>`); + } else { + t.push(`${PC.dick !== 0 ? `does ${his} best to give you a good blowjob, mostly nervously trying to avoid cutting your dick on ${his} sharp fangs until ${his} warm, amateurish mouth finally coaxes an orgasm out of you,` : `eats you out amateurishly, ${his} rough cat tongue scratching your folds slightly as ${he} twists it around to eventually bring you to orgasm,`}`); + t.push(`<span class="devotion inc">pointy ears wiggling around on ${his} head lovingly the enitre time.</span>`); + } + eventSlave.devotion += 2; + } else { + t.push(`${He} gives you a disgusted look owing to ${his} <span class="devotion dec">hate of oral,</span> but nevertheless gets on ${his} knees and begrudingly ${PC.dick !== 0 ? "gives you a powerful blowjob" : "eats you out passionately"}, wiping off ${his} mouth the second you cum.`); + eventSlave.devotion -= 2; + } + seX(eventSlave, "oral", V.PC, "penetrative"); + return t; + } + + function cuddle() { + let t = []; + t.push(`You gently take the handmade gift, pat ${eventSlave.slaveName} on ${his} fluffy head, and assure ${him} that it's beautiful. The cat${girl}'s entire face immediately lights up and ${he} launches ${himself} at you, wrapping ${his} furry arms around your waist in a hug so tight you have to place ${his} gift down on the ground to avoid dropping it. With the cat${girl} hugged so closely to your chest, you can hear ${him} <span class = "trust inc">purring like a motor</span> against you, swishing ${his} tail around behind ${him} in the close embrace. ${he} doesn't say anything else, just <span class = "devotion inc">lovingly purring against you</span> until you free yourself from the devoted cat${girl}'s embrace to get back to work.`); + eventSlave.trust += 5; + eventSlave.devotion += 5; + return t; + } + + function displaycase() { + let t = []; + t.push(`You take ${eventSlave.slaveName} by the hand, still holding ${his} little present, and lead ${him} over to your office. As ${he} looks at you confused, you gingerly take the`); + if (eventSlave.intelligence + eventSlave.intelligenceImplant > 80) { + t.push(`beautiful icon from ${his} hand, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest. ${canTalk(eventSlave) ? `"I'm ${s}o happy you like it, ${title}!" ` : `${He} purrs from the back of ${his} throat so intensely you can hear it against your heart`}, filled with <span class = "trust inc">safety</span> and <span class = "devotion inc">love from the bottom of ${his} heart.</span>`); + V.trinkets.push(`a gorgeous quasi-religious icon made by ${eventSlave.slaveName} showing you creating the catgirl race`); + } else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) { + t.push(`elegant clay sculpture from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then smiles wider than you've ever seen ${him} smile before and presses ${his} head against your chest, tears welling up in ${his} eyes. ${canTalk(eventSlave) ? `"You're the be${s}t -- the best ${title} in the whole wide world, ${title}!" She mrowls out while hugging you` : `${He} purrs from the back of ${his} throat so intensely you can hear it against your heart`}, filled with <span class = "trust inc">safety</span> and <span class = "devotion inc">love from the bottom of ${his} heart.</span>`); + V.trinkets.push(`a small, elegant clay sculpture made by ${eventSlave.slaveName} showing you surrounded by happy catgirl slaves`); + } else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 35) { + t.push(`pretty drawn picture from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} takes a moment to process what's happening, then chokes out a shocked meow, opens ${his} mouth, half-meows again, and stutters. ${canTalk(eventSlave) ? `"Y-you really like it that much, ${title}?" She squeaks, and then, tears forming in the corner of ${his} eyes, launches into a tight, warm hug around your waist.` : `Incapable of saying anything further, ${he} simply launches himself at you and hugs you so tight it nearly squeezes on your ribs, tears forming at the corner of ${his} eyes.`} ${He}'s filled with the kind of <span class = "trust inc">safety</span> and <span class = "devotion inc">love from the bottom of ${his} heart</span> that only comes from genuine adoration.`); + V.trinkets.push(`a pretty drawing of you and ${eventSlave.slaveName} cuddling together peacefully`); + } else { + t.push(`construction paper heart from ${his} hands, open your display case with a twist of your private key, and place it inside. ${eventSlave.slaveName} looks at you, looks at the display case, looks back at you, and then suddenly breaks into tears. ${canTalk(eventSlave) ? `"${title} -- I l-love you ${s}o much --" She almost whimpers, before hugging ${himself} around your waist so tight it feels like ${he}'s squeezing down your ribs.` : `${He} simply sobs for a few moments, then hugs you with so much furry warmth that you swear you can feel ${his} heart beating against yours.`} ${He}'s filled with the kind of <span class = "trust inc">safety</span> and <span class = "devotion inc">love from the bottom of ${his} heart</span> that only comes from genuine adoration.`); + V.trinkets.push(`a red construction paper heart with crude crayon figures of you and ${eventSlave.slaveName} holding hands above text reading "I LUV U ${V.PC.title !== 0 ? `MASTER` : `MISTRESS`}"`); + } + eventSlave.trust += 20; + eventSlave.devotion += 20; + return t; + } + + function breakheart() { + let t = []; + t.push(`You take the loving gift from the quivering cat${girl}'s hands, tear it in half in a single, explosive motion, and let the two ripped pieces fall to the ground. ${eventSlave.slaveName} stares at you bewildered for a second before tears start to well up at the corners of ${his} eyes. As you open your mouth to scold ${him}, ${he} starts <span class = "devotion dec">sobbing uncontrollably</span>, crying in loud, ugly bawls that make it completely impossible to speak. When you order ${him} to stop, ${he} turns away from you, still sobbing, and <span class = "trust dec">sprints out of the hallway</span> while some of your other slaves watch with a mixture of terror and shock on their faces. One of them trots off behind the bawling cat, probably either to comfort ${him} or rape ${him} while ${he}'s vulnerable. Irritated, you set a note for yourself to harshly punish the disobedient catslave later.`); + eventSlave.trust -= 10; + eventSlave.devotion -= 40; + return t; + } + } +}; diff --git a/src/Mods/Catmod/events/CMRESS/catPresent.js b/src/Mods/Catmod/events/CMRESS/catPresent.js new file mode 100644 index 0000000000000000000000000000000000000000..9b5fa7eb5a680925ea2295ca26319d095115e796 --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/catPresent.js @@ -0,0 +1,242 @@ +App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEvent { + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + canMove, + s => s.race === "catgirl", + s => s.devotion > 20, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, His, girl + } = getPronouns(eventSlave); + const {s, title} = getEnunciation(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + if (V.noDeadShit === 0) { + V.catPresent = jsEither([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + } else { + V.catPresent = jsEither([0, 1, 5, 6, 8, 9]); + } + + let t = []; + t.push(`Catgirl slaves are almost perpetually a handful. One of the many things you've discovered in owning genetically modified cats spliced with human DNA is that regardless of their actual intelligence, they almost universally retain the unusual feline quality of delivering bizarre, often recently killed "presents" as a way to show affection.`); + App.Events.addParagraph(node, t); + + if (V.catPresent === 0) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a bundle of credits in one of ${his} furry hands. ${He} proudly drops the small wad of cash on your desk, beaming up at you with a mouthful of feline fangs. ${canTalk(eventSlave) ? `"Look what I found, ${title}! Someone dropped all this, ${s}o now it's your${s}!"` : `${He} swishes ${his} tail from side to side, apparently waiting for you to take the mysterious money.`} There's maybe two hundred credits worth of small bills here. It looks more like ${he} lifted some poor guy's wallet than 'found' this on the ground.`); + V.niceCatPresent = 1; + V.junkCatPresent = 0; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 1) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding a small, fluffy, brightly-colored toy in ${his} mouth. The cat${girl} confidently walks up to your desk as though about to discuss some important matter of business, then opens ${his} mouth to drop it right in front of you, slick with ${his} drool. ${canTalk(eventSlave) ? `"Thi${s} i${s} my favorite toy, ${title}! So I wanted it to be your favorite toy too!"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`} You stare blankly for a moment at the fully-grown, obstensibly intelligent cat${girl} asking you to play with a drooled-on cat toy.`); + V.niceCatPresent = 0; + V.junkCatPresent = 1; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 2) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying what looks like a dead rat in ${his} mouth. ${He} walks right up to your desk and opens ${his} mouth to show off equally bloodstained fangs, dropping the dead rodent onto your desk with a wet plop of blood and saliva, where it proceeds to bleed out in the middle of the desk. ${canTalk(eventSlave) ? `"Look, ${title}! I ${s}aw this gros${s} rat running around the garden ${s}o I killed it. Are you proud of me?"` : `${He} looks enormously proud of ${himself} for killing a rodent that's smaller than ${his} fist and dropping the mutilated body in front of you.`}`); + V.niceCatPresent = 0; + V.junkCatPresent = 0; + V.deadCatPresent = 1; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 3) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a dead rat on your desk which is now creating a red puddle around itself. ${eventSlave.slaveName} just smiles ear-to-ear at you with what seems like genuine pride and a mouth full of sharp fangs, which you now realize are streaked with blood.`); + V.niceCatPresent = 0; + V.junkCatPresent = 0; + V.deadCatPresent = 1; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 4) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a dead rat on your desk - or at least, you assume that the furry thing bleeding out is dead, until it twitches its leg, scampers up, and leaps off your desk, attempting to scurry out of the room. ${eventSlave.slaveName}'s stilted eyes go wide and ${his} tail perks up, and before you can even issue an order ${he}'s leaped atop the fleeing, injured rat, pinning the tiny thing down and sinking ${his} sharp fangs into it without a moment of hesitation. ${He} shakes his head violently from side to side, apparently trying to snap the vermin's spine, then stands up, walks back to you, opens ${his} mouth and drops the disgusting, bleeding, mutilated rat corpse on your desk. Again. ${canTalk(eventSlave) ? `"Did you ${s}ee me kill it, ${title}!? I did good, right?"` : `${He} smiles ear to ear at you, waiting for you to take the 'present'.`}`); + V.niceCatPresent = 0; + V.junkCatPresent = 0; + V.deadCatPresent = 1; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 5) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, carrying something indistinguishable in ${his} mouth. As ${he} walks over to your desk, ${he} opens ${his} mouth and drops it out with a wet plop in front of you, at which point you realize that ${he} has just dropped a bundle of small bills which ${he} was, for some inexcplicable reason, carrying around in ${his} mouth. They are drenched with ${his} saliva and completely ruined. You look at the pile of ruined currency and ask ${him} why ${he} didn't just carry it to you in ${his} hands. ${canTalk(eventSlave) ? `${eventSlave.slaveName} blinks twice. "Oh - um, yeah, I gues${s} I probably ${s}hould have done that, ${title}. Um- ${s}orry."` : `${He} looks down at the pile of ruined money, looks back up at you, and then blinks sheepishly.`} `); + V.niceCatPresent = 0; + V.junkCatPresent = 1; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 6) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a small ball of brightly colored string in front of you, beaming wide enough to show of ${his} pearly white fangs. ${canTalk(eventSlave) ? `"Look at thi${s}, ${title}! You can bat it around and ${s}tuff! I brought it to you becau${s}e I thought you'd have fun playing with it!"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`}`); + V.niceCatPresent = 0; + V.junkCatPresent = 1; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 7) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} practically bursts in, the ${eventSlave.skin} fur around ${his} mouth streaked red with blood and carrying an entire dead rabbit in ${his} mouth, the dead thing almost as big as ${his} entire head and hanging limply from between ${his} fangs. ${He} nearly sprints over to your desk, looking excited beyond belief as ${he} spits the large rabbit out in front of you, where the corpse splats against your desk in a splash of saliva and blood that flicks some liquid against your face. ${He}'s nearly quivering with excitement and pride. ${canTalk(eventSlave) ? `"Look! Look! I killed a rabbit, ${title}!! A whole rabbit! I saw it out${s}ide and cha${s}ed it down ${s}o you could hang it up on your wall! Did I do good, ${title}?"` : `${He} looks absolutely overjoyed with ${himself} for having killed something bigger than a rat for once.`}`); + V.niceCatPresent = 0; + V.junkCatPresent = 0; + V.deadCatPresent = 1; + App.Events.addParagraph(node, t); + t = []; + } else if (V.catPresent === 8) { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand.${He} walks right up to the desk and drops a shiny, gorgeous ring in front of you, beaming wide enough to show of ${his} pearly white fangs. This looks like a valuable piece of jewlery, easily worth a few thousand credits at least. You ask ${him} where ${he} got this as you examine the expensive thing. ${canTalk(eventSlave) ? `"I found it, ${title}! That mean${s} it'${s} your${s} now."` : `However, given that ${he} is totally mute, ${he} just stares back at you while smiling. You don't think you're going to get any answers there.`}`); + V.niceCatPresent = 1; + V.junkCatPresent = 0; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } else { + t = []; + t.push(`As you sit working at your desk, ${eventSlave.slaveName} trots in, holding something bright in one hand. ${He} walks right up to the desk and drops a lump of shiny metal in front of you, beaming wide enough to show of ${his} pearly white fangs, which glint almost as brightly as the metal. ${canTalk(eventSlave) ? `"Look what I found, ${title}! You can put it on your wall or ${s}omething. I${s}n't it pretty?"` : `${He} stares at you playfully and wiggles ${his} butt from side to side behind ${him}.`}`); + V.niceCatPresent = 0; + V.junkCatPresent = 1; + V.deadCatPresent = 0; + App.Events.addParagraph(node, t); + t = []; + } + + App.Events.addResponses(node, [ + new App.Events.Result(`Tell ${him} that some under the desk oral would be a better present`, blowjob), + new App.Events.Result(`Accept the present`, yes), + new App.Events.Result(`Reject ${his} 'gift'`, no), + (V.catPresent === 7) + ? new App.Events.Result(`Have the rabbit cooked and eat it with ${him}`, rabbit,) + : new App.Events.Result(), + (V.deadCatPresent === 1) && (V.noDeadShit === 0) + ? new App.Events.Result(`Tell ${him} to stop dropping dead things on your desk`, noMoreDeadShit,) + : new App.Events.Result(), + (V.noDeadShit === 1) + ? new App.Events.Result(`Take the present and tell ${him} ${he} can hunt for you again`, moreDeadShit,) + : new App.Events.Result(), + ]); + + function blowjob() { + let t = []; + if (V.deadCatPresent === 1) { + t.push(`You brush the disgusting dead animal off your desk and suggest that ${eventSlave.slaveName} could better show ${his} affection by climbing under your desk ${himself} and ${PC.dick !== 0 ? "sucking you off" : "eating you out"} while you work. Although ${eventSlave.slaveName} looks briefly dissapointed as you push ${his} fresh new kill away, ${he} eagerly dives beneath the desk without so much as bothering to wipe the blood from around ${his} mouth. You briefly question the decisions that lead to this point as you feel soft fur stained with hot, fresh animal blood bristle against your crotch.`); + App.Events.addParagraph(node, t); + + t = []; + } else { + t.push(`You brush the strange present off your desk and suggest that ${eventSlave.slaveName} could better show ${his} affection by climbing under your desk ${himself} and ${PC.dick !== 0 ? "sucking you off" : "eating you out"} while you work. Although ${eventSlave.slaveName} looks briefly dissapointed as you push ${his} present away, ${he} gets down beneath the desk at your suggestion, settling down on ${his} knees while you get to work with the sensation of a soft, fuzzy face rubbing up against your crotch.`); + App.Events.addParagraph(node, t); + + t = []; + } + if (eventSlave.sexualFlaw !== "hates oral") { + t.push(`The cat${girl} teases and bristles against you for a good minute as you get back to work before finally pulling your bottoms out of the way, doing ${his} best to disrupt your focus from the business deals in front of you as ${he}`); + if (eventSlave.skill.oral >= 60) { + t.push(`${PC.dick !== 0 ? `blows you nonstop while skillfully avoiding pricking you with ${his} fangs, working what must be a half-dozen loads from your dick throughout the workday. Your cock is basically holstered in ${his} throat as you work, and ${his} skillful attention to your nuts coaxes you back to action within minutes of blowing one load down ${his} throat,` : `tonguefucks you again and again, slaving away at your pussy to bring you to distractingly squirt and sputter against ${his} fuzzy face countless times while you try to work,`} the soft fur feeling divine between your thighs the whole time.`); + t.push(`<span class="devotion inc">When ${he} finally comes up from under the desk, ${he} smiles broadly, having serviced you for most of the working day.</span>`); + App.Events.addParagraph(node, t); + + t = []; + } else { + t.push(`${PC.dick !== 0 ? `serves at the altar of your cock as best ${he} can, occassionally distracting you from the nonstop blowjob as ${his} sharp fangs prick your dick. Despite ${his} amateur efforts, ${he} gets multiple orgasms out of you over the course of the next few hours, blowing you with enthusiasm and energy if not skill.` : `eats you out amateurishly over the next few hours, ${his} rough cat tongue scratching your folds slightly as ${he} twists it around to eventually bring you to orgasm - and then another, and another. ${He} does ${his} best to serve your cunt, even with ${his} mediocre skills.`}`); + t.push(`<span class="devotion inc">When ${he} finally comes up from under the desk, ${he} smiles broadly, having serviced you for most of the working day.</span>`); + App.Events.addParagraph(node, t); + + t = []; + } + eventSlave.devotion += 2; + } else { + t.push(`Although ${he} gives you a dutiful ${PC.dick !== 0 ? "blowjob" : "cunnilingus session"}, ${he} clearly doesn't enjoy the act of giving oral and scampers off the instant you finish, present forgotten.`); + App.Events.addParagraph(node, t); + + t = []; + eventSlave.devotion -= 2; + } + seX(eventSlave, "oral", V.PC, "penetrative"); + return t; + } + + function yes() { + if (V.catPresent === 0) { + t = []; + t.push(`You take the <span class = "green">wad of cash</span> as ${eventSlave.slaveName} smiles at you, thanking ${him} for bringing it. It's a relatively insignificant amount of money for someone as wealthy as you, although probably a significant sum to whatever poor sod lost it, but ${eventSlave.slaveName} swishes ${his} tail from side to side enthusiastically as you put the cash in your pocket. ${canTalk(eventSlave) ? `"Of cour${s}e, ${title}!" ${He} meows out,` : `${He} makes a satisfied purring noise,`} then leaves <span class = "devotion inc">with ${his} ears twitching happily.</span>`); + cashX(200, "event", eventSlave); + eventSlave.devotion += 2; + } else if (V.catPresent === 8) { + t = []; + t.push(`You pick up the <span class = "green">expensive ring</span>, deciding not to question how someone "lost" such an elaborate piece of jewlery. Neither the ethics nor the value of the shiny ring seem to register with ${eventSlave.slaveName}, despite her intelligence; it seems like ${he} doesn't actually care about how costly it is, only that you've accepted ${his} 'little' present. ${canTalk(eventSlave) ? `"It'll look pretty on you, ${title}!" ${He} mrowls,` : `${He} makes a satisfied purring noise,`} then leaves <span class = "devotion inc">with ${his} ears twitching happily.</span>`); + cashX(2500, "event", eventSlave); + eventSlave.devotion += 2; + } else if (V.junkCatPresent === 1) { + t = []; + t.push(`You pick up the piece of junk, examine it for a few moments, then smile back at ${eventSlave.slaveName} and thank ${him} for bringing you something that ${he} clearly personally treasures. ${eventSlave.slaveName}'s furry face lights up as you say that you like ${his} little present, even though it's totally useless to you, and ${his} tail starts to <span class = "devotion inc">swish from side to side happily behind ${him}.</span> ${canTalk(eventSlave) ? `"I'm ${s}o glad you like it, ${title}. I knew you would! I'm happy that you're my ${title}." ${He} says,` : `${He} makes a satisfied purring noise,`} then leaves you to file the small trinket away in one of your drawers.`); + eventSlave.devotion += 4; + } else { + t = []; + t.push(`You wince slightly as you pick up the dead, bleeding animal, pulling it off your desk before it can leak onto anything important. Even though you own ${eventSlave.slaveName} and have absolute power over ${him}, the look of anticipation and excitement on ${his} face is too much to resist, and you say that you're very proud of ${him} for doing such good hunting work. ${eventSlave.slaveName} beams a full mouth of bloody fangs at you, obviously <span class = "devotion inc">overyjoyed</span> at your praise. ${canTalk(eventSlave) ? `"I killed it for you, ${title}! I promi${s}e I won't let any gros${s} vermin dirty up the penthouse." ${He} mrows,` : `${He} makes a satisfied purring noise,`} then leaves you to quietly throw the dead animal into the nearby trashcan and call for another slave to clean up the blood.`); + eventSlave.devotion += 6; + } + return t; + } + + function no() { + if (V.niceCatPresent === 1) { + t = []; + t.push(`You push the 'found' offering away, shaking your head. You tell ${him} that it's a very nice offering to bring this to you, but then briefly explain that taking other people's money without giving them a choice is wrong, and that someone out there probably needs this more than you do anyway. ${eventSlave.slaveName} ${canTalk(eventSlave) ? `cocks ${his} head slightly. "How come taking people'${s} money without a choice is wrong but you en${s}lave lots of people then, ${title}?" Not wanting to get into an ethical debate with an overgrown housecat, you tell ${him} that it just is and to leave so you can get back to work. ${eventSlave.slaveName} gives you a puzzled look and then heads out.` : `${He} just makes a confused noise from the back of ${his} throat, then nods at you and heads out.`}`); + } else if (V.junkCatPresent === 1) { + t = []; + t.push(`You push the piece of junk into the trashcan to the side of your desk with one hand, ignoring the <span class = "devotion dec">dismayed</span> look that spreads across ${his} furry face as you do. You sternly tell ${him} to stop bothering you with useless junk and that have more important things to do than look at ${his} stupid cat toys and shiny rocks. ${canTalk(eventSlave) ? `"I'm - I-I'm ${s}orry, ${title}, I ju${s}t thought you'd like it..." ${He} weakly meows. You tell ${him} that you don't.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`} ${His} eyes look a little watery as ${he} leaves.`); + eventSlave.devotion -= 4; + } else { + t = []; + t.push(`You pick the disgusting dead animal up with one hand and drop the corpse into the trashcan next to your desk. Once it's off your workspace, you proceed to sternly tell ${eventSlave.slaveName} that what ${he} just did is disgusting, unsanitary, and incredibly infantile, and that ${he} could have ruined something important by dropping a filthy corpse in the area where you conduct multinational busiiness deals. ${canTalk(eventSlave) ? `"S-${s}orry, ${title}... I wa${s} ju${s}t... really proud of it, I gues${s}... I killed it for you..." ${He} weakly meows.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness.`} You tell ${him} to clean up the mess ${he} made on your desk, glaring at the overxcitable cat${girl}. ${His} eyes look a <span class = "devotion dec">little watery</span> as ${he} leans over the surface and gets to cleaning off the blood.`); + eventSlave.devotion -= 6; + } + return t; + } + + function rabbit() { + let t = []; + t.push(`You take a good look at the dead rabbit on your desk. For once, this thing actually looks kind of good. It's got two small puncture wounds just beneath its neck, but the corpse is almost totally intact, and it's pretty fat, too. With rabbit becoming an increasingly rare delicacy these days as desperate poachers violate the nature restrictions of old world governments too impotent to enforce them, you make up your mind to cook and eat this rare hunted treat. Placing your hands on the desk, you look back up at ${eventSlave.slaveName}, tell ${him} ${he}'s done an excellent job, and that you're going to have ${his} kill roasted and eaten. ${eventSlave.slaveName} practically quivers up and down with excitement at the praise, visibly excited that you're going to actually do something useful with ${his} present - and at the prospect of a real meal. After listening to ${him} gush your praises for a few minutes, you send ${him} out to get back to work. Later in the evening, the two of you enjoy delicious roast rabbit together, cooked with golden-brown crispy skin and a tender inside that leaves traces of juice running down both of your cheeks. ${canTalk(eventSlave) ? `"You're the <span class = "devotion inc">be${s}t</span>, ${title}." ${He} mrows,` : `${He} stares <span class = "devotion inc">happily</span> for a long time into your eyes as you eat,`} bloody juice running down into the fur around ${his} mouth for the second time today.`); + eventSlave.devotion += 8; + return t; + } + + function noMoreDeadShit() { + let t = []; + t.push(`You slam your fist on the table loud enough that it makes ${eventSlave.slaveName} jump and ${his} tail to flick straight up in the air, the dead animal still bleeding out over your desk, and yell at the harebrained cat${girl} to stop dropping filthy fucking dead animals on your desk, and for that matter for all the rest of your idiotic catsluts to stop doing it too. ${eventSlave.slaveName} cowers in front of your desk as you yell at ${him}, all of ${his} pride and excitement at securing a kill on something immediately forgotten. ${canTalk(eventSlave) ? `"I - I d-didn't know you hated my hunting ${s}o much, ${title}," ${He} weakly meows. "I ju${s}t want to make you proud - u-uhm, I promi${s}e I'll ${s}top..." You tell ${him} that ${he} better, or you'll beat ${his} ass so red ${he} won't be walking for a month.` : `${He} makes a single, sad whimpering sound, all ${he}'s capable of given ${his} muteness. You tell ${him} that that better mean that ${he}'s going to stop, and ${he} weakly nods ${his} head up and down in confirmation.`} ${He} does ${his} best to hide ${his} <span class = "devotion dec">watering eyes</span> as ${he} gets to cleaning off your desk, but they're pretty obvious.`); + V.noDeadShit = 1; + eventSlave.devotion -= 10; + return t; + } + + function moreDeadShit() { + let t = []; + t.push(`You sigh as ${eventSlave.slaveName} drops a stupid present on your desk once more and wearily tell ${him} that ${he}'s allowed to hunt again. ${his} pointy ears immediately perk up, instantenously forgetting whatever it was that ${he}'d offered up to you in tribute just a few seconds ago. ${canTalk(eventSlave) ? `"Really!? I - thank${s}, ${title}! I'm gonna find lot${s} of stuff to kill for you, I promi${s}e! I'll be the be${s}t hunter ever!"` : `${He} wiggles ${his} butt from side to side enthusiastically and makes the loudest purring sound ${his} damaged vocal chords are capable of.`} You sigh in exasperation as the excitable cat${girl} bounds out of the room <span class = "devotion inc">enthusiastically</span>, mentally preparing yourself for whatever disgusting corpse ${he}'s liable to drop on your desk next to show off ${his} catlike adoration.`); + V.noDeadShit = 0; + eventSlave.devotion += 8; + return t; + } + } +}; diff --git a/src/Mods/Catmod/events/CMRESS/catWorship.js b/src/Mods/Catmod/events/CMRESS/catWorship.js new file mode 100644 index 0000000000000000000000000000000000000000..f1f8aae8f3fbea1efff5ae7d72389fa15f64ee0d --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/catWorship.js @@ -0,0 +1,93 @@ +App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.FSEgyptianRevivalist !== "undefined" + ]; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish === "dom", + canStand, + s => s.devotion > 20, + s => s.race === "catgirl", + s => App.Utils.hasFamilySex(s) || s.rules.release.slaves === 1 + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, girl, himself + } = getPronouns(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let t = []; + + t.push(`For a dominant catgirl like ${eventSlave.slaveName}, your arcology is a virtual paradise. The similarity of ${his} feline body to the ancient Egyptian Godesses ensures a steady stream of devout worshippers to pay their respects to every part of ${eventSlave.slaveName}'s body. To ${his} dominance-focused mind, this mostly means a steady stream of human toys.`); + App.Events.addParagraph(node, t); + t = []; + t.push(`Today, while walking through your penthouse, a series of high moans from the showers prompt you to step in and see what's going on. It looks like ${eventSlave.slaveName} has managed to get two of your other slaves kneeling down on either side of ${him}, one of them giving ${him} some intense oral while the other rims ${him} from behind, ${his} tail flicked high up in the air as the shower's water runs down over the little orgy. ${He}'s quivering a little from the force of the two worshipful tongues toying with all ${his} sensitive bits, but the cat${girl} still manages to give you a nice little smile as you come across the hedonistic scene.`); + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result(`Make all three worship under you instead`, groupworship), + new App.Events.Result(`Spitroast one of the bottom slaves with ${eventSlave.slaveName}`, spitroast), + new App.Events.Result(`Let ${him} enjoy ${himself}`, haveFun), + ]); + + function groupworship() { + t = []; + t.push(`You clear your throat, which causes the two slaves worshipping at ${eventSlave.slaveName}'s body to break away from their 'duties' and turn to face you in apparent surprise. Since ${eventSlave.slaveName} isn't the most dominant player in the showers anymore, all it takes is a single sharp order to bring all three of them, ${eventSlave.slaveName} included, on their knees in front of you, already working off your pants. Whatever minor annoyance ${eventSlave.slaveName} might have had about ${his} little worship session being interrupted is just about immediately quelled at the sight of your ${PC.dick !== 0 ? "cock" : "cunt"} the instant your underwear's pulled down, and you don't even have to say another word for the trifecta of slaves to get to work. As the other two kiss at your thighs, you pull ${eventSlave.slaveName}'s head up to the ${PC.dick !== 0 ? "head of your cock" : "flat of your cunt"} and tell ${him} that you've got something more fitting to worship at. ${eventSlave.slaveName} makes some fluttery <span class="devotion inc">doe eyes</span> at you as ${he} gets to work servicing ${his} owner, the two slaves to either side lapping at every inch ${he} doesn't hog greedily for ${himself}.`); + eventSlave.devotion += 2; + return t; + } + + function spitroast() { + t = []; + t.push(`You enter into the showers yourself, accompanied by the sound of ${eventSlave.slaveName}'s mewling moans and the gentle patter of water on skin and fur. Slipping off your pants and ${PC.dick !== 0 ? "gripping your dick with one hand" : "readying the strapon you bring with you for just these sorts of oppurtunities"}, the slave servicing ${eventSlave.slaveName}'s `); + if (eventSlave.dick > 0) { + t.push(`throbbing cock`); + } else if (eventSlave.vagina > 0) { + t.push(`drooling cunt`); + } else { + t.push(`smooth crotchfur`); + } + t.push(` yelps in surprise as you lift her up from the back, but doesn't resist as you angle and thrust ${PC.dick !== 0 ? "yourself" : "your strapon"} into her. The hard bucking immediately makes her service to ${eventSlave.slaveName}'s crotch uneven and shaky - but the sporadic lapping from your thrusts, combined with the second slave still worshipping her ass, just makes ${eventSlave.slaveName} even more of a gaspy mess. ${He} flutters ${his} big catlike eyes at you <span class="devotion inc">lovingly</span>, and leans forward to plant a <span class="trust inc">tender kiss</span> on your lips as you thrust forward into the bottom slave, before sputtering out the hardest orgasm you've ever seen with a tongue deep up ${his} ass, your lips locked together, and `); + if (eventSlave.dick > 0) { + t.push(`a pair of lips sealed around ${his} dick.`); + } else if (eventSlave.vagina > 0) { + t.push(`a second tongue up ${his} cunt.`); + } else { + t.push(`a soft tongue lapping at ${his} crotch.`); + } + eventSlave.devotion += 4; + eventSlave.trust += 4; + return t; + } + + function haveFun() { + t = []; + t.push(`No reason to interrupt a good thing. You content yourself to lean back against the entrance to the showers and watch as ${eventSlave.slaveName} gets ${his} two little slaves to pay their respects to the feline form, the one in front `); + if (eventSlave.dick > 0) { + t.push(`throating herself on cock`); + } else if (eventSlave.vagina > 0) { + t.push(`eating ${him} out with furry thighs locked against ${his} head`); + } else { + t.push(`lapping religiously at the smooth crotchfur`); + } + t.push(` while the one behind buries herself deep in feline asscheeks, looking like she's trying to get her tongue deep enough up ${eventSlave.slaveName}'s butt to french kiss the feline from behind. ${eventSlave.slaveName} skillfully manages both of ${his} worshippers with ${his} hands, running them through both slave's hair and bucking ${his} ass and crotch reactively against each of their faces. Maintaining an impressive composure against the onslaught of sensation, ${eventSlave.slaveName} gives you a quivering little smile as you look onto the depraved scene, clearly <span class="trust inc">happy</span> you've let ${him} engage in ${his} dominant tendancies uninterrupted.`); + eventSlave.trust += 10; + return t; + } + } +}; diff --git a/src/Mods/Catmod/events/CMRESS/lazyCat.js b/src/Mods/Catmod/events/CMRESS/lazyCat.js new file mode 100644 index 0000000000000000000000000000000000000000..1d69e5cd42438f8056ecccbedba31d6d59c3bb2b --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/lazyCat.js @@ -0,0 +1,159 @@ +App.Events.CMRESSLazyCat = class CMRESSLazyCat extends App.Events.BaseEvent { + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + canStand, + canMove, + s => s.race === "catgirl", + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, girl + } = getPronouns(eventSlave); + const {s, title} = getEnunciation(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let t = []; + t.push(`As you go about your busy workday, moving from room to room within the penthouse to oversee your slaves and attend to the countless small pieces of business that demand your eternal attention as the owner and master of a prominent arcology, a flash of striking ${eventSlave.skin} fur catches your eye. Although you have to do a double take to confirm what you're seeing, it couldn't be more clear once you do - ${eventSlave.slaveName} is curled up into a tight ball in a semi-hidden corner of the penthouse, having somehow shirked ${his} duties to take a nap in the middle of the workday.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`${eventSlave.slaveName} snores softly in ${his} little corner of the room, ${his} entire body folded up into a tight furry lump. As much as ${he}'s clearly breaching discipline and avoiding your authority, it's hard to deny how cute ${he} looks while ${he} sleeps.`); + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + canDoVaginal(eventSlave) + ? new App.Events.Result(`Wake ${him} up with a brain-rattling cunt-slamfuck`, pSlamFuck, pussyVirginWarning()) + : new App.Events.Result(), + canDoAnal(eventSlave) + ? new App.Events.Result(`Wake ${him} up with a brain-rattling ass-slamfuck`, bSlamFuck, analVirginWarning()) + : new App.Events.Result(), + new App.Events.Result(`Teach ${him} some discipline with a long, hard spanking`, spanking), + new App.Events.Result(`Give ${him} a good scolding and send ${him} back to work`, scolding), + new App.Events.Result(`Just let ${him} nap this one time`, letSleep), + ]); + + function pussyVirginWarning() { + if (eventSlave.vagina === 0) { + return `This option will take ${his} virginity`; + } + } + + function analVirginWarning() { + if (eventSlave.anus === 0) { + return `This option will take ${his} anal virginity`; + } + } + + function pSlamFuck() { + t = []; + t.push(`${PC.dick !== 0 ? "Your dick already hardening in your pants," : "Grabbing a strapon from your toy collection with malicious intent,"} you grab ${eventSlave.slaveName} by the top of ${his} fluffy head and slam yourself down on ${him}, weighing down ${his} body under yours as legs shoot out from the curled-up furball in pure shock. ${canTalk(eventSlave) ? `${He} loudly mrowls and thrashes under you at the rude awakening, meowing in frantic displeasure at the top of ${his} lungs as you work ${his} bottoms down with your free hand to expose ${his}` : `${He} kicks and squirms in surprise at the rude awakening, ${his} muteness making ${him} unable to voice any further displeasure as you forcefully pull ${his} bottoms down just over to expose ${his}`}`); + if (eventSlave.butt > 12) { + t.push("gargantuan, couch-like furred asscheeks."); + } else if (eventSlave.butt > 5) { + t.push("huge, rounded fluffy ass-globes."); + } else if (eventSlave.butt > 2) { + t.push("fat cat ass."); + } else { + t.push("slender kitten rear."); + } + App.Events.addParagraph(node, t); + t = []; + t.push(`Before the shocked cat can mount any further complaints, you wrest your arm around ${his} slender neck, feeling the fur bristle against your skin, lock ${him} in a firm chokehold, line yourself up, and promptly slam ${PC.dick !== 0 ? "your cock" : "the strapon"} into the cat${girl}'s soft cunt in one hard, pounding motion. Over the next few minutes, you jackhammer the helpless kitten's pussy as ${he} chokes and sputters around your powerful forearm, ${his} stilted eyes rolling up into ${his} head from the combination of oxygen deprivation and the thick rod hammering in and out of ${his} folds at lightning pace, each ruthless slam of your hips to ${his} butt making ${his} ${eventSlave.skin}-furred asscheeks ripple and slap loudly. Even though ${his} silky fur feels magnificent brushing against you and ${his} cunt feels better, the twitchy cat cums before you do, squirting all over your crotch as ${his} catlike eyes roll up and ${his} tongue lolls out stupidly from ${his} mouth. Finally, with your own lowers already drenched, you ${PC.dick !== 0 ? "cum deep and hard inside the catslut's pussy" : "achieve a powerful, mind-fogging orgasm yourself"}, pulling yourself free and standing up satisfied. You take a brief look down at ${eventSlave.slaveName}, sprawled out on the ground with ${his} tail straight up in the air, ${his} <span class="devotion inc">cunt drooling in a leaky puddle on the floor</span> and ${his} asscheeks slammed so hard you can see them glowing red throughout the fur, idly remind ${him} not to nap on the job, and go about the rest of your day.`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.devotion += 4; + seX(eventSlave, "vaginal", V.PC, "penetrative"); + if (canImpreg(eventSlave, PC)) { + knockMeUp(eventSlave, 40, 0, -1); + } + return t; + } + + function bSlamFuck() { + t = []; + t.push(`${PC.dick !== 0 ? "Your dick already hardening in your pants," : "Grabbing a strapon from your toy collection with malicious intent,"} you grab ${eventSlave.slaveName} by the top of ${his} fluffy head and slam yourself down on ${him}, weighing down ${his} body under yours as legs shoot out from the curled-up furball in pure shock. ${canTalk(eventSlave) ? `${He} loudly mrowls and thrashes under you at the rude awakening, meowing in frantic displeasure at the top of ${his} lungs as you work ${his} bottoms down with your free hand to expose ${his}` : `${He} kicks and squirms in surprise at the rude awakening, ${his} muteness making ${him} unable to voice any further displeasure as you forcefully pull ${his} bottoms down just over to expose ${his}`}`); + if (eventSlave.butt > 12) { + t.push("gargantuan, couch-like furred asscheeks."); + } else if (eventSlave.butt > 5) { + t.push("huge, rounded fluffy ass-globes."); + } else if (eventSlave.butt > 2) { + t.push("fat cat ass."); + } else { + t.push("slender kitten rear."); + } + App.Events.addParagraph(node, t); + t = []; + t.push(`Before the shocked cat can mount any further complaints, you wrest your arm around ${his} slender neck, feeling the fur bristle against your skin, lock ${him} in a firm chokehold, line yourself up, and promptly slam ${PC.dick !== 0 ? "your cock" : "the strapon"} into the cat${girl}'s round, furry ass in a brutish motion that forces yourself past any resistance from the poor kitten's sphincter. Over the next few minutes, you jackhammer the helpless kitten's asshole as ${he} chokes and sputters around your powerful forearm, ${his} stilted eyes rolling up into ${his} head from the combination of oxygen deprivation and the thick rod hammering in and out of ${his} folds at lightning pace, each ruthless slam of your hips to ${his} butt making ${his} ${eventSlave.skin}-furred asscheeks ripple and slap loudly. Even though ${his} silky fur feels magnificent brushing against you and ${his} ass feels better, the twitchy cat cums before you do,`); + if (eventSlave.dick > 0) { + t.push(`${his} sensitive dick blowing a desperate, impotent load against the ground as you core in ${his} fluffy ass, ${his} pointed ears twitching wildly atop ${his} head.`); + } else { + t.push(`squirting all over your crotch as ${his} catlike eyes roll up and ${his} tongue lolls out stupidly from ${his} mouth.`); + } + t.push(`Finally, with your own lowers already drenched, you ${PC.dick !== 0 ? "finish explosively up the catslut's furry ass" : "achieve a powerful, mind-fogging orgasm yourself"}, pulling yourself free and standing up satisfied. You take a brief look down at ${eventSlave.slaveName}, sprawled out on the ground with ${his} tail straight up in the air, ${his} <span class="devotion inc">ass quivering shakily </span> and ${his} asscheeks slammed so hard you can see them glowing red throughout the fur, idly remind ${him} not to nap on the job, and go about the rest of your day.`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.devotion += 4; + seX(eventSlave, "anal", V.PC, "penetrative"); + return t; + } + + function spanking() { + t = []; + + t.push(`You grab the snoozing furball by one pointy ear, the curled-up lump shooting into a surpised cat${girl} as you yank ${him} up by the grip on ${his} ear. The furry appendage twitches and squirms in your hand as though trying to escape as you practically drag the newly-awake cat over to your desk, one of ${his} eyes closed tight in a wince - the one under the ear you're pulling - as ${he} ${canTalk(eventSlave) ? `whines and mrowls, complaining about the sensitivity of ${his} ears` : `weakly scratches at your arm, ${his} one open eye giving you a pleading look,`} which you thoroughly ignore as you find your way to your desk, pull the squirming kitten over your knee, and take a moment to yank her bottoms up her rear, giving the helpless cat a painful, ass-splitting wedgie as you move your head down close to her ears to make your point.`); + App.Events.addParagraph(node, t); + t = []; + t.push(`"Did you seriously think no one would notice you sleeping in the middle of the day?" You all but hiss, holding ${eventSlave.slaveName}'s bottoms harshly up ${his} ass for a few seconds more to make ${him} whimper and squirm before you yank them down, showing off ${his}`); + if (eventSlave.butt > 12) { + t.push("gargantuan, couch-like furred asscheeks"); + } else if (eventSlave.butt > 5) { + t.push("huge, rounded fluffy ass-globes"); + } else if (eventSlave.butt > 2) { + t.push("fat cat ass"); + } else { + t.push("slender kitten rear"); + } + t.push(`and immediately delivering a powerful, open-handed slap to ${his} right asscheek. The forceful slap sears through the fur and makes ${his} tail jerk upwards as ${his} bubbly ass jiggles, ears flicking up in pain. Before ${he} can even yelp out in protest or react to the sharp, stinging pain, you land a second slap, then a third, loud smacking noises echoing across the room as you give the pinned cat a hard spanking. Over the next ten minutes, you absolutely blister the lazy cat${girl}'s furry ass, working into a rythmn of disciplined abuse that leaves the fluffy bitch sobbing and ${his} butt beaten so well you can see it glowing a painful, alluring cherry-red even through ${his} ${eventSlave.skin} fur. The second that you let go of the pinned cat and tell ${him} that ${he}'s free to leave, ${he} leaps off your knee,`); + if (eventSlave.fetish === "masochist") { + t.push(` turns around with tears rolling freely down ${his} cheeks as though to show off how brightly red you've bruised ${his} cheeks, wiggles ${his} beaten bottom, and smiles. ${canTalk(eventSlave) ? `"<span class="devotion inc">T-thank${s} for kicking my as${s}</span>, ${title}. I promise I'll, l-like, never nap at work again." It sounds less than authentic as the maso-kitty tugs up ${his} bottoms over ${his} red, furry butt with a wince,` : ` makes a <span class="devotion inc">heart symbol</span> with ${his} hands and presses it against ${his} burning ass so it looks red,`}`); + eventSlave.devotion += 4; + } + t.push(` then scurries off to tend to ${his}<span class="trust dec"> bruised and reddened asscheeks.</span>`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.trust -= 3; + return t; + } + + function scolding() { + let t = []; + t.push(`You wake ${eventSlave.slaveName} up with a firm shake, watch as ${he} yawns for a second before realizing that you're looming over ${him}, and then scatters into position with a shocked yowl. You absolutely chew ${him} out, yelling at the lazy cat about ${his} responsabilities and obligations as a slave and that you have every right to beat ${his} ass or far worse for such an offense. Although ${his} ears flatten to either side as you scold ${him}, ${he}'s clearly <span class = "trust inc">deeply relieved</span> that ${he} only got a chewing-out instead of anything worse this time around, and scurries off back to work the second you let ${him} go.`); + eventSlave.trust += 2; + return t; + } + + function letSleep() { + return `Eh, you have bigger problems to deal with, and frankly the sleeping furball is kind of adorable. You take a few more seconds to watch as ${he} peacefully snoozes, curled up into a tight ball with ${his} legs and arms hidden under ${his} fluffy body, then go back about your day. Around twenty minutes later, you see ${eventSlave.slaveName} on the security cameras waking up from ${his} nap, yawning and stretching out ${his} limbs before padding on back to work as though nothing happened at all, totally unaware that you found ${his} 'secret' sleeping spot. God, ${he}'s lazy.`; + } + } +}; diff --git a/src/Mods/Catmod/events/CMRESS/spoiledCat.js b/src/Mods/Catmod/events/CMRESS/spoiledCat.js new file mode 100644 index 0000000000000000000000000000000000000000..8e1a8d0bd6f01f487240d4edc6539de84f61f31e --- /dev/null +++ b/src/Mods/Catmod/events/CMRESS/spoiledCat.js @@ -0,0 +1,95 @@ +App.Events.CMRESSSpoiledCat = class CMRESSSpoiledCat extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.FSEgyptianRevivalist !== "undefined" + ]; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.assignment === Job.PUBLIC || s.assignment === Job.WHORE, + s => s.fetish !== "mindbroken", + canStand, + canMove, + s => s.race === "catgirl", + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, girl + } = getPronouns(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let t = []; + + t.push(`Catgirl slaves have brought with them the kind of religious revivalism only possible when you can literally kiss your goddess' ass to your Egyptian revivalist society. The Arcology has responded to the public appearance of catgirls with all manner of fascinating cultural and religious ceremonies. The exceptional rarity of catgirls means that those few who regularly appear in public are lavished with attention and affection, purely on the virtue of their feline features' resemblance to the ancient Egyptian Goddesses.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`Although the new religious and cultural festivals and performances featuring your new catgirls - and, more typically, cat tits and ass - are both creative and entertaining, the public's worshipful love of catgirls does have the unfortunate effect of absolutely spoiling the narcissitic kittens. ${eventSlave.slaveName} in particular has been in the public eye a lot recently, both to do ${his} job and to appease the public eye for cats in theatre.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`Being regularly referred to as a goddess and offered gifts and praise by the adoring public has clearly started to go to ${his} head. ${He} walks around the penthouse with a smug swagger, lounges around with ${his} little 'offerings', and even asks the other girls to do small tasks for ${him} regularly as though ${he}'s a step above in the hierarchy. It might be time to knock ${eventSlave.slaveName}'s furry ass down a peg or two. On the other hand, encouraging preferential treatment of cat slaves would undoubtedly help advance Egyptian cultural values to the public...`); + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result(`Give ${him} a hard public spanking`, spanking), + new App.Events.Result(`Encourage ${his} special treatment`, goddess), + new App.Events.Result(`Let ${him} keep playing "Goddess" in public, but make sure ${he} knows where ${he} belongs - under your ${PC.dick !== 0 ? "dick" : "cunt"}`, godme), + ]); + + function spanking() { + t = []; + + t.push(`You decide to fix ${eventSlave.slaveName}'s little arrogance problem with the tried-and-true method of beating ${his} ass red. You tell the smug-looking cat${girl} that you'll be taking a walk with ${him} to the plaza today, which immediately excites ${him} due to the prospect of showing up in another small festival or performance. Once you're there, however, in the midst of the day-to-day crowd, you order the pleased-looking cat to drop ${his} pants and get over your knee. The smile very quickly fades from ${his} face. After a moment of hesitation, realizing what's about to come, the cat${girl}'s pointy ears droop to either side and ${he} very slowly removes ${his} lowers, taking a position over your knee with ${his} bare ass out to the public. ${He} mumbles out some whine to 'not ruin my reputation too badly', which you respond to via a hard slap to ${his} bare asscheeks. As the crowd watches, you absolutely blister ${eventSlave.slaveName}'s furry ass as the public's "goddess" of a kitten mrowls and squirms, beating ${his} butt so red you can all but see the cheeks glowing through ${his} fur. At the end of it, once you've spanked the sniffling cat nearly purple, you have ${him} stand up, cup ${his} beaten asscheeks while facing away from the crowd, and apologize for ${his} "smug behavior". `); + App.Events.addParagraph(node, t); + t = []; + if (eventSlave.fetish === "masochist") { + t.push(`The pathetic maso-kitty is practically <span class="devotion inc">drooling with arousal</span> as you order ${him} to get ${his} fuzzy butt back over to you, even through the tears.`); + eventSlave.devotion += 5; + } + if (eventSlave.fetish === "humiliation") { + t.push(`The total humiliation addict <span class="devotion inc">quivers</span> as the crowd watches a Goddess get ${his} fuzzy ass mercilessly beaten.`); + eventSlave.devotion += 5; + } + t.push(` After you're satisfied with ${his} public apology, the <span class="trust dec">sniffling</span> cat${girl} scampers back to you, pulling ${his} bottoms back up over ${his} unexpectedly beaten cheeks. The public <span class="red">dissaproves</span> of such cruel treatment of holy icons, even if they might have enjoyed watching ${his} ass get smacked raw.`); + App.Events.addParagraph(node, t); + t = []; + repX(-500, "event", eventSlave); + eventSlave.trust -= 10; + return t; + } + + function goddess() { + let t = []; + t.push(`You decide that it probably can't hurt to just let people continue treathing ${eventSlave.slaveName} like a little Goddess. After all, ${he}'s not challenging your authority with all this roleplay, and it's kind of cute. For ${his} half,${eventSlave.slaveName} is more than <span class="devotion inc">happy</span> to keep playing at being an ancient Egyptian deity, and the worshipful treatment has clearly made ${him} more <span class="trust inc">confident</span> too. A few days later, you see ${eventSlave.slaveName} at work, dressed up in full Egyptian regalia, two citizens kneeling behind ${him} and lavishing praise on the "goddess" as they kiss ${his} furry asscheeks through the silk. ${eventSlave.slaveName} waves to you, apparently <span class="lightcoral">loving the dominance.</span> The more submissive - and religious - citizens of your arcology seem to be <span class="green">enjoying it too.</span>`); + eventSlave.trust += 10; + eventSlave.devotion += 10; + eventSlave.fetishStrength = 10; + eventSlave.fetish = "dom"; + eventSlave.fetishKnown = 1; + repX(750, "event", eventSlave); + return t; + } + + function godme() { + t = []; + t.push(`You call ${eventSlave.slaveName} into your office, and, without explanation, tell ${him} to get to work servicing your ${PC.dick !== 0 ? "cock" : "cunt"}. The catslave seems somewhat surprised, but doesn't protest, kneeling down and getting to work pulling your pants out of the way. When ${he}'s ${PC.dick !== 0 ? "managed to get your dick down ${his} throat," : "gotten to work eating you out with ${his} rough cat tongue up your cunt,"} you inform ${him} that ${he}'s been acting more than a little smug recently, and that ${he} needed a little reminder of ${his} place. With one hand, you grab the cat${girl}'s soft hair and pull ${him} tightly forward,${PC.dick !== 0 ? `burying ${him} so deep onto your dick ${he} has to stretch ${his} jaw to avoid pricking you with ${his} fangs` : `flattening ${his} nose against your crotch with ${his} tongue buried deep into your pussy`}, forcing ${him} to look up at you with big, wide, stilted cat eyes, ${his} mouth dedicated to your genitals. You tell ${him} that no matter how much the public kisses ${his} ass, ${he}'ll always be a mewling little slave groveling under your ${PC.dick !== 0 ? "dick" : "pussy"}. The slave${girl} nods enthusiastically and you let go of ${his} head, letting ${him} finish you off with some <span class="devotion inc">intense oral.</span> For the rest of the week, the public continues to lavish attention and <span class ="green">love</span> onto the public-facing cat${girl}, but at the slightest gesture from you ${he} wiggles ${his} furry ass back in groveling, slavish devotion.`); + eventSlave.devotion += 15; + repX(400, "event", eventSlave); + return t; + } + } +}; diff --git a/src/Mods/Catmod/events/SoSBombing.tw b/src/Mods/Catmod/events/SoSBombing.tw new file mode 100644 index 0000000000000000000000000000000000000000..646509dd50178fd97e82d45a95e3e9a514f4a8b3 --- /dev/null +++ b/src/Mods/Catmod/events/SoSBombing.tw @@ -0,0 +1,90 @@ +:: RE sos bombing [nobr] + +<<set $nextButton = "Continue", $encyclopedia = "The Sons of Sekhmet">> +<<set $nextLink = "RIE Eligibility Check">> + +<<if random(1,2,3,4) == 1>><<set $sekhmetbombplot = 1>><<else>><<set $sekhmetbombplot = 2>><</if>> + +While working at your desk, your security team sends you an urgently-marked bulletin. The security update enclosed is fairly simple; the security staff think they've got a "reasonable lead" on a potential terrorist operation by the Sons of Sekhmet to bomb a few essential locations in the arcology, sometime in the next few days. +<br><br> +Although they're not positive, they're requesting a few thousand credits in additional funding for the resources they'll need to properly investigate the potential cell and launch a raid. Although a public operation would no doubt look bad in the public eye if it failed to produce results, not to mention the money you'd spend, ignoring the potential of a bombing campaign could be absolutely disasterous - and cost you many times more that whatever you'd spend shutting down Sekhmeti cells. Ultimately, though, the decision on whether to give the raid the go-ahead or not is up to you. +<br><br> + +<span id="result"> +<<if $arcologies[0].FSNeoImperialistLaw1 == 1>> +<br> <<link "Authorize the raid, but give your Imperial Knights authority over it">> + <<replace "#result">> + <<if $sekhmetbombplot == 1>> + You authorize the raid, bringing in your Knights to captain the effort. Early in the morning the next day, the heavily-armed Knights burst into an old warehouse in the lower sectors, interrupting a group of Sekhmeti terrorists bulding a series of improvised bombs on a bunch of turned-over crates. As the bombmakers scramble for their weapons, your Knights absolutely slaughter the group, blasting the scene to pieces with heavy firepower and shrugging off the helpless potshots the terrorists make with their ultra-heavy Imperial Plate. Although the overzealous Knights don't leave you anything left to enslave, the media are on the scene within minutes, and the interviews with smiling, unscathed Knights in their elegant coats of armor in front of the scene of an utterly destroyed terrorist cell is a @@.green;good look@@ for your arcology. + + <<run cashX(-5000, "event")>> + <<run repX(2500, "event")>> + <<else>> + You authorize the raid, bringing in your Knights to captain the effort. Early in the morning the next day, the heavily-armed Knights burst into a small apartment in the lower sectors, nearly giving the old woman in the living room a heart attack. Multiple men in ultra-heavy Imperial Plate all but burst through the walls of the apartment to tackle a single scrawny teenager in his room before they realize that this place probably isn't a radical Sons of Sekhmet cell. Even though this raid ended up being @@.red;wasted money@@, your Knights eloquently apologize to the edgy teenager they nearly crushed, and your arcology loves the romanticized Knights enough that there's no lasting reputation damage from the unfortunate raid. + + <<run cashX(-5000, "event")>> + <</if>> + <</replace>> +<</link>> +<</if>> + +<<if $arcologies[0].FSRomanRevivalistLaw == 1>> +<br> <<link "Authorize the raid, but delegate it to your armed citizens instead of the security team">> + <<replace "#result">> + <<if $sekhmetbombplot == 1>> + You authorize the raid, but transfer authority for its execution over to a group of loyal, free citizens, who are all too eager to defend the Republic. Early in the morning the next day, a group of Praetorians in full gear burst into a small apartment in the lower sectors, interrupting a small group of Sekhmeti terrorists bulding a series of improvised bombs in the barren living room. Before the bombmakers can even grab their guns, the well-disciplined citizens gun them down in an explosive hail of fire, killing the whole cluster indiscriminately. Although the zealous citizenry don't leave anything left for you to enslave, a group of proud, well-trained free citizens voluntarily defending the arcology from a terrorist plot - and doing so without so much as a scratch - is a @@.green;good look@@. + + <<run cashX(-5000, "event")>> + <<run repX(2500, "event")>> + <<else>> + You authorize the raid, but transfer authority for its execution over to a group of loyal, free citizens, who are all too eager to defend the Republic. Early in the morning the next day, a group of Praetorians in full gear burst into a dilapidated warehouse in the lower sectors, shocking the small group of transport workers carrying crates around for some secondhand shipment. Although the citizens nearly fire on the rough-looking warehouse hands, they realize that this isn't a group of Sekhmeti radicals before they do and apologize for the insurrection. Although this raid ultimately turned out to be @@.red;wasted money@@, the free citizens conducting it and their disciplined Roman nature prevents any lasting reputation damage. + + <<run cashX(-5000, "event")>> + <</if>> + <</replace>> +<</link>> +<</if>> +<<if $mercenaries == 5>> +<br> <<link "Authorize the raid, but transfer authority to your $mercenariesTitle">> + <<replace "#result">> + <<if $sekhmetbombplot == 1>> + You authorize the raid, but head up the effort with your better-trained $mercenariesTitle. Early in the morning the next day, the deadly mercenaries kick down the door of a small office building in the lower sectors, interrupting a group of Sekhmeti terrorists in the middle of constructing a series of improvised bombs in the converted office space. The $mercenariesTitle blow the entire group to pieces with high-power weaponry, absolutely annihilating the careful plot with overwhelming force and indiscriminate destruction before they can fire off a single shot. Although the rough mercenaries don't leave anything left for you to enslave, the well-trained mercs emerging from the smouldering ruin of what used to be a terrorist field HQ is a @@.green;good look@@ for the security of your arcology. + + <<run cashX(-5000, "event")>> + <<run repX(2500, "event")>> + <<else>> + You authorize the raid, but head up the effort with your better-trained $mercenariesTitle. Early in the morning the next day, the deadly mercenaries burst into the back of a small shop in the lower sectors, nearly giving the lower-class workers heart attacks with the sudden appearance of their scarred-over faces in full battle gear. Although they tackle two of the poor workers to the ground, it doesn't take the $mercenariesTitle long to realize that this isn't a radical Sons of Sekhmet terrorist cell, and they leave before the media can show up to report on it. Even though this raid turned out to be @@.red;wasted money@@, your mercenaries conduct themselves well enough that there's no lasting reputation damage. + + <<run cashX(-5000, "event")>> + <</if>> + <</replace>> +<</link>> +<</if>> +<br><<link "Authorize the raid with standard drones and guard officers">> + <<replace "#result">> + <<if $sekhmetbombplot == 1>> + You authorize the raid with no further comments. Early in the morning the next day, a group of security officers burst into the back of a small shop in the lower sectors, interrupting a group of Sekhmeti terrorists in the middle of constructing a series of improvised bombs, having removed all the machinery from the back of the shop to make space. The drones fire their tasers at the Sons, but they're better-armed and trained than to get so easily disabled, and your officers and the bombmakers get drawn into a prolonged firefight over the next ten minutes that draws arcology media to the scene like a candle. Although a few of the officers involved limp out with bullet wounds and slashes, they manage to completely eradicate the terrorist cell, and brave officers coming out from the destroyed Sekhmeti HQ is a @@.green;good look@@, even if they didn't manage to leave you any of the terrorists alive to enslave. + + <<run cashX(-5000, "event")>> + <<run repX(1500, "event")>> + <<else>> + You authorize the raid with no further comments. Early in the morning the next day, a group of security officers kick down the door of a small office building in the lower sectors, practically giving the workers inside heart attacks. One of the drones misinterprets a panicked worker dropping a file as an aggressive action and tases him, much to the chargin of the rest of the officer team. Arcology media is on the scene in minutes, and on top of being @@.red;a waste of money@@, you've also got a PR nightmare on your hands as the tased worker complains on live media about the "unfair paranoia" of the arcology and how much his taser burns hurt. What a shit-show. + + <<run cashX(-5000, "event")>> + <<run repX(-500, "event")>> + <</if>> + <</replace>> +<</link>> +<br><<link "Refuse your authorization">> + <<replace "#result">> + <<if $sekhmetbombplot == 1>> + You tell the security team to stop chasing ghosts and focus on real issues in the arcology. Two days later, while you're working in your office, a distant booming sound rumbles out from outside the penthouse. Turning to look out the window, you see a column of smoke coming up from the marketplace, and the distant glow of a raging flame. A few seconds later, another muffled boom rings out, this time from the direction of the plaza, and then a third, and a fourth. Sounds of gunshots in the distance ring out shortly afterwards. From here, there's nothing you can do but watch as the series of explosions @@.red;devastates@@ the arcology's hard-built prosperity - and its citizens. This time wasn't just a fluke, it seems. You don't even need to turn on the TV to imagine what the media is @@.red;already saying@@ about your failure to stop this attack before it happened. It's not going to be good. + <<set $arcologies[0].prosperity -= 5>> + <<run cashX(-24000, "event")>> + <<run repX(-5000, "event")>> + <<else>> + You tell the security team to stop chasing ghosts and focus on real issues in the arcology. A few days later, someone from the team bashfully sends you an "update" bulletin notifying you that it was a false alarm after all and they'd just gotten worked up over some intimidating posts on social media. + <</if>> + <</replace>> +<</link>> +</span> diff --git a/src/Mods/Catmod/events/SoSSniper.tw b/src/Mods/Catmod/events/SoSSniper.tw new file mode 100644 index 0000000000000000000000000000000000000000..c5b1fc09bf2ce5c127dbebd46a366b92b98eb430 --- /dev/null +++ b/src/Mods/Catmod/events/SoSSniper.tw @@ -0,0 +1,176 @@ +:: RE sos sniper [nobr] + +<<set $nextButton = "Continue", $encyclopedia = "The Sons of Sekhmet">> +<<set $nextLink = "RIE Eligibility Check">> + +<<if _S.Bodyguard>> + <<setLocalPronouns _S.Bodyguard>> + <span id="art-frame"> + /* 000-250-006 */ + <<if $seeImages == 1>> + <<if $imageChoice == 1>> + <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(_S.Bodyguard, 2, 0)>></div> + <<else>> + <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(_S.Bodyguard, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> +<</if>> + +It's a particularly nice day out and you've decided to visit some of the more prominent citizens of your arcology, the kind of people you might call 'friends' if genuine friendship wasn't a quick way to get stabbed in the back in the Free Cities. As you're having a pleasant conversation with one of these notables on the raised porch of his luxurious apartment, $assistant.name pings you with an urgent message: DUCK. +<br><br> + +<<if $PC.skill.warfare >= 60>> +You don't even think about it. Combat reflexes kicking in, you dive onto the ground as something whizzes past your head close enough to shave off a lock of hair, slamming into the ground next to you with enough force to shatter the wood. Before you conciously realize what's going on, your body understands that you're being shot at, <<if _S.Bodyguard>> _S.Bodyguard.slaveName helping you up and shielding you with $his body as you're hustled into the citizen's apartment with the citizen himself<<else>>leaping up and springing towards the citizen's apartment with the frightened man himself<</if>>. Two more shots slam into the wood around you as you all but leap into the citizen's apartment, one more bullet splintering the wood of the door as you close it shut behind you. +<<run cashX(-1000, "event", _S.Bodyguard)>> + +<<elseif _S.Bodyguard.intelligence + _S.Bodyguard.intelligenceImplant > 60>> +You blink once at the message in confusion before _S.Bodyguard.slaveName tackles you, $his shoulder bursting out with an explosion of red as $he catches a bullet clearly meant for you. $He cries out in pain, but it doesn't look like the hit was lethal; even injured and bleeding, $he shields you as you hustle into the open apartment along with the spooked citizen, more shots impacting around you as you wildly scramble into cover. A final bullet splinters the wood of the door as you close it shut behind you. +<<run cashX(-1000, "event", _S.Bodyguard), healthDamage(_S.Bodyguard, 60)>> + +<<else>> +<<set $gameover = "snipedbysons">><<goto "Gameover">> +<</if>> +<br><br> +As you pant in the wake of the sudden attack, $assistant.name notifies you that they've traced the origin of the shots to somewhere in Sector Three. Having missed the killing shot, the sniper is undoubtedly packing up and moving to leave right now. You'll have to get a search party moving immediately if you want any hope of tracking them down. +<br> + +<span id="result"> +<<if $arcologies[0].FSNeoImperialistLaw1 == 1>> +<br> <<link "Lock down the sector and notify your Imperial Knights to lead citizens out in searching for the shooter">> + <<replace "#result">> + <<if random(1,2,3) == 1>><<set $sniperescape = 1>> After a few hours of searching, your brightly-painted Knights return empty-handed, cursing that it was like no one was ever there. <<elseif random(1,2) == 1>><<set $sniperescape = 2>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your Knights are searching. About five minutes later, a Knight in bright red armor brings you a body slung over his shoulder and thumps it in the ground in front of you, riddled in bullet holes and marked with the logo of the Sons of Sekhmet. "We got the bastard, m'lord." The Knight drawls. With his other hand, he tosses a broken sniper rifle next to the corpse. <<else>><<set $sniperescape = 3>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your Knights are searching. About five minutes later, a Knight in bright red armor brings you a captive bound heavily with iron shackles, covered in body armor bearing the logo of the Sons of Sekhmet. In his other hand, he tosses a broken sniper rifle on the ground in front of you.<</if>> + <br><br> + <<if $sniperescape == 1>> + The assassination attempt and subsequent escape has @@.red;scared@@ many of your citizens, even after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. A few days later, a trader passing by the arcology hands you an envelope, saying that he was told to pass it onto you. Inside is a single slip of paper, totally blank except for a single line of text: "See you soon." The envelope is emblazoned with the logo of an orange sun. + <<set $arcologies[0].prosperity -= 1>> + <<run repX(-2000, "event")>> + <<elseif $sniperescape == 2>> + Surviving the assassination attempt and killing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. This was not the first attempt we have made, and it will not be the last. Next time, we will inscribe his name on the bullet that finishes the job. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<elseif $sniperescape == 3>> + Surviving the assassination attempt and capturing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. The enemy has captured one of ours - in time we will free them, or perhaps they will awake to find a dagger in their back. Soon, they will understand the grave mistake of taking a Son into their ranks, even as a slave. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<set $activeSlaveOneTimeMinAge = 18>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.face = random(50,100)>> + <<set $activeSlave.origin = "$He was an elite sniper of the Sons of Sekhmet, nearly successful in assassinating you with a long-range shot from across the arcology before being captured by your Imperial Knights in a tense shootout.">> + <<set $activeSlave.intelligenceImplant = 30>> + <<set $activeSlave.career = "a sniper">> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = random(-20,10)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<set $activeSlave.shouldersTat = either("flowers", "tribal patterns", "asian art")>> + <<set $activeSlave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.">> + <<run newSlave($activeSlave)>> + <</if>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSRomanRevivalistLaw == 1>> +<br> <<link "Lock down the sector and notify your Praetorians to lead the citizens out in searching for the shooter">> + <<replace "#result">> +<<if random(1,2,3) == 1>><<set $sniperescape = 1>> After a few hours of searching, your armed Praetorian citizens return empty-handed, cursing that it was like no one was ever there. <<elseif random(1,2) == 1>><<set $sniperescape = 2>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your citizens are searching. About five minutes later, a group of rough-looking Hastati citizens bring you a body slung over his shoulder and thumps it in the ground in front of you, riddled in bullet holes and marked with the logo of the Sons of Sekhmet. "We got the filth." The Hastati carrying the body enunciates. With his other hand, he tosses a broken sniper rifle next to the corpse. <<else>><<set $sniperescape = 3>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your citizens are searching. About five minutes later, a group of rough-looking Hastati citizens bring you a captive bound heavily with iron shackles, covered in body armor bearing the logo of the Sons of Sekhmet. In his other hand, he tosses a broken sniper rifle on the ground in front of you.<</if>> + <br><br> + <<if $sniperescape == 1>> + The assassination attempt and subsequent escape has @@.red;scared@@ many of your citizens, even after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. A few days later, a trader passing by the arcology hands you an envelope, saying that he was told to pass it onto you. Inside is a single slip of paper, totally blank except for a single line of text: "See you soon." The envelope is emblazoned with the logo of an orange sun. + <<set $arcologies[0].prosperity -= 1>> + <<run repX(-2000, "event")>> + <<elseif $sniperescape == 2>> + Surviving the assassination attempt and killing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. This was not the first attempt we have made, and it will not be the last. Next time, we will inscribe his name on the bullet that finishes the job. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<elseif $sniperescape == 3>> + Surviving the assassination attempt and capturing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. The enemy has captured one of ours - in time we will free them, or perhaps they will awake to find a dagger in their back. Soon, they will understand the grave mistake of taking a Son into their ranks, even as a slave. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<set $activeSlaveOneTimeMinAge = 18>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.face = random(50,100)>> + <<set $activeSlave.origin = "$He was an elite sniper of the Sons of Sekhmet, nearly successful in assassinating you with a long-range shot from across the arcology before being captured by your Imperial Knights in a tense shootout.">> + <<set $activeSlave.intelligenceImplant = 30>> + <<set $activeSlave.career = "a sniper">> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = random(-20,10)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<set $activeSlave.shouldersTat = either("flowers", "tribal patterns", "asian art")>> + <<set $activeSlave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.">> + <<run newSlave($activeSlave)>> + <</if>> + <</replace>> +<</link>> +<</if>> +<<if $mercenaries == 5>> +<br> <<link "Lock down the sector and notify your $mercenariesTitle to send in hunter-killer teams">> + <<replace "#result">> + <<if random(1,2,3) == 1>><<set $sniperescape = 1>> After a few hours of searching, your $mercenariesTitle return empty-handed, cursing that it was like no one was ever there. <<elseif random(1,2) == 1>><<set $sniperescape = 2>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your $mercenariesTitle are searching. About five minutes later, a small squad of heavily-armored mercenaries bring you a body, dragging it in the ground in front of you, riddled in bullet holes and marked with the logo of the Sons of Sekhmet. "We got the fucker." The sergeant of the mercenary squad grumbles. With his other hand, he tosses a broken sniper rifle next to the corpse. <<else>><<set $sniperescape = 3>> After maybe thirty minutes, you hear loud gunfire coming from the sector where your $mercenariesTitle are searching. About five minutes later, a small squad of heavily-armored mercenaries bring you a captive bound heavily with iron shackles, covered in body armor bearing the logo of the Sons of Sekhmet. One of the tosses a broken sniper rifle on the ground in front of you.<</if>> + <br><br> + <<if $sniperescape == 1>> + The assassination attempt and subsequent escape has @@.red;scared@@ many of your citizens, even after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. A few days later, a trader passing by the arcology hands you an envelope, saying that he was told to pass it onto you. Inside is a single slip of paper, totally blank except for a single line of text: "See you soon." The envelope is emblazoned with the logo of an orange sun. + <<set $arcologies[0].prosperity -= 1>> + <<run repX(-2000, "event")>> + <<elseif $sniperescape == 2>> + Surviving the assassination attempt and killing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. This was not the first attempt we have made, and it will not be the last. Next time, we will inscribe his name on the bullet that finishes the job. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<elseif $sniperescape == 3>> + Surviving the assassination attempt and capturing the assassin earns you @@.green;admiration@@ of the citizenry, who see you as strong for punishing the assassin, particularly after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. The next day, the Sons of Sekhmet release a 'news' update featuring their balaclava-wearing figurehead in front of his professional desk. + <br><br> + "Today a servant of Sekhmet was martyred while making an attempt on the life of a hedonistic new-world plutocrat. The enemy has captured one of ours - in time we will free them, or perhaps they will awake to find a dagger in their back. Soon, they will understand the grave mistake of taking a Son into their ranks, even as a slave. Abna Sakhmat damk-" You turn off the report. That's about all you need to see. + <<set $arcologies[0].prosperity += 1>> + <<run repX(2000, "event")>> + <<set $activeSlaveOneTimeMinAge = 18>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.face = random(50,100)>> + <<set $activeSlave.origin = "$He was an elite sniper of the Sons of Sekhmet, nearly successful in assassinating you with a long-range shot from across the arcology before being captured by your Imperial Knights in a tense shootout.">> + <<set $activeSlave.intelligenceImplant = 30>> + <<set $activeSlave.career = "a sniper">> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = random(-20,10)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<set $activeSlave.shouldersTat = either("flowers", "tribal patterns", "asian art")>> + <<set $activeSlave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.">> + <<run newSlave($activeSlave)>> + <</if>> + <</replace>> +<</link>> +<</if>> +<br><<link "Just lock down the sector and send out search parties for the shooter">> + <<replace "#result">> + After a few hours of searching, your guards return empty-handed, cursing that it was like no one was ever there. The assassination attempt and subsequent escape has @@.red;scared@@ many of your citizens, even after you @@.red;pay@@ for the damage the sniper bullets caused to the wealthy elite's propety. A few days later, a trader passing by the arcology hands you an envelope, saying that he was told to pass it onto you. Inside is a single slip of paper, totally blank except for a single line of text: "See you soon." The envelope is emblazoned with the logo of an orange sun. + <<set $arcologies[0].prosperity -= 1>> + <<run repX(-2000, "event")>> + <</replace>> +<</link>> +</span> diff --git a/src/Mods/Catmod/events/SoSassassin.tw b/src/Mods/Catmod/events/SoSassassin.tw new file mode 100644 index 0000000000000000000000000000000000000000..ac31f88aa4fbfa89101bd82922726f8f7c895177 --- /dev/null +++ b/src/Mods/Catmod/events/SoSassassin.tw @@ -0,0 +1,153 @@ +:: RE sos assassin [nobr] + +<<set $nextButton = "Continue", $encyclopedia = "The Sons of Sekhmet">> +<<set $nextLink = "RIE Eligibility Check">> + +<<if _S.Bodyguard>> + <<setLocalPronouns _S.Bodyguard>> + <span id="art-frame"> + /* 000-250-006 */ + <<if $seeImages == 1>> + <<if $imageChoice == 1>> + <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(_S.Bodyguard, 2, 0)>></div> + <<else>> + <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(_S.Bodyguard, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> +<</if>> + +As you stroll through your market district in the afternoon, checking up on your merchants and seeing if there's anything interesting on display, you take notice of a particularly attractive young woman in a rather nice suit walking in the same direction. Although attractive citizens are hardly unusual in your arcology, ones that you don't recognize are. She gives you a coy smile as she notices you watching her and starts to walk towards you. +<br><br> + +<<if $PC.skill.warfare >= 80>> +Suddenly a chill runs up your spine. Countless conflicts have given you an almost supernatural sense for danger, and under the attractive glint in this woman's eyes, you can see a hunger that you recognize all too well. You <<if $personalArms > 0>>reach into your jacket for your handgun, <</if>><<if _S.Bodyguard>>give a miniscule hand signal to your bodyguard,<</if>> scan the surrounding area with your eyes and prepare for anything. +<br><br> +The instant your eyes leave the pretty woman, $assistant.name pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language.<<if $personalArms > 0 && _S.Bodyguard>> You snap your handgun out of its holster and fire three rounds into one of their chests, while _S.Bodyguard.slaveName blasts the other before either man can fire. <<elseif _S.Bodyguard>> Your bodyguard quickly fires into the first assassin's chest, then snaps around and blasts the second one before either man can fire.<<elseif $personalArms > 0>> You shoot two rounds into the first assassin's chest, then snap around and blast the second before either man can fire.<<else>><<set $gameover = "shotbysons">><<goto "Gameover">><</if>> +<br><br> +As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. + + <<if _S.Bodyguard>>She's intercepted by _S.Bodyguard.slaveName, who drops $his empty firearm on the ground to pull $his own sword free. + + <<if _S.Bodyguard.skill.combat > 0 && $personalArms > 0>> + The two trained killers clash ferociously, _S.Bodyguard.slaveName using the longer reach of $his sword to keep the mysterious assassin's lightning-fast long knife at bay. As the two narrowly avoid each other's attacks, you pull up your handgun, one bullet left in the chamber, carefully lower your aim, and fire into the melee, blasting a hole through the assassin's left thigh. As she cries out in pain and stumbles, your trained bodyguard tackles her to the ground and slams a fist into her face before she can activate whatever suicide method she has. As the security drones arrive, the marketplace watching the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@, you call for a medic and some sedatives. You're about to claim yourself a @@.green;brand new slave.@@ + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + <<set $activeSlaveOneTimeMinAge = 18>> + <<set $activeSlaveOneTimeMaxAge = 24>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("XX")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.face = random(50,100)>> + <<set $activeSlave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face..">> + <<set $activeSlave.intelligenceImplant = 30>> + <<set $activeSlave.career = "an assassin">> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = random(-20,10)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<set $activeSlave.shouldersTat = either("flowers", "tribal patterns", "asian art")>> + <<set $activeSlave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.">> + <<run newSlave($activeSlave)>> + + <<elseif _S.Bodyguard.skill.combat > 0 && $personalArms < 1>> + The two trained killers clash ferociously, _S.Bodyguard.slaveName using the longer reach of $his sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as _S.Bodyguard.slaveName ferociously leaps forward and plunges $his sword directly through the assassin's neck. $He nearly decapitates the pretty head as $he pulls $his sword back, the marketplace watching the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@. + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + + <<elseif _S.Bodyguard.skill.combat < 1 && $personalArms > 0>> + The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from _S.Bodyguard.slaveName and hits back twice as hard, forcing $him on the defensive. When _S.Bodyguard.slaveName stumbles, the assassin furiously kicks the blade out from $his hand and leaps atop $him, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off _S.Bodyguard.slaveName, her knife clattering to the ground. The citizens in the marketplace watch the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@, both you and _S.Bodyguard.slaveName panting in the wake of the attack and surrounded by bodies. + + <<else>> + <<set $gameover = "sons assassinated with bodyguard">><<goto "Gameover">> + <</if>> + + <<else>> + + <<if $PC.skill.warfare >= 100 && $personalArms > 0>> + There's nothing standing between you two. You level your handgun onto her, but she's just a microsecond faster, kicking the gun out of your hand with a painfully powerful strike that sends the pistol clattering onto the ground a few feet away. Before you can dive for it, she's thrusting her knife up towards your throat. Your combat instincts kick in and you wrench your head to the side, the blade nicking you on the cheek, and grab her by the wrist, throwing a hard punch into her ribcage. The assassin forces her hand free and stumbles back, seemingly surprised that you're holding your own against her. "Bhalwi al-sham asmik qalbik. I was told you could fight." She mumbles. You glance at your handgun on the ground as she drops into a combat stance and lunges towards you a second time. You barely catch her wrist as she thrusts the knife at your stomach, forcing her hand off to the side, and she responds by slamming a kick into your ankle, rearing her hand back for another strike as you reel. You narrowly deflect strike after strike as she jabs the knife towards your vitals, the sharp steel cutting and scraping your skin as you hold off the better-armed assailant, until she pulls back and brutally kicks you in the ribs as you block a jab, sending you slamming against the hard ground of the marketplace. Coughing a trace of blood, you roll to the side towards your discarded handgun as the assasin lunges atop you, pinning you down. She's got an insane look in her pretty eyes as she raises the knife, shouting "Abna Sakhmat damkun!" You reach your hand to the side as far as you can get it, narrowly grasp your fingers around your handgun, and whip it back to fire a single round, the last round in the magazine, through the assassin straddling you's chest. She gasps once, and then slumps off, an instant before having plunged the knife into your heart. Covered in blood, you push the corpse off, stand up, brush yourself off, and tell the @@.green;shocked and amazed@@ citizens of the marketplace that this is just another day in your life. Someone awkwardly applauds as the security drones arrive. + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + + <<else>> + <<set $gameover = "sons assassinated">><<goto "Gameover">> + <</if>> + <</if>> + + +<<elseif _S.Bodyguard.intelligence + _S.Bodyguard.intelligenceImplant > 80>> +Suddenly _S.Bodyguard.slaveName steps in front of you and forcefully shoves you back, pulling $his machine pistol free from its holster. You're about to chastise $him, but you don't get the chance. +<br><br> +The instant your eyes leave the pretty woman, $assistant.name pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language.<<if $personalArms > 0>> You snap your handgun out of its holster and fire three rounds into one of their chests, while _S.Bodyguard.slaveName blasts the other before either man can fire. <<else>> Your bodyguard quickly fires into the first assassin's chest, then snaps around and blasts the second one before either man can fire.<</if>> +<br><br> +As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. She's intercepted by _S.Bodyguard.slaveName, who drops $his empty firearm on the ground to pull $his own sword free. + + <<if _S.Bodyguard.skill.combat > 0 && $personalArms > 0 && $PC.skill.warfare >= 60>> + The two trained killers clash ferociously, _S.Bodyguard.slaveName using the longer reach of $his sword to keep the mysterious assassin's lightning-fast long knife at bay. As the two narrowly avoid each other's attacks, you pull up your handgun, one bullet left in the chamber, carefully lower your aim, and fire into the melee, blasting a hole through the assassin's left thigh. As she cries out in pain and stumbles, your trained bodyguard tackles her to the ground and slams a fist into her face before she can activate whatever suicide method she has. As the security drones arrive, the marketplace watching the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@, you call for a medic and some sedatives. You're about to claim yourself a @@.green;brand new slave.@@ + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + <<set $activeSlaveOneTimeMinAge = 18>> + <<set $activeSlaveOneTimeMaxAge = 24>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("XX")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.face = random(50,100)>> + <<set $activeSlave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face.">> + <<set $activeSlave.intelligenceImplant = 30>> + <<set $activeSlave.career = "an assassin">> + <<set $activeSlave.skill.combat = 1>> + <<set $activeSlave.devotion = -100>> + <<set $activeSlave.trust = random(-20,10)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<set $activeSlave.shouldersTat = either("flowers", "tribal patterns", "asian art")>> + <<set $activeSlave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.">> + <<run newSlave($activeSlave)>> + + <<elseif _S.Bodyguard.skill.combat > 0>> + The two trained killers clash ferociously, _S.Bodyguard.slaveName using the longer reach of $his sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as _S.Bodyguard.slaveName ferociously leaps forward and plunges $his sword directly through the assassin's neck. $He nearly decapitates the pretty head as $he pulls $his sword back, the marketplace watching the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@. + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + + <<elseif $personalArms > 0 && $PC.skill.warfare >= 60>> + The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from _S.Bodyguard.slaveName and hits back twice as hard, forcing $him on the defensive. When _S.Bodyguard.slaveName stumbles, the assassin furiously kicks the blade out from $his hand and leaps atop $him, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off _S.Bodyguard.slaveName, her knife clattering to the ground. The citizens in the marketplace watch the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@, both you and _S.Bodyguard.slaveName panting in the wake of the attack and surrounded by bodies. + + <<else>> + <<set $gameover = "sons assassinated with bodyguard">><<goto "Gameover">> + <</if>> + + +<<else>> +You smile back at the attractive woman, getting lost in the depths of her twinkling eyes. As she approaches you, $assistant.name pings an alarm in your ear, which surprises you for a moment until you realize that, outside your fieldd of view, two men on opposite sides of the marketplace have just pulled compact battle rifles from inside their jackets and are screaming something in a foreign language as they aim at you. <<if $personalArms > 0 && _S.Bodyguard>> You pull your handgun out of its holster as _S.Bodyguard.slaveName snaps to attention, exchanging fire with the two assailants. A bullet hits you in the shoulder and sends you sprawling back against the ground in agony, but between the two of you you hit both of the attackers and they drop to the ground dead. <<elseif _S.Bodyguard>> _S.Bodyguard.slaveName quickly snaps to attention, pulling $his machine pistol from its holster and firing back at the two attackers. A bullet hits you in the arm and sends you sprawling back against the ground in agony, but _S.Bodyguard.slaveName drops both of the attackers before they can finish the job. <<else>><<set $gameover = "shotbysons">><<goto "Gameover">><</if>> +As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. +<br><br> + + <<if _S.Bodyguard>>She's intercepted by _S.Bodyguard.slaveName, who drops $his empty firearm on the ground to pull $his own sword free. + + <<if _S.Bodyguard.skill.combat > 0>> + The two trained killers clash ferociously, _S.Bodyguard.slaveName using the longer reach of $his sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as _S.Bodyguard.slaveName ferociously leaps forward and plunges $his sword directly through the assassin's neck. $He nearly decapitates the pretty head as $he pulls $his sword back, the marketplace watching the @@.red;minorly damaged@@ scene with a mixture of @@.green;shock and admiration@@. + <<run cashX(-1000, "event", _S.Bodyguard)>> + <<run repX(2500, "event", _S.Bodyguard)>> + + <<elseif $personalArms > 0 && $PC.skill.warfare >= 60>> + The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from _S.Bodyguard.slaveName and hits back twice as hard, forcing $him on the defensive. When _S.Bodyguard.slaveName stumbles, the assassin furiously kicks the blade out from $his hand and leaps atop $him, slashing _S.Bodyguard.slaveName's throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over _S.Bodyguard.slaveName's corpse and approaches you, smiling psychotically. "Bhalwi al-sham asmik qalbik, dog." The assassin spits, lunging towards you. You can barely muster the strength to raise your handgun, one bullet left in the chamber, and blow a round through her chest before she lands. Killed in midair, the assassin's corpse falls against you as you pass out from blood loss, citizens in the marketplace rushing to your unconcious body and calling for medical help. You'll live, but your bodyguard @@.red;wasn't so lucky.@@ + <<run cashX(-1000, "event", _S.Bodyguard), healthDamage(_S.Bodyguard, 1000)>> + <<= removeSlave(_S.Bodyguard)>> + + <<else>> + <<set $gameover = "sons assassinated with bodyguard">><<goto "Gameover">> + <</if>> + + <<else>> + <<set $gameover = "sons assassinated">><<goto "Gameover">> + <</if>> +<</if>> + +<br><br> +Today, you've survived another attack by the Sons of Sekhmet. But as you look around at the twitching bodies, you get the feeling they'll be back. + + diff --git a/src/Mods/Catmod/interaction/fPet.tw b/src/Mods/Catmod/interaction/fPet.tw new file mode 100644 index 0000000000000000000000000000000000000000..9fc625223d3028df16a3bc3578a65e3beaa27811 --- /dev/null +++ b/src/Mods/Catmod/interaction/fPet.tw @@ -0,0 +1,101 @@ +:: FPet [nobr no-history] + +<<run Enunciate(getSlave($AS))>> +<<run App.Utils.setLocalPronouns(getSlave($AS))>> + +You tell <<= getSlave($AS).slaveName>> to +<<if !hasAnyLegs(getSlave($AS))>> + have another slave set $him up onto your desk. +<<elseif tooBigBreasts(getSlave($AS))>> + have another slave help $him heft $his tits so $he can be near you. +<<elseif tooBigBelly(getSlave($AS))>> + have another slave help $him heft $his belly so $he can be near you. +<<elseif tooBigButt(getSlave($AS))>> + have another slave help $him heft $his ass cheeks so $he can be near you. +<<elseif tooBigDick(getSlave($AS))>> + have another slave help $him heft $his cock so $he can be near you. +<<elseif tooBigBalls(getSlave($AS))>> + have another slave help $him heft $his balls so $he can be near you. +<<elseif tooFatSlave(getSlave($AS))>> + have another slave help $him up so $he can be near you. +<<else>> + move closer towards you. +<</if>> + +Once $he's at an acceptable petting range, you bring the overgrown cat into your embrace and gingerly run a hand from the top of $his head down $his spine, coursing through the soft fur in a massage-like petting motion. + +<<if (getSlave($AS).fetish == "mindbroken")>> +$He accepts the petting robotically, barely even comprehending what you're doing. The pleasant scritch of your fingers against $his back produces some sort of gutteral purring sound, but that conveys the extent of the mindbroken cat's response. + +<<elseif (getSlave($AS).devotion > 75)>> +The cat$girl loudly purrs and eagerly rubs up against you, arching $his back to give you a full range over the silky fur. $His tail flicks back and forth happily as you pet $him, flicking up to tease against your chin as you pet the purring kitten. When you finally retract your hand, <<= getSlave($AS).slaveName>> bats $his eyelashes at you, still purring a little. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $His <<if canSee(getSlave($AS))>>eyes glimmer<<else>>expression stares<</if>> at you contentedly. + <<elseif !canTalk(getSlave($AS))>> + $He signs a little thank-you for the pets. + <<else>> + $He mrowls, "Why'd you <<s>>top, <<Master>>? Can I <<s>>uck you off <<s>>o you keep going?" + <</if>> + + +<<elseif (getSlave($AS).devotion > 50)>> +The cat$girl presents $his back to you eagerly for petting, purring softly as you stroke your hand up and down $his soft fur. It's easy to let your hand practically get lost in the silky material, especially since the eager cat does all $he can to keep your hand runnng up and down $his spine in tender petting motions. When you finally retract your hand, <<= getSlave($AS).slaveName>> bats $his eyelashes at you, still purring a little. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $His <<if canSee(getSlave($AS))>>eyes glimmer<<else>>expression stares<</if>> at you contentedly. + <<elseif !canTalk(getSlave($AS))>> + $He signs that $he loves you. + <<else>> + $He mrowls, "That felt great, <<Master>>. Can you pet me more often?" + <</if>> + +<<elseif (getSlave($AS).devotion > 20)>> +The cat$girl puts up a little facade of resistance, but just about immediately melts into your hands, giving you a full range of motion to pet and rub at $his silky fur. $He lets you pet along the full length of $his spine, rubbing under $his chin and exploring the curves of $his ass and breasts in a way that's, for once, entirely nonsexual. After about a minute, $he starts to purr at your petting, rumbling against your chest, and $he flutters $his eyelashes wistfully when you finally remove your hand. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $His <<if canSee(getSlave($AS))>>eyes glint<<else>>expression stares<</if>> at you with a smug aura. + <<elseif !canTalk(getSlave($AS))>> + $He signs a little thank-you for the pets. + <<else>> + $He mrowls, "Thank<<s>>, <<Master>>. That wa<<s>> nice." + <</if>> + +<<elseif (getSlave($AS).devotion < -20) && (getSlave($AS).trust >= 20)>> +$He glowers at you as you start to pet $him, clearly doing $his best to express nonverbal dissatifaction with you. Despite that, $he can't help but to shiver somewhat as you gingerly pet the fluffy cat, rumbling with a deep purr that betrays $his distaste for you. $He glares up at you the entire time, even as $he purrs, $his tail swishing about in the air as you pet the furry thing vigorously. When you finally retract your hand, $he acts like $he didn't enjoy it. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $His <<if canSee(getSlave($AS))>>eyes glower<<else>>expression glowers<</if>> at you. + <<elseif !canTalk(getSlave($AS))>> + $He makes a rude sign gesture. + <<else>> + $He mrowls, "I'm a per<<s>>on, not <<s>>ome kind of dumb animal." + <</if>> + +<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> +$He flinches back when you raise your hand towards $him, expecting to be hit. The tender petting that occurs obviously shocks $him, and for the first minute it looks like $he's expecting you to change your mind at any moment and hit $him anyway. When you don't, only then does the scared cat$girl allow $himself to get pet properly, slightly arching $his back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat$girl. When you finally retract your hand, $he bats $his eyelashes at you, confused. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $He just stares at you, blinking a few times. + <<elseif !canTalk(getSlave($AS))>> + $He makes a confused sign gesture. + <<else>> + $He mrowls, "I-I<<s>> that it, <<Master>>..?" + <</if>> + +<<elseif (getSlave($AS).trust < -20)>> +$He flinches back when you raise your hand towards $him, expecting to be hit. The tender petting that occurs obviously shocks $him, and for the first minute it looks like $he's expecting you to change your mind at any moment and hit $him anyway. When you don't, only then does the scared cat$girl allow $himself to get pet properly, slightly arching $his back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat$girl. When you finally retract your hand, $he bats $his eyelashes at you, confused. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $He just stares at you, blinking a few times. + <<elseif !canTalk(getSlave($AS))>> + $He makes a confused sign gesture. + <<else>> + $He mrowls, "I-I<<s>> that it, <<Master>>..?" + <</if>> + +<<else>> +The cat$girl puts up a little facade of resistance, but doesn't really fight back against your petting, giving you a full range of motion to pet and rub at $his silky fur. $He lets you pet along the full length of $his spine, rubbing under $his chin and exploring the curves of $his ass and breasts in a way that's, for once, entirely nonsexual. Despite $himself, $he can't help but to purr a little by the time you finally remove $his hands. +<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> + $His <<if canSee(getSlave($AS))>>eyes glint<<else>>expression stares<</if>> at you uncertainly. + <<elseif !canTalk(getSlave($AS))>> + $He makes a huffy mrowling noise. + <<else>> + $He mrowls, "Thank<<s>>, I gues<<s>>..." + <</if>> + +<</if>> diff --git a/src/art/artJS.js b/src/art/artJS.js index 5e4b1fc326a96f5649212c1d4df808d490122976..a72f516bc4ebad9e2a2d59f9b8316f0ff70558b3 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -453,6 +453,11 @@ globalThis.skinColorCatcher = function(artSlave) { colorSlave.areolaColor = "#C96D6D"; colorSlave.labiaColor = "#F977A3"; colorSlave.lipsColor = "#b04040"; + } else if (artSlave.skin === "dyed purple") { + colorSlave.skinColor = "#7a2391"; + colorSlave.areolaColor = "#C96D6D"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#b04040"; } else if (artSlave.skin === "dyed green") { colorSlave.skinColor = "#A6C373"; colorSlave.areolaColor = "#B7CF8F"; @@ -597,6 +602,140 @@ globalThis.skinColorCatcher = function(artSlave) { } break; + case "catgirl": + switch (artSlave.skin) { + case "pure white": + case "ivory": + case "white": + colorSlave.skinColor = "#F4EAF0"; + colorSlave.areolaColor = "#FCCCDC"; + colorSlave.labiaColor = "#F977A3"; + break; + case "extremely pale": + case "very pale": + colorSlave.skinColor = "#F4EAF0"; + colorSlave.areolaColor = "#FCCCDC"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#ffb9ca"; + break; + case "pale": + colorSlave.skinColor = "#F5E1DF"; + colorSlave.areolaColor = "#EFBFCA"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#ffb9ca"; + break; + case "extremely fair": + colorSlave.skinColor = "#F5E1DF"; + colorSlave.areolaColor = "#EFBFCA"; + colorSlave.labiaColor = "#F977A3"; + break; + case "very fair": + colorSlave.skinColor = "#F5D5C9"; + colorSlave.areolaColor = "#E2B4B9"; + colorSlave.labiaColor = "#F977A3"; + break; + case "fair": + colorSlave.skinColor = "#F5D5C9"; + colorSlave.areolaColor = "#E2B4B9"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#ce6876"; + break; + case "light": + colorSlave.skinColor = "#F4C9AA"; + colorSlave.areolaColor = "#F19795"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#ce6876"; + break; + case "light olive": + colorSlave.skinColor = "#E1B585"; + colorSlave.areolaColor = "#C39696"; + colorSlave.labiaColor = "#F977A3"; + break; + case "tan": + colorSlave.skinColor = "#E1B585"; + colorSlave.areolaColor = "#C39696"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#c1a785"; + break; + case "olive": + colorSlave.skinColor = "#D58E5F"; + colorSlave.areolaColor = "#B17777"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#9e4c44"; + break; + case "bronze": + colorSlave.skinColor = "#D58E5F"; + colorSlave.areolaColor = "#B17777"; + colorSlave.labiaColor = "#F977A3"; + break; + case "dark olive": + colorSlave.skinColor = "#A2805C"; + colorSlave.areolaColor = "#8E6454"; + colorSlave.labiaColor = "#F977A3"; + break; + case "dark": + case "light beige": + colorSlave.skinColor = "#825633"; + colorSlave.areolaColor = "#734B2F"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#714536"; + break; + case "beige": + case "dark beige": + case "light brown": + colorSlave.skinColor = "#784F2F"; + colorSlave.areolaColor = "#583E2F"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#5d2f1b"; + break; + case "brown": + colorSlave.skinColor = "#784F2F"; + colorSlave.areolaColor = "#583E2F"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#714536"; + break; + case "dark brown": + colorSlave.skinColor = "#65422C"; + colorSlave.areolaColor = "#4A3A33"; + colorSlave.labiaColor = "#F977A3"; + break; + case "black": + case "ebony": + colorSlave.skinColor = "#583E2F"; + colorSlave.areolaColor = "#3F3A38"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#403030"; + break; + case "pure black": + colorSlave.skinColor = "#583E2F"; + colorSlave.areolaColor = "#3F3A38"; + colorSlave.labiaColor = "#F977A3"; + break; + case "red": + colorSlave.skinColor = "#bc4949"; + colorSlave.areolaColor = "#C96D6D"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#b04040"; + break; + case "yellow": + colorSlave.skinColor = "#e6e673"; + colorSlave.areolaColor = "#E7DF7D"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#e0d050"; + break; + case "black and white striped": + colorSlave.skinColor = "#1c1309"; + colorSlave.areolaColor = "#FCCCDC"; + colorSlave.labiaColor = "#F977A3"; + break; + default: + colorSlave.skinColor = "#D58E5F"; + colorSlave.areolaColor = "#B17777"; + colorSlave.labiaColor = "#F977A3"; + colorSlave.lipsColor = "#9e4c44"; + } + break; + case "black": switch (artSlave.skin) { case "pure white": diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index f8201591658dfdf6aa9077a86b1e08e1f6c0ad8b..6f5663d6934c03ad7603a3868549805066674aa1 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -2012,6 +2012,7 @@ App.Art.vectorArtElement = (function() { svgQueue.add(`Art_Vector_Hair_Back_Ninja_${hairLength}`); break; case "strip": + case "undercut": svgQueue.add("Art_Vector_Hair_Back_NoHair"); break; case "braided": @@ -2109,6 +2110,9 @@ App.Art.vectorArtElement = (function() { case "ponytail": svgQueue.add(`Art_Vector_Hair_Fore_${capFirstChar(slave.hStyle)}`); break; + case "undercut": + svgQueue.add(`Art_Vector_Hair_Fore_Strip_${hairLength}`); + break; case "braided": case "cornrows": case "curled": @@ -2231,6 +2235,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeA"); + svgQueue.add("Art_Vector_Mouth_TypeC"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } } break; case "asian": @@ -2280,6 +2291,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeB"); + svgQueue.add("Art_Vector_Mouth_TypeC"); + svgQueue.add("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } } break; case "amerindian": @@ -2326,6 +2344,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeC"); + svgQueue.add("Art_Vector_Mouth_TypeA"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } } break; case "black": @@ -2373,6 +2398,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeE"); + svgQueue.add("Art_Vector_Mouth_TypeE"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } } break; case "middle eastern": @@ -2418,6 +2450,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeE"); + svgQueue.add("Art_Vector_Mouth_TypeE"); + svgQueue.add("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } } break; case "semitic": @@ -2463,6 +2502,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeE"); + svgQueue.add("Art_Vector_Mouth_TypeE"); + svgQueue.add("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } } break; case "indo-aryan": @@ -2508,6 +2554,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeA"); + svgQueue.add("Art_Vector_Mouth_TypeC"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } } break; case "mixed race": @@ -2553,6 +2606,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeA"); + svgQueue.add("Art_Vector_Mouth_TypeC"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } } break; default: @@ -2598,6 +2658,13 @@ App.Art.vectorArtElement = (function() { if (hasEyebrows === true) { svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); } + } else if (slave.faceShape === "feline") { + svgQueue.add("Art_Vector_Eyes_TypeA"); + svgQueue.add("Art_Vector_Mouth_TypeC"); + svgQueue.add("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) { + svgQueue.add(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } } } } @@ -2971,7 +3038,7 @@ App.Art.legacyVectorArtElement = function() { if (slave.custom.hairVector) { hairStyle = slave.custom.hairVector; } else { - hairStyle = (["afro", "braided", "bun", "buzzcut", "dreadlocks", "eary", "luxurious", "messy", "neat", "ponytail", "strip", "tails", "trimmed", "up"].includes(slave.hStyle) ? slave.hStyle : "neat"); + hairStyle = (["afro", "braided", "bun", "buzzcut", "dreadlocks", "eary", "luxurious", "messy", "neat", "ponytail", "strip", "undercut", "tails", "trimmed", "up"].includes(slave.hStyle) ? slave.hStyle : "neat"); } underArmHStyle = slave.underArmHStyle; diff --git a/src/cheats/mod_EditChildCheatNew.tw b/src/cheats/mod_EditChildCheatNew.tw index c1268f2983e6f9b99b70cc30b04d1c6869375da0..b256fe1590d479f79fddbc7b989ea4b3706790e7 100644 --- a/src/cheats/mod_EditChildCheatNew.tw +++ b/src/cheats/mod_EditChildCheatNew.tw @@ -668,6 +668,7 @@ <<radiobutton "$tempSlave.race" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.race" "amerindian">> Amerindian <<radiobutton "$tempSlave.race" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.race" "catgirl">> Catgirl <<radiobutton "$tempSlave.race" "malay">> Malay <<radiobutton "$tempSlave.race" "mixed race">> Mixed Race @@ -686,6 +687,7 @@ <<radiobutton "$tempSlave.origRace" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.origRace" "amerindian">> Amerindian <<radiobutton "$tempSlave.origRace" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.origRace" "catgirl">> Catgirl <<radiobutton "$tempSlave.origRace" "malay">> Malay <<radiobutton "$tempSlave.origRace" "mixed race">> Mixed Race @@ -718,6 +720,9 @@ <<radiobutton "$tempSlave.skin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.skin" "black">> Black <<radiobutton "$tempSlave.skin" "ebony">> Ebony + <<radiobutton "$tempSlave.skin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.skin" "yellow">> Yellow + <<radiobutton "$tempSlave.skin" "red">> Red <<radiobutton "$tempSlave.skin" "pure black">> Pure Black <br> @@ -748,6 +753,9 @@ <<radiobutton "$tempSlave.origSkin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.origSkin" "black">> Black <<radiobutton "$tempSlave.origSkin" "ebony">> Ebony + <<radiobutton "$tempSlave.origskin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.origskin" "yellow">> Yellow + <<radiobutton "$tempSlave.origskin" "red">> Red <<radiobutton "$tempSlave.origSkin" "pure black">> Pure Black <br> <</widget>> @@ -841,6 +849,7 @@ <<radiobutton "$tempSlave.faceShape" "androgynous">> Androgynous <<radiobutton "$tempSlave.faceShape" "normal">> Normal <<radiobutton "$tempSlave.faceShape" "cute">> Cute + <<radiobutton "$tempSlave.faceShape" "feline">> Feline <<radiobutton "$tempSlave.faceShape" "sensual">> Sensual <<radiobutton "$tempSlave.faceShape" "exotic">> Exotic <br><br> diff --git a/src/cheats/mod_EditInfantCheatNew.tw b/src/cheats/mod_EditInfantCheatNew.tw index 7d7e2bffc9f96e0ad9a25a7231dba131dab11240..0adbc5461e7dc69730f25bd43163affff2095045 100644 --- a/src/cheats/mod_EditInfantCheatNew.tw +++ b/src/cheats/mod_EditInfantCheatNew.tw @@ -670,6 +670,7 @@ <<radiobutton "$tempSlave.race" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.race" "amerindian">> Amerindian <<radiobutton "$tempSlave.race" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.race" "catgirl">> Catgirl <<radiobutton "$tempSlave.race" "malay">> Malay <<radiobutton "$tempSlave.race" "mixed race">> Mixed Race @@ -688,6 +689,7 @@ <<radiobutton "$tempSlave.origRace" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.origRace" "amerindian">> Amerindian <<radiobutton "$tempSlave.origRace" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.origRace" "catgirl">> Catgirl <<radiobutton "$tempSlave.origRace" "malay">> Malay <<radiobutton "$tempSlave.origRace" "mixed race">> Mixed Race @@ -720,6 +722,9 @@ <<radiobutton "$tempSlave.skin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.skin" "black">> Black <<radiobutton "$tempSlave.skin" "ebony">> Ebony + <<radiobutton "$tempSlave.skin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.skin" "yellow">> Yellow + <<radiobutton "$tempSlave.skin" "red">> Red <<radiobutton "$tempSlave.skin" "pure black">> Pure Black <br> @@ -750,6 +755,9 @@ <<radiobutton "$tempSlave.origSkin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.origSkin" "black">> Black <<radiobutton "$tempSlave.origSkin" "ebony">> Ebony + <<radiobutton "$tempSlave.origskin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.origskin" "yellow">> Yellow + <<radiobutton "$tempSlave.origskin" "red">> Red <<radiobutton "$tempSlave.origSkin" "pure black">> Pure Black <br> <</widget>> @@ -843,6 +851,7 @@ <<radiobutton "$tempSlave.faceShape" "androgynous">> Androgynous <<radiobutton "$tempSlave.faceShape" "normal">> Normal <<radiobutton "$tempSlave.faceShape" "cute">> Cute + <<radiobutton "$tempSlave.faceShape" "feline">> Feline <<radiobutton "$tempSlave.faceShape" "sensual">> Sensual <<radiobutton "$tempSlave.faceShape" "exotic">> Exotic <br><br> diff --git a/src/cheats/mod_EditSlaveCheat.tw b/src/cheats/mod_EditSlaveCheat.tw index 8302eea0802ecf31b507f5db5af317ddecfef2e2..e493ee1c0fc08ac4f6b3e160318738c7e5372d02 100644 --- a/src/cheats/mod_EditSlaveCheat.tw +++ b/src/cheats/mod_EditSlaveCheat.tw @@ -99,6 +99,7 @@ <<radiobutton "$tempSlave.race" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.race" "amerindian">> Amerindian <<radiobutton "$tempSlave.race" "pacific islander">> Pacific Islander +<<radiobutton "$tempSlave.race" "catgirl">> Catgirl <<radiobutton "$tempSlave.race" "malay">> Malay <<radiobutton "$tempSlave.race" "mixed race">> Mixed race @@ -117,6 +118,7 @@ <<radiobutton "$tempSlave.origRace" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.origRace" "amerindian">> Amerindian <<radiobutton "$tempSlave.origRace" "pacific islander">> Pacific Islander +<<radiobutton "$tempSlave.origRace" "catgirl">> Catgirl <<radiobutton "$tempSlave.origRace" "malay">> Malay <<radiobutton "$tempSlave.origRace" "mixed race">> Mixed race @@ -149,6 +151,9 @@ <<radiobutton "$tempSlave.skin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.skin" "black">> Black <<radiobutton "$tempSlave.skin" "ebony">> Ebony +<<radiobutton "$tempSlave.skin" "black and white striped">> Black and White Striped +<<radiobutton "$tempSlave.skin" "yellow">> Yellow +<<radiobutton "$tempSlave.skin" "red">> Red <<radiobutton "$tempSlave.skin" "pure black">> Pure Black <br> @@ -180,6 +185,9 @@ <<radiobutton "$tempSlave.origSkin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.origSkin" "black">> Black <<radiobutton "$tempSlave.origSkin" "ebony">> Ebony +<<radiobutton "$tempSlave.origskin" "black and white striped">> Black and White Striped +<<radiobutton "$tempSlave.origskin" "yellow">> Yellow +<<radiobutton "$tempSlave.origskin" "red">> Red <<radiobutton "$tempSlave.origSkin" "pure black">> Pure Black <br> @@ -400,6 +408,7 @@ Custom sclera color: <<textbox "$tempSlave.sclerae" $tempSlave.sclerae>> <<radiobutton "$tempSlave.faceShape" "androgynous">> Androgynous <<radiobutton "$tempSlave.faceShape" "normal">> Normal <<radiobutton "$tempSlave.faceShape" "cute">> Cute +<<radiobutton "$tempSlave.faceShape" "feline">> Feline <<radiobutton "$tempSlave.faceShape" "sensual">> Sensual <<radiobutton "$tempSlave.faceShape" "exotic">> Exotic diff --git a/src/cheats/mod_editSlaveCheatNew.tw b/src/cheats/mod_editSlaveCheatNew.tw index aabc2080fa5648415e315e153aea19e9a6f9a274..7d3ffea9230c424fc97b32baa3622b9887dcb06f 100644 --- a/src/cheats/mod_editSlaveCheatNew.tw +++ b/src/cheats/mod_editSlaveCheatNew.tw @@ -1309,6 +1309,7 @@ <<radiobutton "$tempSlave.race" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.race" "amerindian">> Amerindian <<radiobutton "$tempSlave.race" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.race" "catgirl">> Catgirl <<radiobutton "$tempSlave.race" "malay">> Malay <<radiobutton "$tempSlave.race" "mixed race">> Mixed Race @@ -1327,6 +1328,7 @@ <<radiobutton "$tempSlave.origRace" "indo-aryan">> Indo-Aryan <<radiobutton "$tempSlave.origRace" "amerindian">> Amerindian <<radiobutton "$tempSlave.origRace" "pacific islander">> Pacific Islander + <<radiobutton "$tempSlave.origRace" "catgirl">> Catgirl <<radiobutton "$tempSlave.origRace" "malay">> Malay <<radiobutton "$tempSlave.origRace" "mixed race">> Mixed Race @@ -1359,6 +1361,9 @@ <<radiobutton "$tempSlave.skin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.skin" "black">> Black <<radiobutton "$tempSlave.skin" "ebony">> Ebony + <<radiobutton "$tempSlave.skin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.skin" "yellow">> Yellow + <<radiobutton "$tempSlave.skin" "red">> Red <<radiobutton "$tempSlave.skin" "pure black">> Pure Black <br> @@ -1389,6 +1394,9 @@ <<radiobutton "$tempSlave.origSkin" "dark brown">> Dark Brown <<radiobutton "$tempSlave.origSkin" "black">> Black <<radiobutton "$tempSlave.origSkin" "ebony">> Ebony + <<radiobutton "$tempSlave.origskin" "black and white striped">> Black and White Striped + <<radiobutton "$tempSlave.origskin" "yellow">> Yellow + <<radiobutton "$tempSlave.origskin" "red">> Red <<radiobutton "$tempSlave.origSkin" "pure black">> Pure Black <br> <</widget>> @@ -1491,6 +1499,7 @@ <<radiobutton "$tempSlave.faceShape" "androgynous">> Androgynous <<radiobutton "$tempSlave.faceShape" "normal">> Normal <<radiobutton "$tempSlave.faceShape" "cute">> Cute + <<radiobutton "$tempSlave.faceShape" "feline">> Feline <<radiobutton "$tempSlave.faceShape" "sensual">> Sensual <<radiobutton "$tempSlave.faceShape" "exotic">> Exotic <br> diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js index 5c1acb1218aed3a8ea16166fd6064d83c1fdb598..90e1e8e02bdc54a103e013b02e0768967bce45b2 100644 --- a/src/descriptions/arcologyDescription.js +++ b/src/descriptions/arcologyDescription.js @@ -546,6 +546,26 @@ App.Desc.playerArcology = function(lastElement) { addParagraph(secExp()); + function catgirls() { + if (V.seeCats === 0) { + return ""; + } + + let buffer = []; + if (V.projectN.techReleased === 1) { + buffer.push(`After the release of Project N technologies to the public, rare catgirls can be found as exotic curiosities of the arcology's elites. An even smaller number of free catgirls populate the arcology's poorest segments. `); + } + if (A.FSEgyptianRevivalistDecoration >= 60 && V.projectN.decisionMade === 1) { + buffer.push(`Catgirls have taken on a distinct religious and cultural prescence within the arcology, and many citizens give small offerings and worship to the felines given their resemblance to ancient Egyptian Goddesses. Getting to actually fuck one is a mark of exceptionally high prestige, and many poorer citizens seem content to offer their prayers and kiss furry ass, often literally. `); + } + if (A.FSTransformationFetishistDecoration >= 60 && V.projectN.decisionMade === 1) { + buffer.push(`Catgirls are a craze in the Arcology's transformationist society, and many pieces of strange equipment designed for catgirl slaves, as well as surgical modification tools to 'transform' people into being more feline, can be found for sale. `); + } + return buffer.join(" "); + } + + addParagraph(catgirls()); + function deco60() { if (FutureSocieties.HighestDecoration() < 60) { return ""; diff --git a/src/endWeek/endWeek.js b/src/endWeek/endWeek.js index fe3aaf631cab28b8e72fda2aebb58335f363974a..ff26c718f11066893878e326e388d9efb431b3dc 100644 --- a/src/endWeek/endWeek.js +++ b/src/endWeek/endWeek.js @@ -18,6 +18,7 @@ globalThis.endWeek = (function() { // pass time for objects that need it weather(); organs(); + growNewCat(); prosthetics(); nursery(); food(); @@ -99,6 +100,13 @@ globalThis.endWeek = (function() { } } + function growNewCat() { + if (V.growingNewCat > 0) { + V.growingNewCat -= 1; + } + } + + function organs() { function advanceOrgan(o) { if (o.weeksToCompletion > 0) { diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js index 9b1a07a4489235ee25196a124f64b5d87386cbb7..6f07cb3c580c5f1ff606bde09ccf9c62dff4d3d9 100644 --- a/src/endWeek/saLongTermPhysicalEffects.js +++ b/src/endWeek/saLongTermPhysicalEffects.js @@ -152,6 +152,10 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { } else if (slave.teeth === "mixed") { if (V.seeAge === 1 && slave.physicalAge >= 12 && random(0, (slave.birthWeek * 2))) { r.push(`${He} lost the last of ${his} baby teeth this week.`); + if (slave.race === "catgirl") { + slave.teeth = "fangs"; + r.push (`${His} baby teeth have fully grown into a pretty but intimidatingly sharp set of feline fangs.`); + } else { const crookedTeethGen = ((faceValue + 100) / 10); if (random(0, crookedTeethGen) < 5) { r.push(`Unfortunately,`); @@ -166,6 +170,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { } else { r.push(`${He} has <span class="noteworthy">quite the lovely smile.</span>`); slave.teeth = "normal"; + } } } } diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js index 6a9b1d5f391b71465576f71d0c5c8c0d6de6a93d..df5eeb25fb619d9ef6ab5fcee68cb0bfaf54d294 100644 --- a/src/endWeek/saSocialEffects.js +++ b/src/endWeek/saSocialEffects.js @@ -571,14 +571,20 @@ App.SlaveAssignment.saSocialEffects = function(slave) { t.push(new SocialEffect("Body Purist", 1, `Minimal piercings/tats`, `Society <span class="green">approves</span> of ${his} unmarked, unblemished skin, advancing the fashion for unspoiled slaves.`)); } - if ((slave.earShape !== "normal" && slave.earShape !== "damaged") || slave.earT !== "none") { - t.push(new SocialEffect("Body Purist", -1, `Inhuman ears`, - `Society finds ${his} inhuman ears <span class="red">appalling.</span>`)); - } - if (slave.horn !== "none" || slave.tail !== "none") { - t.push(new SocialEffect("Body Purist", -1, `Inhuman tail or horns`, - `Society <span class="red">is disgusted</span> by ${his} inhuman attributes.`)); - } + if (slave.race !== "catgirl" || V.arcologies[0].FSBodyPuristCatLaw === 0) { + if ((slave.earShape !== "normal" && slave.earShape !== "damaged") || slave.earT !== "none") { + t.push(new SocialEffect("Body Purist", -1, `Inhuman ears`, + `Society finds ${his} inhuman ears <span class="red">appalling.</span>`)); + } + if (slave.horn !== "none" || slave.tail !== "none") { + t.push(new SocialEffect("Body Purist", -1, `Inhuman tail or horns`, + `Society <span class="red">is disgusted</span> by ${his} inhuman attributes.`)); + } +} + if (slave.race === "catgirl" && V.arcologies[0].FSBodyPuristCatLaw === 0) { + t.push(new SocialEffect("Body Purist", -2, `Nonhuman`, + `Society <span class="red">is disgusted</span> by ${his} feline nature.`)); + } if (slave.faceImplant <= 5 && slave.race === slave.origRace) { t.push(new SocialEffect("Body Purist", 1, `Unaltered`, `Society <span class="green">approves</span> of ${his} natural, untouched appearance, advancing the fashion for unaltered slaves.`)); @@ -677,6 +683,13 @@ App.SlaveAssignment.saSocialEffects = function(slave) { } } + if (V.arcologies[0].FSEgyptianRevivalist !== "unset" && V.seeCats === 1) { + if (slave.race === "catgirl") { + t.push(new SocialEffect("Egyptian Revivalist", 2, `Catgirl`, + `Society <span class="green">adores</span> ${slave.slaveName} due to ${his} feline nature, which reminds many of the ancient Egyptian Godesses.`)); + } + } + if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") { if (isSlim(slave)) { t.push(new SocialEffect("Slimness Enthusiast", 1, `Slim`, diff --git a/src/events/gameover.tw b/src/events/gameover.tw index 3e5d87dfa5b86257be96620394dfca799a15e626..f1bb8faf945848f192ad123f5a49d73d9e72a941 100644 --- a/src/events/gameover.tw +++ b/src/events/gameover.tw @@ -9,6 +9,32 @@ <br><br> The implanted bomb is small, and went off too far ahead to do anything more than stun. Three other assailants run at you from where they were waiting in the confusion, wielding improvised weapons that apparently did not set off the security scanners. Without a bodyguard, decent security systems, or any other means of personal defense, you meet your ignominious death at the end of a bludgeon fashioned from a maintenance tool. + <<case "shotbysons">> + As you stroll through your market district in the afternoon, checking up on your merchants and seeing if there's anything interesting on display, you take notice of a particularly attractive young woman in a rather nice suit walking in the same direction. Although attractive citizens are hardly unusual in your arcology, ones that you don't recognize are. She gives you a coy smile as she notices you watching her and starts to walk towards you. + <br><br> + Suddenly a chill runs up your spine. Countless conflicts have given you an almost supernatural sense for danger, and under the attractive glint in this woman's eyes, you can see a hunger that you recognize all too well. You scan the surrounding area with your eyes and prepare for anything. The instant your eyes leave the pretty woman, $assistant.name pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language. Unfortunately, as your dumb ass has neither a bodyguard nor any sort of personal defense whatsoever, there is absolutely nothing you can do as you are gunned down like a dog before the security drones have even been alerted to the situation. Your body is riddled with nearly fifty bullet holes before you hit the ground, dead. + + <<case "sons assassinated with bodyguard">> + As you stroll through your market district in the afternoon, checking up on your merchants and seeing if there's anything interesting on display, you take notice of a particularly attractive young woman in a rather nice suit walking in the same direction. Although attractive citizens are hardly unusual in your arcology, ones that you don't recognize are. She gives you a coy smile as she notices you watching her and starts to walk towards you. + <br><br> + Suddenly a chill runs up your spine. Countless conflicts have given you an almost supernatural sense for danger, and under the attractive glint in this woman's eyes, you can see a hunger that you recognize all too well. You give a miniscule hand signal to your bodyguard, scan the surrounding area with your eyes and prepare for anything. + <br><br> + The instant your eyes leave the pretty woman, $assistant.name pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language. Your bodyguard quickly fires into the first assassin's chest, then snaps around and blasts the second one before either man can fire. + <br> + As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. She's intercepted by _S.Bodyguard.slaveName, who drops $his empty firearm on the ground to pull $his own sword free. The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from _S.Bodyguard.slaveName and hits back twice as hard, forcing $him on the defensive. When _S.Bodyguard.slaveName stumbles, the assassin furiously kicks the blade out from $his hand and leaps atop $him, slashing _S.Bodyguard.slaveName's throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over _S.Bodyguard.slaveName's corpse and approaches you, smiling psychotically. "Bhalwi al-sham asmik qalbik, dog." The assassin spits, lunging towards you. + <br> + In your last moments alive before the Sekhmeti assassin straddles you and plunges her knife into your heart in front of your watching marketplace, you idly wish that you'd bought a handgun. + + <<case "sons assassinated">> + As you stroll through your market district in the afternoon, checking up on your merchants and seeing if there's anything interesting on display, you take notice of a particularly attractive young woman in a rather nice suit walking in the same direction. Although attractive citizens are hardly unusual in your arcology, ones that you don't recognize are. She gives you a coy smile as she notices you watching her and starts to walk towards you. + <br><br> + Suddenly a chill runs up your spine. Countless conflicts have given you an almost supernatural sense for danger, and under the attractive glint in this woman's eyes, you can see a hunger that you recognize all too well. You reach into your jacket for your handgun, scan the surrounding area with your eyes and prepare for anything. + <br><br> + The instant your eyes leave the pretty woman, $assistant.name pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language. You snap your handgun out of its holster and fire three rounds into one of their chests, while _S.Bodyguard.slaveName blasts the other before either man can fire. + <br> + As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. There's nothing standing between you two. You level your handgun onto her, but she's like a blur, kicking it out of your hand with enough force it feels like your hand shattered. The assassin grins psychotically at you and flourishes her curved knife as you reel back. "Bhalwi al-sham asmik qalbik, dog." The Sekhmeti assassin spits, before lunging forward one last time to slash her knife up into your throat. A moment later, everything goes black. + + <<case "idiot ball">> <<setLocalPronouns _S.Bodyguard>> You quickly move to deal _S.Bodyguard.slaveName a slap across the face. You have an instant to realize the depth of your folly as $his combat training kicks into gear: before $he realizes what $he's doing, $he has drawn $his sword, blocked your slap (and incidentally, removed your hand in doing so), and buried the sword in your chest on the riposte. $His devotion returns to $him as $his combat instincts subside. As you fade, you see $his eyes cloud with terrible, unhealable guilt; in one sure movement, $he draws $his weapon, sets it to semi-automatic, places it under $his chin, and fires a single round. diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js index 94183a91e2559095c7dc39ce224badd6d1010569..3cc3f2acc638c333dede5c18eabab4529b9efbbd 100644 --- a/src/events/intro/introSummary.js +++ b/src/events/intro/introSummary.js @@ -780,6 +780,10 @@ App.Intro.summary = function() { options.addComment(`This mod introduces security and crime in the arcology, as well as attacks and battles. The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.`); + options.addOption("Catmod is", "seeCats") + .addValue("Enabled", 1).on().addValue("Disabled", 0).off(); + options.addComment(`This mod allows you to start your own lategame bioengineering project, focused around creating functional catgirls for recreational purposes. The ultimate dream of any anime-addicted billionaire. After enabling, bioengineering must be manually activated from the genelab through expensive upgrades to see any of the mod's content.`); + el.append(options.render()); return el; } diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index b564c26455e2be9173ba55f8f88919a29ff526cb..3e49612bb890c9bfc058d62952e1dff4f8f24850 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -56,6 +56,13 @@ App.Events.getIndividualEvents = function() { new App.Events.RETSTopExhaustion(), new App.Events.RENickname().setType("RIE"), + + new App.Events.CMRESSAnnoyingCat(), + new App.Events.CMRESSLazyCat(), + new App.Events.CMRESSSpoiledCat(), + new App.Events.CMRESSCatWorship(), + new App.Events.CMRESSCatLove(), + new App.Events.CMRESSCatPresent(), ]; }; diff --git a/src/events/reNickname.js b/src/events/reNickname.js index 90809e29ed03371679df9b74cfcae2c095a0ab75..499b106bee4ba4c640f45a51c77bc399f9c639f9 100644 --- a/src/events/reNickname.js +++ b/src/events/reNickname.js @@ -39,9 +39,11 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent { getQualifiedNicknames(slave) { const _qualifiedNicknames = new Set(); - if (slave.nationality) { - _qualifiedNicknames.add("nationality"); + if (slave.nationality) { + _qualifiedNicknames.add("nationality"); } + + if (V.seeRace === 1) { switch (slave.race) { case "amerindian": @@ -71,6 +73,9 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent { case "pacific islander": _qualifiedNicknames.add("pacific islander"); break; + case "catgirl": + _qualifiedNicknames.add("catgirl"); + break; case "semitic": _qualifiedNicknames.add("semitic"); break; @@ -1162,6 +1167,13 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent { applyDesc = `now has a constant reminder that as a sex slave ${he} is judged on ${his} appearance first.`; notApplyDesc = `may feel some gratitude due to your preference that ${he} not be defined by ${his} ethnicity, but this is counterbalanced by the increased independence your kindness inspires.`; + break; + case "catgirl": + nicknameArray = ["Ace", "Bandit", "Bubbles", "Butterscotch", "Cupcake", "Cutie", "Dottie", "Dandelion", "Fluffy", "Furball", "Garfield", "Ginger", "Hairball", "Kitten", "Tiger", "Twitchy", "Whiskers", "Spots", "Stormy", "Sunshine", "Oreo", "Ziggy"]; + situationDesc = `is a catgirl, a highly unusual result of advanced genetic engineering in the postmodern age. Their pronounced cat-like features mark them apart from the rest of your slave, from the twitching, sensitive ears to the light coating of silky fur across their body, and tend to be the first thing anyone notices when looking at them.`; + applyDesc = `now has a constant and humiliating reminder that their cat-like features define $him above all else.`; + notApplyDesc = `seems rather ambivalent about your decision to not define $him by $his catlike nature. $He just mrowls at you in a way that could be interpeted as either gratitude or annoyance.`; + break; case "semitic": nicknameArray = ["Abie", "Abrahamic", "Baal Worshipper", "Biblical", "Canaanite", "Dead Sea", "Golden Calf", "Good Samaritan", "Goy Toy", "Hebrew", "Heeb", "Holy land", "Hymie", "Inanna", "Ishtar", "Jew", "Kike", "Kosher", "Levantine", "Lilith", "Lost Ark", "Mocky", "Ms. Jew Booty", "Nephilim", "Oven Dodger", "Oy Vey", "Philistine", "Qedesha", "Rabbi", "Red Sea", "Salome", "Semite", "Semitic", "Sheeny", "Shylock", "Sodom and Gomorrah", "Triple Parentheses", "Whore of Babylon", "Yid"]; @@ -1593,6 +1605,8 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent { nicknameArray = ["Aphrodite", "Ceres", "Demeter", "Freyja", "Gaia", "Venus"]; } else if (slave.race === "pacific islander") { nicknameArray = ["Haumea", "Nuakea"]; + } else if (slave.race === "catgirl") { + nicknameArray = ["Juno", "Cybele"]; } else if (slave.race === "amerindian") { nicknameArray = ["Atahensic", "Hanhepi Wi"]; } else if (slave.race === "black") { diff --git a/src/events/reRelativeRecruiter.js b/src/events/reRelativeRecruiter.js index 10959e1a7244da4816efa512c327a55310c98813..961678e53e2f0e3e108acb253c067e2a96d47f96 100644 --- a/src/events/reRelativeRecruiter.js +++ b/src/events/reRelativeRecruiter.js @@ -330,7 +330,9 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba slave.boobsImplantType = "none"; slave.buttImplant = 0; slave.buttImplantType = "none"; - slave.earImplant = 0; + if (slave.race !== "catgirl") { + slave.earImplant = 0; + } slave.faceImplant = 0; slave.hipsImplant = 0; slave.lipsImplant = 0; diff --git a/src/events/scheduled/bodypuristprotest.tw b/src/events/scheduled/bodypuristprotest.tw new file mode 100644 index 0000000000000000000000000000000000000000..d2fca184f6d6bb4b651431fb4801bee369ed2260 --- /dev/null +++ b/src/events/scheduled/bodypuristprotest.tw @@ -0,0 +1,96 @@ +:: SE bodypuristprotest [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(-1000, "event")>> +<<run $arcologies[0].prosperity -= 3>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(-500, "event")>> +<<run $arcologies[0].prosperity -= 1>> +<</if>> + + +You awake in the morning to the sound of yelling and screaming outside your penthouse. Quickly getting dressed, you grab your handgun<<if _S.Bodyguard>>, order your bodyguard to follow behind you,<</if>> and rush outside to find the source of the commotion. As you open the doors to the penthouse, you're greeted with the sight of <<if $arcologies[0].FSBodyPurist != "unset">>a massive, angry mob holding up signs reading "TRAITOR" and "VERMIN-LOVER", along with emblems of Vitruvian men. You can see what appears to be an effigy of a catgirl burning in the back, and the huge crowd appears to have completely surrounded the penthouse.<</if>><<if $arcologies[0].FSBodyPurist == "unset">>a small group of angry, shouting men and women holding up signs reading "BEAST FUCKER" and emblems of Vitruvian men.<</if>> The angry crowd is held back from your penthouse door by <<if $arcologies[0].FSNeoImperialistLaw1 == 1>>a group of Knights in heavy Imperial Plate and their attached militia guards, the guard officers supporting the massive Knights with their riot shields<</if>><<if $arcologies[0].FSRomanRevivalistLaw == 1>>a small unit of militia Praetorians in tight formation, pushing back rioters that press against their shieldwall with disciplined motions<</if>><<if $arcologies[0].FSRomanRevivalistLaw != 1 && $arcologies[0].FSNeoImperialistLaw1 != 1>>a small unit of the arcology's guard officers, nervously holding the rioters at bay with huge black riot shields and batons<</if>>. <<if $mercenaries == 5>> +They're supported by a small group of your $mercenariesTitle, rough, power-armored mercenaries standing side by side with your officers to make sure the protest doesn't turn violent.<</if>> +<br><br> +Despite how angry this crowd appears, they don't seem to be armed, and they're standing a good few feet back from the defensive line of your officers. When you step out, the chanting quiets for a moment, the protest group clearly expecting you to say something. To fill the sudden silence, you demand to know what's going on and who's in charge of this group. In response, a handsome blonde man stands up on a crate above the crowd and raises a megaphone to his lips. +<br><br> +"WE ARE FREE CITIZENS, AND WE ARE EXPRESSING OUR ANGER - " The man's words are met by a chorus of cheers and shouts of the word 'anger' that briefly drown him out. " - THAT YOU HAVE NOT ONLY UTTERLY AND IRREVERSABLY CORRUPTED THE HUMAN FORM WITH YOUR HORRIFIC BIOLOGICAL EXPERIMENTS, BUT HAVE DONE SO IN A THOROUGHLY UNETHICAL MANNER AND WITHOUT CONSULTING THE PEOPLE FIRST. WE DEMAND - " Again, his words are chorused by the crowd. " - AN IMMEDIATE CESSATION TO 'PROJECT N', A FULL PUBLIC APOLOGY, AND A GUARANTEE YOU WILL NEVER ENGAGE IN SUCH DESPICABLE BIOMUTATION AGAIN!" The crowd erupts into cheers and loud, domineering chanting. +<br><br> +One of the riot officers glances back at you, awaiting an order. This situation seems fairly calm for the moment, but it could easily explode with the wrong words. <<if $arcologies[0].FSBodyPurist != "unset">>You're going to need to convince people that natural catgirls are acceptable, or else these protests are just going to get worse in your Body Purist arcology.<</if>> +<br><br> +<span id="result"> +<br> <<link "Order your troops to disperse the protest by force">> + <<replace "#result">> + You don't have time for this shit. You tell the officer glancing at you to shut down these jumped-up hooligans without a second thought. With a nod, the officers press forward into the crowd in an organized fashion, to which they're met with instant pushback from the unarmed protestors. Someone throws a brick at the shieldwall which explodes into two parts with a loud smack, and then the entire situation erupts into chaotic, two-sided violance. As the officers start brawling with the protest crowd, trying to pindown fighting purists for arrest, you retreat back into your penthouse to watch the @@.red;blood flow in the streets.@@ This solution never fails, but the injuries and damages it'll cause are sure to be @@.red;expensive@@, and riot scenes never look good in the media. + <<run cashX(-2500, "violent fighting")>> + <</replace>> +<</link>> +<br> <<link "Attempt to get them to listen to reason">> + <<replace "#result">> + "People, please!" You shout over at the assembled crowd. You start explaining to them that your catgirls are fully biological and not spliced from existant humans, making them totally natural and pure in their own right. <<if $arcologies[0].FSBodyPurist != "unset">>Your explanation is cut off by someone in the back angrily shouting "BEAST FUCKER", a chant which is taken up by the rest of the massive group and totally drowns you out. After a few minutes of trying to get a word in, you throw up your hands and return to your penthouse. These protests will inevitably cause @@.red;economic disruption@@, but at least they probably won't cause any direct damage and will burn out after a week or two.<</if>><<if $arcologies[0].FSBodyPurist == "unset">>The crowd is small enough that you're able to get in your explanations, and even engage in a brief back-and-forth conversation with the leader of the purist group. After showing him design documents and explaining what you know of the inner workings of the Project N process, the crowd's anger seems noticably blunted, and they seem more willing to accept 'natural' catgirls. The crowd @@.green;disperses@@, and the blonde man even says that he'll be willing to give your ideas about 'natural' catgirls a chance - after all, there's a lot worse that happens in the Free Cities than genetic engineering.<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> +<</replace>> +<</link>> +<<if $PC.skill.warfare >= 80>> +<br> <<link "Use your fearsome reputaton to intimidate them into surrender">> + <<replace "#result">> + You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire protest group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The unarmed crowd freezes up, seemingly just now becoming aware that while they're unarmed, the muscular, scarred-over guardsmen holding crackling electrobatons in front of them are most certainly not. You take the oppurtunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who so much as raises a weapon in defense has their home, occupation, and family on file. No one moves a muscle. + <br><br> + You tell the frozen crowd that you'll be continuing your work on Project N, and that if any one of them ever shows up at your house again, let alone with a gun, it'll be the worst, and last, decision they ever make. A few people at the back start to break off from the crowd. You turn back to your penthouse and walk inside as the crowd disintegrates. You have work to do, and you get the feeling these people @@.green;aren't going to bother you again.@@ +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(1000, "event")>> +<<run $arcologies[0].prosperity += 3>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSEgyptianRevivalist != "unset">> +<br> <<link "Calm the crowd through appealing to the Gods">> + <<replace "#result">> + Even surrounded by violence held at bay only by a thin line of heavily-armed guards, you maintain the serene aura of a priest. Unperturbed, you turn and order one of the terrified slaves watching in the doorway to fetch <<if $projectN.status >= 5>>your designs<</if>><<if $projectN.status <= 6>>$subjectDeltaName<</if>>. "Have you forgotten the faces of the Gods, you sinners and fools? Beauty lies not simply in the perfection of the human form, but also in the life of our hands and the transcendence of our purity. Gaze upon my works and tell me you do not see within them the light of Bastet!" You chastise the furious crowd like they're children, and as the slave runs back out, <<if $projectN.status >= 5>>you snatch the designs from her hands and hold up an early technical document from Nieskowitz, showing a serene-looking catgirl in full pharonic attire, portrayed as an Egyptian deity<</if>><<if $projectN.status <= 6>>bringing $subjectDeltaName herself along. The poor, catgirl, still barely capable of human speech, looks absolutely terrified as the large crowd looks her up and down, but doesn't move. With her snow-like fur, she bears a striking resemblance to iconographic Egyptian Godesses, and you gesture towards her with a dramatic hand<</if>>. "How dare you insult the purity of my designs!" You yell at the watching crowd, who seem to have grown quieter. "I have neither marred nor corrupted the human form, but instead brought another form of purity into being. Our dynastic ancestors could recognize this beauty, and you insult them with these blemishes and affronts!" Perhaps owing to the legitimate belief in Egyptian Revivalism across your arcology, the crowd seems genuinely shamed. People start to break off from the back of the crowd, and after a few minutes the furious cluster of rioters has @@.green;dispersed@@, seemingly embarassed that they'd attack feline icons considered holy by the ancient Egyptians. +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(1000, "event")>> +<<run $arcologies[0].prosperity += 3>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSTransformationFetishist != "unset">> +<br> <<link "Allude to democracy and remind the crowd of your arcology's popular love of transformation">> + <<replace "#result">> + You shout over the crowd that they are a minority in your arcology, and that most people support transformationism. Even though this isn't a democracy, you tell that that they're democratically outnumbered and have no right to dictate your actions. This seems to rile up the small group further, but as they start skirmishing with the defensive line, another group of heavily-modified citizens show up, some with bats and batons of their own. Predicting what's about to happen, you retreat back into your penthouse as the first pained shouts echo through the air from the conflicting militia groups. Although there's sure to be @@.red;blood in the streets@@ after this, at least with your citizens doing the dirty work it'll be @@.green;cleaned up a lot faster@@, and you've got a front-row seat to the violence through the observatory of your penthouse. +<<run repX(500, "event")>> +<<run cashX(-2500, "Militia warfare") +<<run $arcologies[0].prosperity += 1>> + <</replace>> +<</link>> +<</if>> +<br> <<link "Apologize and promise to discontinue Project N">> + <<replace "#result">> + You loudly shout an apology over the crowd, which seems to get their attention and briefly calm their skirmishing. Having got the rioter's attention, you promise that you'll discontinue work on Project N and make any further biomodification efforts fully open to the public. Your outright agreement to their demands obviously surprises the rioting crowd, but it's enough to @@.green;calm them down@@, and the raised rifles drop after a few seconds of consideration. The blonde man leading the crowd tells you that they'll be back if you try this again, although you privately doubt they'd have the momentum for a second large protest if you were to quietly re-start Project N later. Shortly after, the crowd starts to disperse, leaving your officers exhaling in relief. Unfortunately, that'll put all the money you invested into Project N @@.red;down the drain.@@ +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(1000, "event")>> +<<run $arcologies[0].prosperity += 3>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> +<<set $projectN.status = 0>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/bodypuristriot.tw b/src/events/scheduled/bodypuristriot.tw new file mode 100644 index 0000000000000000000000000000000000000000..84deda302c9f03d712ac0db00e8060c00ee5e631 --- /dev/null +++ b/src/events/scheduled/bodypuristriot.tw @@ -0,0 +1,102 @@ +:: SE bodypuristriot [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(-2000, "event")>> +<<run cashX(-18000, "Body purist Riots")>> +<<run $arcologies[0].prosperity -= 4>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(-500, "event")>> +<<run cashX(-5000, "Body purist Riots")>> +<<run $arcologies[0].prosperity -= 1>> +<</if>> + +You awake in the morning to the sound of yelling and screaming outside your penthouse. Quickly getting dressed, you grab your handgun<<if _S.Bodyguard>>, order your bodyguard to follow behind you,<</if>> and rush outside to find the source of the commotion. As you open the doors to the penthouse, you're greeted with the sight of <<if $arcologies[0].FSBodyPurist != "unset">>an enormous, heavily armed mob surrounding you. The sea of shouting, furious faces looks to have completely encircled the penthouse, and almost all of them are holding batons, rifles, and whatever else they seem to have been able to get their hands on. Some are even holding up signs bearing the orange sun logo of the Sons of Sekhmet.<</if>><<if $arcologies[0].FSBodyPurist == "unset">>a small group of furious men and women carrying batons and rifles. Some are holding up signs reading "BEAST FUCKER", symbols of Vitruvian men, or painted-on orange Suns that you recognize as the logo of the Sons of Sekhmet.<</if>> The furious crowd is being held back from your gates by <<if $arcologies[0].FSNeoImperialistLaw1 == 1>>a group of Knights in heavy Imperial Plate and their attached militia guards, the guard officers supporting the massive Knights with their riot shields<</if>><<if $arcologies[0].FSRomanRevivalistLaw == 1>>a small unit of militia Praetorians in tight formation, pushing back rioters that press against their shieldwall with disciplined motions<</if>><<if $arcologies[0].FSRomanRevivalistLaw != 1 && $arcologies[0].FSNeoImperialistLaw1 != 1>>a small unit of the arcology's guard officers, nervously holding the rioters at bay with huge black riot shields and batons<</if>>. <<if $mercenaries == 5>> +They're supported by a small group of your $mercenariesTitle, rough, power-armored mercenaries standing side by side with your officers to hold the riot at bay.<</if>> +<br><br> +The riot erupts with a new wave of noise as you step out from the penthouse, and a couple of them press forward into the defensive line to be beaten back with crackling electrobatons. You demand to know what's going on and who's in charge of this affair as the rioters and officers exchange glancing blows. Someone in the back hurls a rock in your direction which shatters loudly on the door of your penthouse as a handsome, young blonde man stands up above the crowd on a crate and holds up a megaphone to his lips. Even through the orange bandana over his face, you recognize him as a prominent bureaucrat, and a public advocate for body purism. +<br><br> +"WE ARE FREE CITIZENS, AND WE ARE EXPRESSING OUR DISGUST - " The man's words are met by a chorus of cheers and shouts of the word 'disgust' that briefly drown him out. " - THAT YOU HAVE NOT ONLY UTTERLY AND IRREVERSABLY CORRUPTED THE HUMAN FORM WITH YOUR HORRIFIC BIOLOGICAL EXPERIMENTS, BUT HAVE CONDUCTED THEM BENEATH OUR NOSES AND ENTIRELY UNETHICALLY. WE DEMAND - " Again, his words are chorused by the crowd, still pushing forward against the defensive line. " - AN IMMEDIATE CESSATION TO 'PROJECT N', A FULL PUBLIC APOLOGY, AND A GUARANTEE YOU WILL NEVER ENGAGE IN SUCH DESPICABLE BIOMUTATION AGAIN!" The crowd erupts into cheers and loud, domineering chanting. +<br><br> +One of the riot officers glances back at you, awaiting an order. This whole situation is just waiting to explode. <<if $arcologies[0].FSBodyPurist != "unset">>You're going to need to convince people that natural catgirls are acceptable, or else these riots are just going to get worse in your Body Purist arcology.<</if>> +<br><br> +<span id="result"> +<br> <<link "Order your troops to disperse the riot by force">> + <<replace "#result">> + "Shut this nonsense down." You tell the guard officer glancing at you. That's all it takes for the scene to explode into catastrophic violence on both sides. As the guards slam forward into the crowd and the explosive cracks of gunfire going off light out the outside of your penthouse, you retreat back inside the doors before anyone can get a shot off at you. Inside, you walk up to a glass-windowed observatory and safely watch from above <<if $arcologies[0].FSBodyPurist != "unset">>as pure chaos unfolds below, fires from thrown bombs already starting to spread as your guards and the rioters transform the upper decks of the arcology into a @@.red;wartorn hellscape.@@<</if>><<if $arcologies[0].FSBodyPurist == "unset">>as the riot scene erupts into violent struggle, heavily-armed officers beating rioters into submission with electrobatons as the riot groups split into violent clusters, firing wildly into groups of advancing soldiers. @@.red;This isn't going to look good.@@<</if>> + <</replace>> +<</link>> +<br> <<link "Attempt to get them to listen to reason">> + <<replace "#result">> + You raise your hands and tell everyone to just calm down, and that you can surely work this all out. In response, one of the furious crowd members shouts that you're a traitor, which is immediately taken up by the rest of the crowd. Raising your voice over them, you try and tell them that there's nothing wrong with natural catgirls, that the claims of the Sons of Sekhmet were wildly exaggerated by delusional terrorists, and that you only withheld information to let the scientists work in peace, but if anyone's listening, they stop when someone hurls a molotov cocktail into the defensive line, exploding with a burst of flames that singes your face. Before you can get in another word, both sides @@.red;explode into violence@@, forcing you to retreat back into the penthouse as the rioters and guards start firing into one another, transforming the upper deck of your arcology into an instant warzone. This isn't going to look good, but at least you @@.green;saved a little face@@ trying to calm them down on camera before the violence erupted. +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(1000, "event")>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(250, "event")>> +<</if>> + <</replace>> +<</link>> +<<if $PC.skill.warfare >= 80>> +<br> <<link "Use your fearsome reputaton to intimidate them into surrender">> + <<replace "#result">> + You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire riot group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The crowd might have guns and knives, but they still quiet down at your words, balking somewhat at the threat of brutality. You take the oppurtunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who actually uses the weapons in their hands has their home, occupation, and family on file. No one moves a muscle. + <br><br> + You tell the frozen crowd that you'll be continuing your work on Project N, and that if any one of them ever shows up at your house again with a gun, it'll be the worst, and last, decision they ever make. A few people at the back start to break off from the crowd. You turn back to your penthouse and walk inside as the crowd disintegrates. You have work to do, and you get the feeling these people @@.green;aren't going to bother you again.@@ +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(2000, "event")>> +<<run cashX(18000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 4>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run cashX(5000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSEgyptianRevivalist != "unset">> +<br> <<link "Calm the crowd through appealing to the Gods">> + <<replace "#result">> + Even surrounded by violence held at bay only by a thin line of heavily-armed guards, you maintain the serene aura of a priest. Unperturbed, you turn and order one of the terrified slaves watching in the doorway to fetch your designs. "Have you forgotten the faces of the Gods, you sinners and fools? Beauty lies not simply in the perfection of the human form, but also in the life of our hands and the transcendence of our purity. Gaze upon my works and tell me you do not see within them the light of Bastet!" You chastise the furious crowd like they're children, and as the slave runs back out, you snatch the designs from her hands and hold up an early technical document from Nieskowitz, showing a serene-looking catgirl in full pharonic attire, portrayed as an Egyptian deity. "How dare you insult the purity of my designs!" You yell at the watching crowd, who seem to have grown quieter. "I have neither marred nor corrupted the human form, but instead brought another form of purity into being. Our dynastic ancestors could recognize this beauty, and you insult them with these blemishes and affronts!" Perhaps owing to the legitimate belief in Egyptian Revivalism across your arcology, the crowd seems genuinely shamed. People start to break off from the back of the crowd, and after a few minutes the furious cluster of rioters has @@.green;dispersed@@, seemingly embarassed that they'd attack feline icons considered holy by the ancient Egyptians. +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(4000, "event")>> +<<run cashX(18000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 4>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(1000, "event")>> +<<run cashX(5000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSTransformationFetishist != "unset">> +<br> <<link "Allude to democracy and remind the crowd of your arcology's popular love of transformation">> + <<replace "#result">> + You shout over the crowd that they are a minority in your arcology, and that most people support transformationism. Even though this isn't a democracy, you tell that that they're democratically outnumbered and have no right to dictate your actions. This seems to rile up the small group further, but as they start skirmishing with the defensive line, another group of heavily-modified citizens show up, sporting bats and batons of their own. Some of the armed purist protestors turn back to face them, readying their guns. Predicting what's about to happen, you retreat back into your penthouse as the first gunshots echo through the air from the conflicting militia groups. Although there's sure to be @@.red;blood in the streets@@ after this, at least with your citizens doing the dirty work it'll be @@.green;cleaned up a lot faster@@, and you've got a front-row seat to the violence through the observatory of your penthouse. +<<run repX(500, "event")>> +<<run $arcologies[0].prosperity += 1>> + <</replace>> +<</link>> +<</if>> +<br> <<link "Apologize and promise to discontinue Project N">> + <<replace "#result">> + You loudly shout an apology over the crowd, which seems to get their attention and briefly calm their skirmishing. Having got the rioter's attention, you promise that you'll discontinue work on Project N and make any further biomodification efforts fully open to the public. Your outright agreement to their demands obviously surprises the rioting crowd, but it's enough to @@.green;calm them down@@, and the raised rifles drop after a few seconds of consideration. The blonde man leading the crowd tells you that they'll be back if you try this again, although you privately doubt they'd have the momentum for a second riot if you were to quietly re-start Project N later. Shortly after, the crowd starts to disperse, leaving your officers exhaling in relief. Unfortunately, that'll put all the money you invested into Project N @@.red;down the drain.@@ +<<if $arcologies[0].FSBodyPurist != "unset">> +<<run repX(2000, "event")>> +<<run cashX(18000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 4>> +<</if>> +<<if $arcologies[0].FSBodyPurist == "unset">> +<<run repX(500, "event")>> +<<run cashX(5000, "Body purist riots stopped")>> +<<run $arcologies[0].prosperity += 1>> +<</if>> +<<set $projectN = 0>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNBlowingTheLid.tw b/src/events/scheduled/projectNBlowingTheLid.tw new file mode 100644 index 0000000000000000000000000000000000000000..a284ca0ca7cdc020d1c995ebb1e60ac202e650f5 --- /dev/null +++ b/src/events/scheduled/projectNBlowingTheLid.tw @@ -0,0 +1,86 @@ +:: SE projectNblowingthelid [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event", $encyclopedia = "The Sons of Sekhmet">> +<<set $projectN.status = 9>> +<<set $projectN.public = 1>> +<<set $puristsFurious = 1>> +<<run repX(-4000, "event")>> + +It's a fine, sunny afternoon in your plaza, surrounded by the noise of bustling merchants harking their wares and slavegirls glibly advertising their bodies, for money, pleasure, or just simple decorative value. As you're inspecting a particularly beautiful raven-haired slave, the plaza's many vidscreens, usually buzzing with the noise of arcology media, suddenly all go black with a crackle of electricity. As the marketplace, yourself included, turn their heads to the unusual display, the screens come back on again, this time universally displaying a man in a dark balaclava, seated at a nondescript desk with a series of papers held in his gloved hands. +<br><br> +"Attention, citizens of $arcologies[0].name. It has come to our attention, the Sons of Sekhmet, that the tyrant of your "free" city, <<= PlayerName()>>, has constructed an underground laboratory from which they have been methodically conducting deeply unethical genetic experiments for the last three months, underneath all of your noses, and involving the inhumane splicing of human and animal DNA into a twisted abomination of a creature." The balaclava-clad man shuffles his papers as slaves and merchants alike glance towards you in stricken shock. +<br><br> +"... These experiments represent the worst depths of depravity within the Free Cities, and we will not allow them to continue unabated. Do you know how many failed 'subjects' of yours were created in mutated, unbearable agony, and summarily executed as failures, <<= PlayerName()>>? Do you even care? Hundreds of thousands of credits spent in causing more suffering while you enslave the weak and let the sick shrivel and die in your streets, all to fulfill a narcissistic personal fantasy. Against the stratification and decadent, obscene cruelties of $arcologies[0].name, we alone stand against the tide. Project "N", the title of this sickening delusion, is to be destroyed, and all who worked on it will die." The balaclava-clad man sets down his papers and points directly towards the screen. +<br><br> +"The Sons of Sekhmet have your blood, <<= PlayerName()>>. Sleep tight." The man draws his finger across his neck in a slitting motion, and then the screen goes black. Before you can even consider how to respond, judging by the looks of shock on everyone around you, you can tell @@.red; there will be consequences.@@ +<br><br> +<span id="result"> +<<if $arcologies[0].FSNeoImperialistLaw1 == 1>> +<br> <<link "Send an emergency message to your Imperial Knights">> + <<replace "#result">> + You immediately call out for your AI to send an emergency bulletin to every Knight in the city ordering them to get to your lab, and fast. As you yourself sprint towards the laboratory, the crack of loud gunshots ring through the air, back-and-forth fire that keeps going for nearly a full minute. By the time you finally arrive, you find the entrance to the lab absolutely covered in blood and bodies. All of the corpses on the ground are dressed in black and orange and clutching old-fashioned assault rifles, surrounded by guardsmen dressed in hot pink liveries. Their Knight, a goliath of a man wearing equally hot pink Imperial Plate bearing his crest that makes him look even bigger, is busy wrestling one struggling figure in black and orange to the ground, apparently the sole survivor on the Sons' side. As much as the Sons of Sekhmet's annoucement has @@.red;shocked@@ the arcology, the timely and heroic response of your Knights is just the PR event you needed to @@.green;reverse the damage@@, especially when the rattled Dr. Nieskowitz comes out from the assaulted lab to thank you for saving his life. + <<run repX(4000, "event")>> + <<set $projectN.status = 5>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.origin = "$He is an enslaved Son of Sekhmet, one of many idealistic rebel groups violently opposed to you.">> + <<set $activeSlave.devotion = random(-90,-70)>> + <<set $activeSlave.trust = random(-20,30)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <</replace>> +<</link>> +<</if>> +<<if $arcologies[0].FSRomanRevivalistLaw == 1>> +<br> <<link "Send an emergency message out to your armed citizens to intervene">> + <<replace "#result">> + You immediately send for your AI to send an emergency bulletin to your armed citizen-soldiers, calling for the sons and daughters of New Rome to defend the Republic once more. As you yourself sprint towards the laboratory, the crack of loud gunshots ring through the air, back-and-forth fire that keeps going for nearly a full minute. By the time you finally arrive, you find the entrance to the lab absolutely covered in blood and bodies. All of the corpses on the ground are dressed in black and orange and clutching old-fashioned assault rifles, surrounded by a large cluster of armed citizens, a few of which nurse wounds from their brief but intense fighting with the Sons. Two Hastati hold down a struggling survivor dressed in orange and black, seemingly the only still-breathing fighter on the Sons' side. As much as the Sons of Sekhmet's annoucement has @@.red;shocked@@ the arcology, the timely and heroic response of your Principes, honest citizens defending the arcology against violent foreign insurgents, is just the PR event you needed to @@.green;reverse the damage@@, especially when the rattled Dr. Nieskowitz comes out from the assaulted lab to thank you for saving his life. + <<run repX(4000, "event")>> + <<set $projectN.status = 5>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.origin = "$He is an enslaved Son of Sekhmet, one of many idealistic rebel groups violently opposed to you.">> + <<set $activeSlave.devotion = random(-90,-70)>> + <<set $activeSlave.trust = random(-20,30)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <</replace>> +<</link>> +<</if>> +<<if $mercenaries == 5>> +<br> <<link "Send an emergency message out to your $mercenariesTitle">> + <<replace "#result">> + You immediately send for your AI to send an emergency bulletin to your $mercenariesTitle, calling them for rapid-deployment to the genetics lab ASAP. As you yourself sprint towards the laboratory, the crack of loud gunshots ring through the air, back-and-forth fire that keeps going for nearly a full minute. By the time you finally arrive, you find the entrance to the lab absolutely covered in blood and bodies. All of the corpses on the ground are dressed in black and orange and clutching old-fashioned assault rifles, surrounded by a small QRF force of lightly-armed mercenaries, most of whom hang off the sides of an armored APC set readied for just such an occassion. An especially large mercenary pins down a struggling survivor dressed in orange and black, seemingly the only still-breathing fighter on the Sons' side. As much as the Sons of Sekhmet's annoucement has @@.red;shocked@@ the arcology, the timely response of your well-trained mercenaries stopping a terrorist attack in under three minutes is just the PR event you needed to @@.green;reverse the damage@@, especially when the rattled Dr. Nieskowitz comes out from the assaulted lab to thank you for saving his life. + <<run repX(4000, "event")>> + <<set $projectN.status = 5>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.origin = "$He is an enslaved Son of Sekhmet, one of many idealistic rebel groups violently opposed to you.">> + <<set $activeSlave.devotion = random(-90,-70)>> + <<set $activeSlave.trust = random(-20,30)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <</replace>> +<</link>> +<</if>> +<br> <<link "Watch in stunned silence">> + <<replace "#result">> + About two minutes later, there's a violent explosion from the top of the free city, near your genetics laboratory. You hear a brief exchange of gunshots that ring out above the city's tense silence, then once more a deafening quiet. You don't even need to read the AI briefing that pops up to know that Nieskowitz and the rest of the scientists are dead, and that the laboratory's been destroyed. All that you can really focus on in the moment is the @@.red;shock and horror@@ on the faces of everyone you see on the long walk back to your penthouse. + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNBubbles.tw b/src/events/scheduled/projectNBubbles.tw new file mode 100644 index 0000000000000000000000000000000000000000..81d2eaef615ed3aff812b698879f125798d8490b --- /dev/null +++ b/src/events/scheduled/projectNBubbles.tw @@ -0,0 +1,19 @@ +:: SE projectNbubbles [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + +You check in on the genelab, and are pleased to see that project N is making a great deal of progress. What was once an indistinguishable fleshy mass in a tube of mysterious green liqud looks now more like a small, unconcious humanoid body, pink-fleshed and nude, with a set of pointy triangular ears atop its bald head that vaguely resemble a cat. Doctor Nieskowitz steps up to you as you examine the growing body, actually smiling for once. +<br><br> +"Ah, I see you've seen our latest progress. I'm quite proud of the team's work so far, you know - five months ago I would have said this kind of genetic splicing was simply impossible. But there's no better scientific feeling than proving yourself wrong, eh? Anyway, we've started to refer to the subject as 'Bubbles', on account of the-" The doctor is interrupted by a slight thrashing movement from the unconcious body, which produces a short span of bubbling within the tube's liquid. "- Well, that. But anyway, since you're funding the project and she'll be your property once we finish, I thought it best to ask you your opinion on the matter of a real name before we proceed any further." +<span id="result"> +<br> <<link "Bubbles is a good name">> + <<replace "#result">> + You tell Nieskowitz that you like the name the scientists have chosen. He nods a couple times, jots something down in a notepad, and then returns to his work on subject delta - or, rather, on Bubbles. + <</replace>> +<</link>> +<br> <<link "I had something else in mind">> + <<replace "#result">> + You tell the waiting bioengineers that you'll be formally naming the growing catgirl <<textbox "$subjectDeltaName" $subjectDeltaName>>. Nieskowitz nods, jots something down in a notepad, and then lets you know that he'll update you on the situation as it develops. + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNComplete.tw b/src/events/scheduled/projectNComplete.tw new file mode 100644 index 0000000000000000000000000000000000000000..60b463b710f8b4c5c61da6782042d9d96b46b12e --- /dev/null +++ b/src/events/scheduled/projectNComplete.tw @@ -0,0 +1,90 @@ +:: SE projectNcomplete [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + +<<set $bodyPuristRiot = 1>> +<<set $projectN.public = 1>> + + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 16>> + <<set $oneTimeDisableDisability = 1>> + <<set $fixedRace = "catgirl">> + <<set $activeSlave = GenerateNewSlave("XX", {nationality: "Stateless"})>> + <<set $activeSlave.origin = "$He is a vat-grown catgirl, the world's first. You painstakingly grew $him yourself over months in the expensive Project N, a cutting-edge biotechnology experiment led by Doctor Nieskowitz.">> + <<set $activeSlave.face = random(75,100)>> + <<set $activeSlave.faceShape = "feline">> + <<set $activeSlave.slaveName = $subjectDeltaName>> + <<set $activeSlave.birthName = $subjectDeltaName>> + <<set $activeSlave.slaveSurname = "">> + <<set $activeSlave.birthSurname = "">> + <<set $activeSlave.career = "an orphan">> + <<set $activeSlave.intelligenceImplant = 0>> + <<set $activeSlave.hColor = "white">> + <<set $activeSlave.override_H_Color = 1>> + <<set $activeSlave.origHColor = "white">> + <<set $activeSlave.skin = "pure white">> + <<set $activeSlave.origSkin = "pure white">> + <<set $activeSlave.override_Skin = 1>> + <<set $activeSlave.teeth = "fangs">> + <<set $activeSlave.devotion = 20>> + <<set $activeSlave.trust = 30>> + <<set $activeSlave.boobs = 300>> + <<set $activeSlave.earShape = "none">> + <<set $activeSlave.earT = "neko">> + <<set $activeSlave.earTColor = $activeSlave.hColor>> + <<set $activeSlave.earImplant = 1>> + <<set $activeSlave.tailShape = "neko">> + <<set $activeSlave.tailColor = $activeSlave.hColor>> + <<set $activeSlave.pupil = "catlike">> + <<set $activeSlave.weight = 10>> + <<set $activeSlave.muscles = 0>> + <<set $activeSlave.waist = 10>> + <<set $activeSlave.skill.vaginal = 0>> + <<set $activeSlave.vagina = 0>> + <<set $activeSlave.skill.oral = 0>> + <<set $activeSlave.skill.anal = 0>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.skill.whoring = 0>> + <<set $activeSlave.skill.entertainment = 0>> + <<set $activeSlave.canRecruit = 0>> + <<set $activeSlave.accent = 4>> + +It's finally time. Nieskowitz greets you with a rare smile as you enter the genetics lab, showing you to the tube where $subjectDeltaName floats unconcious. Far from the blob of pinkish flesh she once was, $subjectDeltaName is now a fully-formed humanoid, covered in a layer of beautiful, snow-white fur and topped with twitching, pointed cat ears. You can hear the bustle of the media, journalists who somehow found out about $subjectDeltaName's near completition and are all but breaking down the lab's door trying to get a good look in. +<br><br> +"Be aware that she won't have any instinctive knowledge of our language. Frankly, I don't know if she'll be capable of real human speech at all, honestly. This is a first for me, too. Try and keep her away from any cameras in her face, they're likely to frighten her. Anyway, I guess she's ready. Are you?" +<br><br> +<span id="result"> +<br> <<link "Lead $subjectDeltaName out from the lab, talking to media for her">> + <<replace "#result">> + The watching scientists hold their breath as the green liquid drains from the tube, and $subjectDeltaName hits the glass wall with an unglamorous thud. As the tube comes up, you carefully catch the white catgirl, feeling the silk-like softness of her entire body as the young vat-grown girl opens her eyes for the first time. She blinks her big, catlike eyes a few times, and then meows at you loudly, probably the closest thing she can manage to a question. In response, you set her down on wobbly feet, take her by the hand, and lead her out the doors of the genelab to meet an absolute hail of journalists with cameras and bright flashing lights shoving microphones and recorders in both of your faces. As the terrified, nude catgirl recoils from the confusing sound and noise, you promptly divert the recording devices towards your own face, explaining that she's in no state to speak for herself but you'll gladly take questions. Speaking with the media on such a momentous scientific occassion @@.green;improves your reputation@@ while $subjectDeltaName, interpreting your diversion as protecting her from the bright lights and scary noises, immediately @@.hotpink;likes@@ and @@.mediumaquamarine;trusts@@ you more. + <<run repX(2000, "event")>> + <<set $projectN.status = 6>> + <<set $activeSlave.prestige = 1>> + <<set $activeSlave.prestigeDesc = "$He was the world's very first catgirl, plastered all over the world within days of $his 'birth' as proof of your arcology's scientific superiority.">> + <<set $activeSlave.devotion += 5>> + <<set $activeSlave.trust += 5>> + <<run newSlave($activeSlave)>> + <</replace>> +<</link>> +<br> <<link "Force the media to disperse before leaving with $subjectDeltaName">> + <<replace "#result">> + The watching scientists hold their breath as the green liquid drains from the tube, and $subjectDeltaName hits the glass wall with an unglamorous thud. As the tube comes up, you carefully catch the white catgirl, feeling the silk-like softness of her entire body as the young vat-grown girl opens her eyes for the first time. She blinks her big, catlike eyes a few times, and then meows at you loudly, probably the closest thing she can manage to a question. In response, you set her down on wobbly feet, take her by the hand, and lead her out the doors of the genelab to meet an absolute hail of journalists with cameras and bright flashing lights shoving microphones and recorders in both of your faces. As the terrified, nude catgirl recoils from the confusing sound and noise, you tell the media that Dr. Nieskowitz will be handling their questions and you'll have anyone who tries to interrupt or scare you two on the way back to the penthouse arrested. Although you miss the chance to improve your reputation or use $subjectDeltaName for propaganda, she stares at you with big, catlike eyes as you lead her away from the crowd, full of obvious, immediate @@.hotpink;affection@@ and @@.mediumaquamarine;admiration.@@ + <<set $projectN.status = 6>> + <<set $activeSlave.devotion += 20>> + <<set $activeSlave.trust += 20>> + <<run newSlave($activeSlave)>> + <</replace>> +<</link>> +<br> <<link "Let the media get a good look at $subjectDeltaName as you leave">> + <<replace "#result">> + he watching scientists hold their breath as the green liquid drains from the tube, and $subjectDeltaName hits the glass wall with an unglamorous thud. As the tube comes up, you carefully catch the white catgirl, feeling the silk-like softness of her entire body as the young vat-grown girl opens her eyes for the first time. She blinks her big, catlike eyes a few times, and then meows at you loudly, probably the closest thing she can manage to a question. In response, you set her down on wobbly feet, take her by the hand, and lead her out the doors of the genelab to meet an absolute hail of journalists with cameras and bright flashing lights shoving microphones and recorders in both of your faces. As the terrified, nude catgirl recoils from the confusing sound and noise, you promptly push her forward, allowing the media to explore every last inch of her naked body while you answer questions. She's obviously @@.red;terrified@@ at the cameras in her face and crotch, not that the journalists seem to care, and although they get a @@.green;whole array of perfect footage@@ as you ignore $subjectDeltaName's loud, desperate meowing, you're forced to break off the imprompteau interview session early when $subjectDeltaName starts @@.gold;crying@@ as photos flash in her face. She's completely nonresponsive to your attempts to get her to stop bawling as the watching journalists awkwardly shuffle, and only stops sobbing loudly when you bring her away from the assembled crowd. As you lead $subjectDeltaName back to the penthouse, still sniffling and mrowling intermittently, she stares sullenly at you with big catlike eyes that only understand that you've @@.red;somehow betrayed her.@@ + <<set $projectN.status = 6>> + <<run repX(5000, "event")>> + <<set $activeSlave.prestige = 2>> + <<set $activeSlave.prestigeDesc = "$He was the world's very first catgirl, plastered all over the world within days of $his 'birth' as proof of your arcology's scientific superiority.">> + <<set $activeSlave.devotion -= 30>> + <<set $activeSlave.trust -= 30>> + <<run newSlave($activeSlave)>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNInitialized.tw b/src/events/scheduled/projectNInitialized.tw new file mode 100644 index 0000000000000000000000000000000000000000..86a4287b5918e5381452e48e5454d4fdd1589147 --- /dev/null +++ b/src/events/scheduled/projectNInitialized.tw @@ -0,0 +1,24 @@ +:: SE projectNInitialized [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + +After giving the order to your personal assistant to begin preparations for your transhumanist genetic engineering project, you spend much of the next week getting in contact with the most renowned geneticists and biologists of the old world. Many of these gray-bearded intellectuals scoff as you initially explain your goal of making a 'catgirl', but change their tune almost immediately when you mention the paycheck attached. By the end of the week, you've acquired an impressive team of high-profile minds en route to the arcology, many of them already setting up workstations and tables full of imported chemicals within your laboratory. +<br><br> +The first few days within the lab are spent organizing the new staff's structure; under your supervision, they create a formal research team headed by the ancient Doctor Nieskowitz, dubbed "Project N" both for the research head and as a dry joke by the ever-sardonic science team for their cat focused intentions. As things begin to formalize into the process of initial research, you realize you've got a decision to make before you've even started the project itself - are you going to keep Project N a secret from the rest of your arcology, or immediately bring it out into the public eye? +<br><br> +<span id="result"> +<br> <<link "Announce Project N to the public">> + <<replace "#result">> + You hold a press release the next day with a number of prominent journalists in the arcology noting the research team that you've gathered for project N, and its intention to create the world's first fully natural catgirl. Even though you've got absolutely no results to show and the project is still in its fully theoretical stage, the attending journalists react to the news with obvious @@.green;excitement@@ and you spend the next few hours answering conceptual questions that run on arcology media for the next couple of days, which @@.green;helps@@ promote your public image. When you return to the lab, Dr. Nieskowitz is clearly irritated, telling you that the media attention is almost guaranteed to @@.red;slow down@@ progress in these early stages. <<if $arcologies[0].FSBodyPurist != "unset">> This annoucement absolutely @@.red;horrifies@@ the body purists in your arcology.<</if>> + <<run repX(2000, "event")>> + <<set $projectN.public = 1>> + <<set $bodyPuristRiot = 1>> + <<if $arcologies[0].FSBodyPurist != "unset">><<run repX(-4000, "event")>><</if>> + <</replace>> +<</link>> +<br> <<link "Keep Project N quiet">> + <<replace "#result">> + You opt to keep Project N on the down-low for now, probably the safer choice. Lack of media attention will surely make your scientists @@.green; work faster@@ undisturbed, too. + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNMoMoney.tw b/src/events/scheduled/projectNMoMoney.tw new file mode 100644 index 0000000000000000000000000000000000000000..e1973dd1c4ff7d384a649b22606ec58abb7d1118 --- /dev/null +++ b/src/events/scheduled/projectNMoMoney.tw @@ -0,0 +1,51 @@ +:: SE projectNmomoney [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> +<<set $projectN.status = 0>> + +After a few weeks of theoretical designs and planning, the project N bioengineers finally have a set of results ready to present to you.Doctor Nieskowitz, heading up the team, presents you with a neat clipboard full of technical information as you enter the lab, telling you that he's got both good news and bad news. +<br> +The balding man launches into the good news first. "We've got our first sample prepared, and we've begun physical work manipulating the growing genetic structure of the subject." Nieskowitz gestures behind him to one of the genetic tubes, a vat filled with thick green liquid, where a fist-sized cluster of pink flesh-like material floats in the center. "We call her subject Delta." +<br> +"Unfortunately, it's not all rainbows and sunshine." Nieskowitz continues. "As it turns out, this work isn't going to be cheap. The initial cash injection let us get set up with our materials and provides the team a nice little paycheck, but we're going to need a lot more equipment to make this dream of yours a reality. We'll need top-line genetic sequencers, automated manipulation tools for precision physical work, a lot of new sterilization staff, complete AI intergration with the equipment for constant monitoring..." +<br><br> +<span id="result"> +<<if $cash >= 220000>> +<br> <<link "Give Nieskowitz however much he wants">> + <<replace "#result">> + You inform Nieskowitz that project N will have as much money as it needs. As the doctor starts rattling off necessities and upgrades to the genelab, the eventual list proves @@.red;hugely expensive@@, but the good doctor assures you that the money spent - over double your initial investment - will make sure project N runs @@.green;smoothly and rapidly.@@ + <<run cashX(-220000, "project N expenses")>> + <<set $projectN.status = 3>> + <<set $projectN.wellFunded = 1>> + <</replace>> +<</link>> +equivalent to <<print cashFormat(220000)>>. +<</if>> +<<if $cash >= 125000>> +<br> <<link "Provide Project N with adequate funding">> + <<replace "#result">> + You agree to spend, the amount of money Nieskowitz requests, but set a strict budgetary limit for them to follow. The doctor seems pleased, and doesn't contest this ruling as he starts to prepare the @@.red;expensive@@ upgrades and redesigns that'll be needed to keep the project going at a steady rate. + <<run cashX(-125000, "project N expenses")>> + <<set $projectN.status = 3>> + <</replace>> +<</link>> +equivalent to <<print cashFormat(125000)>>. +<</if>> +<<if $cash >= 50000>> +<br> <<link "Give Project N the bare minimum to limp on">> + <<replace "#result">> + You give Nieskowitz the bare minimum budget needed to keep project N operational. The doctor seems obviously displeased and makes no effort to hide his frustration with your limited budget, noting that your stinginess will @@.red;almost inevitably have consequences@@ to the sensitive nature of their work. Time will tell if he's correct. + <<run cashX(-50000, "project N expenses")>> + <<set $projectN.status = 3>> + <<set $projectN.poorlyFunded = 1>> + <</replace>> +<</link>> +equivalent to <<print cashFormat(50000)>>. +<</if>> +<br> <<link "Discontinue Project N">> + <<replace "#result">> + You casually hand back the clipboard to Nieskowitz and tell him that you didn't plan on spending a cent more on project N - and still don't. As the frustrated biologists start to pack up their things, Nieskowitz tells you that if you "get your head out of your ass" they'll be avalible to resume work on the project, provided you have the money to fund it this time. + <<set $projectN.status = 0>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNSaboteur.tw b/src/events/scheduled/projectNSaboteur.tw new file mode 100644 index 0000000000000000000000000000000000000000..1f62dc48560f756efe9b2f77d1d30b8f6032192c --- /dev/null +++ b/src/events/scheduled/projectNSaboteur.tw @@ -0,0 +1,46 @@ +:: SE projectNsaboteur [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event", $encyclopedia = "The Sons of Sekhmet">> +<<set $projectN.status = 9>> + +You're awoken in the middle of the night by your virtual assistant, informing you that there's a security breach in the genetics lab. It seems like a small team of well-trained saboteurs is currently in the process of planting an explosive on the project N equipment, detected via the AI's routine scanning of the entire arcology's camera system and noticing errors in the genetics lab consistent with outside interference. +<br><br> +You're not going to be able to get down there in time yourself, but you'll need to respond quickly, or else whoever sent these armed radicals will blow the lab, destroying all your work on project N and potentially killing a number of the nearby scientists, too. Over the cameras, as your assitant brings them back online, you can see one of them hastily spraying the symbol of a rising sun on the outside of the genelab, along with a short phrase in red paint - "THE SONS OF SEKHMET HAVE YOUR BLOOD". +<br><br> +<span id="result"> +<<if $projectN.wellFunded == 1>> +<br> <<link "Activate the lab's integrated security">> + <<replace "#result">> + You briefly thank your lucky stars that you invested enough in project N to provide for integrated security, then call for the lab's drones to activate. Over the cameras, you smugly watch from your comfortable bed as the security drones tear two of the mysterious saboteurs to shreds, then pin down and apprehend the third. Seems like all they managed to get you today was a @@.green;brand new slave.@@ + <<run repX(1500, "event")>> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 32>> + <<set $oneTimeDisableDisability = 1>> + <<set $activeSlave = GenerateNewSlave("")>> + <<run generateSalonModifications($activeSlave)>> + <<set $activeSlave.origin = "$He is an enslaved Son of Sekhmet, one of many idealistic rebel groups violently opposed to you.">> + <<set $activeSlave.devotion = random(-90,-70)>> + <<set $activeSlave.trust = random(-20,30)>> + <<set $activeSlave.weight = random(-20,30)>> + <<set $activeSlave.muscles = random(20,80)>> + <<set $activeSlave.waist = random(10,80)>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<set $projectN.status = 5>> + <</replace>> +<</link>> +<</if>> +<<if $mercenaries == 5>> +<br> <<link "Send for your $mercenariesTitle to bring in a rapid-response bomb defusal team">> + <<replace "#result">> + You immediately call for your $mercenariesTitle to send a bomb defusal team to the lab, and be ready to fight with the saboteurs on arrival. In the few minutes it takes for them to assemble a QRF and send it rocketing up to your laboratory, the saboteurs have already planted their bomb and vanished out the genelab's doors, dissapearing into the dead of night. The mercenary team arrives shortly afterwards, bursts through the doors, and disables the ticking bomb with less than a minute left on the clock. Panting and sweating with nerves rather than fatigue, one of them flashes you a thumbs-up over the security cameras. Crisis narrowly averted. + <<set $projectN.status = 5>> + <</replace>> +<</link>> +<</if>> +<br> <<link "Desperately try to make it to the lab yourself in time">> + <<replace "#result">> + As you sprint towards the lab, an ear-shatteringly loud explosion freezes you in your tracks. Pieces of rubble and glass rain down to your sides for a few seconds, as you watch flames engulf the majority of your genetics laboratory, bright reds and oranges staining your retinas. Most of the project N scientists slept in rooms attached to the lab itself - you don't even need to read your AI report to know that Nieskowitz and the core team are dead already. It'd shock you more if they hadn't died with the project they worked so hard to build. + <<set $projectN.status = 9>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/projectNTechRelease.tw b/src/events/scheduled/projectNTechRelease.tw new file mode 100644 index 0000000000000000000000000000000000000000..1bd42a1a7e049123e72ff0dd565e6972006eae03 --- /dev/null +++ b/src/events/scheduled/projectNTechRelease.tw @@ -0,0 +1,34 @@ +:: SE projectNtechrelease [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + +Project N is complete. You've successfully engineered the world's first natural catgirl, $subjectDeltaName, whose face you occassionally see splayed out on some media report excitedly detailing "new scientific innovations". Despite the unwanted attention from radicals and terrorists the project generated, seeing your face displayed in the news as a patron of progress certainly helps to make it feel as though it was all worth it in the end. +<br><br> +But even though the project's been finished, you still have one last decision to make. Media attention in the wake of $subjectDeltaName's release has generated significant public interest in the technologies and documentation used in project N, and as the sole propeitor of the tech, you've recieved generous offers from other arcology owners interested in creating their own catgirls along with public petitions to release all documents for public use. If you don't release the project N tech now, it's possible that a competitor might figure out how to engineer their own catgirls in the future, so if you want to capitalize on the short-lived media craze for either public face or money, it'd be best to make a decision on the matter immediately. +<br><br> +<span id="result"> +<br> <<link "Release the Project N documentation and technology for free">> + <<replace "#result">> + You opt to release the project N technologies for free public use, a decision you annouce in a brief media conference the next day. The unexpectedly generous decision is met with @@.green;praise@@ by the general public, although, of course, the only people who have the capital to actually apply the tech will be other exclusive plutocrats. You're sure that at least some nerd in his basement is going to use your open-source code to try and grow a catgirl in his basement, though. Godspeed. + <<run repX(3000, "event")>> + <<set $projectN.decisionMade = 1>> + <<set $projectN.techReleased = 1>> + <</replace>> +<</link>> +<br> <<link "Patent the Project N technologies and sell them selectively to other wealthy elites">> + <<replace "#result">> + You create a patent on the project N technologies and sell them to a select few arcology owners, mostly friends of yours. Although mildly dissapointing to some who hoped for an open-source release, this is more or less business as usual in the free cities, and you get to @@.green;line your own pockets@@ while other elites prepare their own labs to corner the emerging demand for catgirl slaves alongside you. The rich get richer. Just another day in paradise. + <<run cashX(80000, "project N tech sale")>> + <<set $projectN.decisionMade = 1>> + <<set $projectN.techReleased = 1>> + <</replace>> +<</link>> +<br> <<link "Hoard the Project N technologies to yourself to create a monopoly on catgirl production">> + <<replace "#result">> + You opt to leave the other elites completely out of it and refuse to sell or release the project N technologies at all. This decision is seen as @@.red;open greed@@ by both the general public and other wealthy elites, who make a point of bashing you over the choice on major news networks. Although you've ruffled some feathers by choosing to corner the market yourself, you now have a total monopoly on catgirl production, and as long as you can keep Nieskowitz and the other scientists churning out catgirls, you could make an absolute killing as their sole propeitor... + <<set $projectN.decisionMade = 1>> + <<run repX(-1500, "event")>> + <</replace>> +<</link>> +((WARNING: This decision will PERMANENTLY DISABLE any natural generation of catgirls outside the ones you create yourself.)) +</span> diff --git a/src/events/scheduled/vatcatboy.tw b/src/events/scheduled/vatcatboy.tw new file mode 100644 index 0000000000000000000000000000000000000000..4ac3b2df4840a7916bd01faa6c4044809ba45525 --- /dev/null +++ b/src/events/scheduled/vatcatboy.tw @@ -0,0 +1,49 @@ +:: SE vatcatboy [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 16>> + <<set $oneTimeDisableDisability = 1>> + <<set $fixedRace = "catgirl">> + <<set $activeSlave = GenerateNewSlave("XY", {nationality: "Stateless"})>> + <<set $activeSlave.origin = "$He is a vat-grown catboy created by Dr. Nieskowitz and the science team in your genelab.">> + <<set $activeSlave.face = random(55,95)>> + <<set $activeSlave.faceShape = "feline">> + <<set $activeSlave.slaveName = setup.catSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + <<set $activeSlave.slaveSurname = "">> + <<set $activeSlave.birthSurname = "">> + <<set $activeSlave.career = "an orphan">> + <<set $activeSlave.intelligenceImplant = 0>> + <<set $activeSlave.teeth = "fangs">> + <<set $activeSlave.devotion = 20>> + <<set $activeSlave.trust = 30>> + <<set $activeSlave.earShape = "none">> + <<set $activeSlave.earT = "neko">> + <<set $activeSlave.earTColor = $activeSlave.hColor>> + <<set $activeSlave.earImplant = 1>> + <<set $activeSlave.tailShape = "neko">> + <<set $activeSlave.tailColor = $activeSlave.hColor>> + <<set $activeSlave.pupil = "catlike">> + <<set $activeSlave.weight = 10>> + <<set $activeSlave.muscles = 0>> + <<set $activeSlave.waist = 10>> + <<set $activeSlave.skill.oral = 0>> + <<set $activeSlave.skill.anal = 0>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.skill.whoring = 0>> + <<set $activeSlave.skill.entertainment = 0>> + <<set $activeSlave.accent = 4>> + <<set $activeSlave.canRecruit = 0>> + +With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconcious catboy, floating suspended in the tube of thick green liquid you use to grow them. "Looks like he came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. $activeSlave.slaveName is going to make a lovely addition to your little collection." +<br><br> +<span id="result"> +<br> <<link "Bring your new slave back home">> + <<replace "#result">> + There's no obnoxious media attention this time getting in the way of you and your brand new, confusedly meowing catboy. It's just you, the rising sun over your arcology, and a fresh new cat to lead up to the penthouse. + <<set $projectN.status = 6>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <</replace>> +<</link>> +</span> diff --git a/src/events/scheduled/vatcatgirl.tw b/src/events/scheduled/vatcatgirl.tw new file mode 100644 index 0000000000000000000000000000000000000000..bd9163ae5582073666fcab7f06664a1217b7822a --- /dev/null +++ b/src/events/scheduled/vatcatgirl.tw @@ -0,0 +1,51 @@ +:: SE vatcatgirl [nobr] + +<<set $nextButton = "Continue", $nextLink = "Scheduled Event">> + <<set $activeSlaveOneTimeMinAge = 16>> + <<set $activeSlaveOneTimeMaxAge = 16>> + <<set $oneTimeDisableDisability = 1>> + <<set $fixedRace = "catgirl">> + <<set $activeSlave = GenerateNewSlave("XX", {nationality: "Stateless"})>> + <<set $activeSlave.origin = "$He is a vat-grown catgirl created by Dr. Nieskowitz and the science team in your genelab.">> + <<set $activeSlave.face = random(55,95)>> + <<set $activeSlave.faceShape = "feline">> + <<set $activeSlave.slaveName = setup.catSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + <<set $activeSlave.slaveSurname = "">> + <<set $activeSlave.birthSurname = "">> + <<set $activeSlave.career = "an orphan">> + <<set $activeSlave.intelligenceImplant = 0>> + <<set $activeSlave.devotion = 20>> + <<set $activeSlave.trust = 30>> + <<set $activeSlave.earShape = "none">> + <<set $activeSlave.teeth = "fangs">> + <<set $activeSlave.earT = "neko">> + <<set $activeSlave.earTColor = $activeSlave.hColor>> + <<set $activeSlave.earImplant = 1>> + <<set $activeSlave.tailShape = "neko">> + <<set $activeSlave.tailColor = $activeSlave.hColor>> + <<set $activeSlave.pupil = "catlike">> + <<set $activeSlave.weight = 10>> + <<set $activeSlave.muscles = 0>> + <<set $activeSlave.waist = 10>> + <<set $activeSlave.skill.vaginal = 0>> + <<set $activeSlave.vagina = 0>> + <<set $activeSlave.skill.oral = 0>> + <<set $activeSlave.skill.anal = 0>> + <<set $activeSlave.anus = 0>> + <<set $activeSlave.skill.whoring = 0>> + <<set $activeSlave.skill.entertainment = 0>> + <<set $activeSlave.accent = 4>> + <<set $activeSlave.canRecruit = 0>> + +With their latest genemodding project complete, Dr. Nieskowitz proudly presents to you a healthy, unconcious catgirl, floating suspended in the tube of thick green liquid you use to grow them. "Looks like she came out just fine." The aging doctor says with an authoritative gesture. "Another successful project. $activeSlave.slaveName is going to make a lovely addition to your little collection." +<br><br> +<span id="result"> +<br> <<link "Bring your new slave back home">> + <<replace "#result">> + There's no obnoxious media attention this time getting in the way of you and your brand new, confusedly meowing catgirl. It's just you, the rising sun over your arcology, and a fresh new cat to lead up to the penthouse. + <<set $projectN.status = 6>> + <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <</replace>> +<</link>> +</span> diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js index 5fe770d000fbb72eec75d6f1e15ec2b2a61970c0..0fccf40c002bb5e67fbb9a0fa515f3628d3a098b 100644 --- a/src/facilities/nursery/utils/nurseryUtils.js +++ b/src/facilities/nursery/utils/nurseryUtils.js @@ -171,11 +171,19 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) { child.dietCum = 0; child.dietMilk = 0; child.drugs = "no drugs"; + if (child.race !== "catgirl") { child.earImplant = 0; - child.earPiercing = 0; child.earShape = "normal"; child.earT = "none"; child.earTColor = "hairless"; + } + if (child.race === "catgirl") { + child.earImplant = 1; + child.earShape = "none"; + child.earT = "neko"; + child.earTColor = child.hColor; + } + child.earPiercing = 0; child.earwear = "none"; child.electrolarynx = 0; child.energy = 0; @@ -333,9 +341,14 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) { child.stampTat = 0; child.rules.punishment = "situational"; child.rules.reward = "situational"; - child.tail = "none"; + if (child.race !== "catgirl") { child.tailColor = "none"; child.tailShape = "none"; + } + if (child.race === "catgirl") { + child.tailColor = child.hColor; + child.tailShape = "neko"; + } child.tastes = 0; child.teeth = "baby"; child.tonguePiercing = 0; @@ -427,6 +440,16 @@ App.Facilities.Nursery.nameChild = function nameChild(child) { <</link>>`; } } + if (child.race === "catgirl") { + r += `<br> + <<link "Have your PA assign ${him} a random cat name">> + <<replace "#naming">>`; + child.slaveName = setup.catSlaveNames.random(); + child.birthName = child.slaveName; + r += `${V.assistant.name} registers the new ${girl} as "${child.slaveName}" in your registry. + <</replace>> + <</link>>`; + } if (arcology.FSChattelReligionist !== "unset") { r += `<br> <<link "Have your PA assign ${him} a random devotional name">> diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index 438c3a02159ad44488e7cba8c54056d3bae1f304..1d84f6367fbdb4913d4fbb0baf1fc25be62922cb 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -2318,6 +2318,18 @@ LORE: FREE CITIES CULTURE TOMORROW <br><br> — Lawrence, J. K., and Bolingbroke, D. S., __Trends in Free Cities Culture, 2031__ //Journal of Modern Social Sciences, International Edition, February 2032//// +<<case "The Sons of Sekhmet">> + //Bhalwi al-sham asmik qalbik, abna Sakhmat damkun. (By the Sun I grasp your Heart, the Sons of Sekhmet have your Blood.) + <br> — Mantra, unknown author + + <br><br>Described as the "logical continuation of Islamic terror organizations within the new world" by a prominent arcology owner, the Sons of Sekhmet are a global terrorist organization notorious for its viciousness and worldwide strike capacity. Formed in 2018 by Quati ibn Malek, the leader of a relatively minor radical islamic sect within Egypt, the Sons gained notoriety for seizing one of the first arcology clusters in the Sahara Desert and defending it from multiple incursions by old world peacekeeping forces. ibn Malek was successfully assassinated by the Egyptian government in 2024, but the Sons have been unable to dislodge from their desert stronghold, and have used the resources of an arcology cluster to expand their prescence and doctrine onto the global stage. + + <br><br>Their use of cell tactics and frequent insurgent action against arcology owners has led to comparisons with the Daughters of Liberty, but this is a misguided comparison. Where the Daughters are an ideologically-motivated anti-slavery organization, the Sons long ago cast off their islamisist roots to adopt a brutal, pragmatic approach to terrorism with few considerations other than the expansion of their own power; Sekhmet cells frequently use slaves as footsoldiers and suicide bombers, but their primary approach to recruitment is with the poor and downtrodden of arcologies and old world nations. Basic Sons doctrine holds that the Old World was destroyed by wealthy, hedonistic plutocrats who have fled their failed nations to the arcologies to live out lives of decadence as the world they shattered collapses, leaving the "common people" to starve in their wake. This simple mantra attracts disgruntled individuals from around the world, and the Sons maintain an extremely online prescence, with underground cells active in nearly every old world nation. + + <br><br>The capability of the Sons to provide manufactured weaponry and training, and their willingness to do so to anyone willing to pledge their life to the Orange Sun, makes them exceptionally dangerous. The Sons seize any possible oppurtunity to expand their wealth and power, and frequently launch assassination attempts on prominent public figures, sabotauge essential facilities, and attempt to stir chaos and unrest in vulnerable regions, often with the intent of stepping in and seizing power for themselves once the area has been sufficiently destabilized. Unlike many smaller-scale terrorist groups, the Sons produce some of the best-trained killers and thugs in the New World, and lie almost completely out of the reach of old world nations and arcology owners alike in their scorching desert arcology. Any responsible arcology owner should be aware of the orange sun used as the logo of the Sons of Sekhmet and take care to not expose themselves to any weakness. + + <br><br> — Lawrence, J. K., and Bolingbroke, D. S., __Trends in Free Cities Culture, 2031__ //Journal of Modern Social Sciences, International Edition, February 2032//// + <<case "The Purity of the Human Form">> //Twentieth century eugenicists weren't wrong, they just didn't have the tools to be right. @@ -3104,6 +3116,16 @@ MODS <br> **Our guarantee does not cover slaveowners who underestimate their slaves' potency and wind up pregnant. +<<case "Catmod">> + <h4>Catmod</h4> + Catmod is an optional modification that focuses on, surprise surprise, adding catgirls to the game. However, as you might have noticed, Free Cities is based on our own universe, and, unfortunately, catgirls don't actually exist. So how is one to acquire fuckable cats in a world sadly devoid of them? Well, multi-million dollar genetic engineering projects, of course! After a massive investment in your genelab and the best old world engineers avalible, you too will be able to create your very own inhuman abominations of science with cute, twitchy ears and button noses. Catgirls contain a number of mechanical changes and unique features, many of which you will have to find out for yourself through your exciting journey through the world of scientific malpractice. Worth noting for mechanical purposes, however, is that the //Feline// face type is only found on catgirls, and has a similar effect to exotic faces; uglier feline faces are dramatically worse, while beautiful feline faces are signiicantly better from a beauty perspective. + +<<case "Bioengineering">> + With the technological advancements of 2037, society stands on the precipice of truly transhumanist biological engineering. Those with the will and the resources to get what they want, meaning you, are now uniquely capable of taking the fundamental code of DNA and using it as a building block to create and reshape biology as they desire. That doesn't mean the process of genetic engineering is going to be easy or simple; at minimum, you'll need a fully upgraded genelab and a team of professional, world-class scientists with the resources of a small nation at their disposal to get what you want. But once you've put all the pieces in place, the possibilities that can emerge from your engineering tubes are nearly endless. + +<<case "Catgirls">> + Part of humanity's dream for thousands of years. As far back as the Ancient Egyptians, humans have looked at the sleek and smug nature of cats, and imagined them as tall, busty catgirls with which they could fornicate. Yet all those men and women of the past lacked the capability to make their dreams come true; you, on the other hand, do not. While the process to splice human and cat DNA, whether you take from common housecats or the more dangerous coding of lion or panther genetics, will undoubtedly be arduous and expensive, the end result of a sleek, dexterous, inhumanly flexible creature that can wrap its tail around your throat as you fuck it is perhaps enough of a prize to make the difficulties worth it. To get started on engineering catgirls, you'll need to contact a team of genetic engineers from a fully upgraded genelab, and give them enough time and money to achieve results within your lab. + <<case "Artificial Insemination">> A simple surgical procedure involving the injection of harvested sperm into a fertile womb. Useful for assuring the conception of a child of the desired union, impregnation without sexual intercourse, circumventing physical and mental quirks in copulation, or just finding the perfect Virgin Mary for the holidays. @@ -3137,6 +3159,7 @@ MODS <<case "Contraband and Illegal Goods">> While there is little to no issue with possessing nearly anything, getting your hands on it may not always be feasible. Be it local policy or overreaching business deals, certain goods may not be found for sale in the Free City. This does not stop some of the shadier dealers from risking the sale of them, of course; this is where smugglers come in. There is always a market for contraband and illicit goods and never a shortage of people looking to buy them. Not all smugglers are successful, and those that aren't soon find themselves up for sale in the slave markets. + <<case "Security Expansion">> The Security Expansion Mod <hr> diff --git a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw index acd27165b1ce4a3509824233172e1506f75d393a..8708300e781ccadc6c414157540e5110608158d9 100644 --- a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw +++ b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw @@ -378,7 +378,7 @@ LORE: THE FREE CITIES TODAY /********** LORE: FREE CITIES CULTURE TOMORROW **********/ -"The New Rome" "The Return of Feudalism" "Naked, Barefoot, and Pregnant" "The Top" "The Bottom" "The Purity of the Human Form" "A World Built on Implants" "Slaves as Stock" "Slavery and the Physical Ideal" "Faith in the Free Cities" +"The New Rome" "The Return of Feudalism" "Naked, Barefoot, and Pregnant" "The Sons of Sekhmet" "The Top" "The Bottom" "The Purity of the Human Form" "A World Built on Implants" "Slaves as Stock" "Slavery and the Physical Ideal" "Faith in the Free Cities" /********** LORE: INTERVIEWS **********/ @@ -398,6 +398,7 @@ LORE: INTERVIEWS <<= App.Encyclopedia.Dialog.linkSC("The New Rome", "The New Rome")>> | <<= App.Encyclopedia.Dialog.linkSC("The Return of Feudalism", "The Return of Feudalism")>> | <<= App.Encyclopedia.Dialog.linkSC("Naked, Barefoot, and Pregnant", "Naked, Barefoot, and Pregnant")>> + | <<= App.Encyclopedia.Dialog.linkSC("The Sons of Sekhmet", "The Sons of Sekhmet")>> | <<= App.Encyclopedia.Dialog.linkSC("The Top", "The Top")>> | <<= App.Encyclopedia.Dialog.linkSC("The Bottom", "The Bottom")>> | <<= App.Encyclopedia.Dialog.linkSC("The Purity of the Human Form", "The Purity of the Human Form")>> @@ -439,6 +440,7 @@ MODS | <<= App.Encyclopedia.Dialog.linkSC("The Special Force Mod", "Special Force")>> | <<= App.Encyclopedia.Dialog.linkSC("The Security Expansion Mod", "Security Expansion")>> | <<= App.Encyclopedia.Dialog.linkSC("FCTV", "FCTV")>> + | <<= App.Encyclopedia.Dialog.linkSC("Catmod", "Catmod")>> <<case "Lolimod" "Lolis and the Free Cities" "Fertility Age" "Male Fertility" "Cradle Robbers" "Precocious Puberty" "Childhood Fertility Induced NCS">> <<= App.Encyclopedia.Dialog.linkSC("Lolis and the Free Cities", "Lolis and the Free Cities")>> @@ -457,4 +459,9 @@ MODS <<= App.Encyclopedia.Dialog.linkSC("FCTV", "FCTV")>> | <<= App.Encyclopedia.Dialog.linkSC("FCTVReceiver", "FCTVReceiver")>> +<<case "Catmod" "Bioengineering" "Catgirls">> + <<= App.Encyclopedia.Dialog.linkSC("Catmod", "Catmod")>> + | <<= App.Encyclopedia.Dialog.linkSC("Catgirls", "Catgirls")>> + | <<= App.Encyclopedia.Dialog.linkSC("Bioengineering", "Bioengineering")>> + <</switch>> diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 90faa04dd30cf834ccdb341f4c20ab22783af958..66a4e2d7febfb2387ba7159f7e052a46c99c9433 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -440,6 +440,10 @@ App.UI.optionsPassage = function() { .addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div>"); + options.addOption("Catmod is currently", "seeCats") + .addValue("Enabled", 1).on().addValue("Disabled", 0).off() + .addComment("Will not murder existing catgirls, you have to do that yourself."); + el.append(options.render()); if (V.secExpEnabled > 0) { diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index 1850cfa4448d0cca97f27e3caddbb91f143147c5..63b5f54bf3c81117a72656e2f26868aa28bdd9d7 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -2237,7 +2237,7 @@ globalThis.walkPast = (function() { } break; case "a slave gown": - t += `${His} gorgeous dress has thoughtful cuts that tastefully bares ${his} ${(slave.boobs < 300) ? 'non-existent ' : ''}breasts.`; + t += `${His} gorgeous dress has thoughtful cuts that tastefully bares ${his} ${(slave.boobs < 300) ? "non-existent " : ""}breasts.`; break; case "slutty business attire": t += `${His} suit jacket and blouse are low enough to show off a lot of `; @@ -2257,7 +2257,7 @@ globalThis.walkPast = (function() { t += `${His} fabulous silken ball gown is tailored to accentuate the shape of ${his} ${breasts}.`; break; case "a slutty nurse outfit": - t += `${His} jacket presents ${his} ${(slave.boobs < 300) ? 'nipples' : 'breasts'} to be ogled.`; + t += `${His} jacket presents ${his} ${(slave.boobs < 300) ? "nipples" : "breasts"} to be ogled.`; break; case "a schoolgirl outfit": t += `${His} blouse lewdly displays ${his} `; @@ -2282,7 +2282,7 @@ globalThis.walkPast = (function() { case "leather pants": case "jeans": case "sport shorts": - t += `Since ${he}'s wearing nothing but ${slave.clothes}, ${his} ${(slave.boobs < 300) ? 'non-existent ' : ''}breasts are delightfully naked.`; + t += `Since ${he}'s wearing nothing but ${slave.clothes}, ${his} ${(slave.boobs < 300) ? "non-existent " : ""}breasts are delightfully naked.`; break; case "a hijab and blouse": t += `${His} blouse and overshirt keep ${his} ${breasts} concealed.`; @@ -2303,10 +2303,10 @@ globalThis.walkPast = (function() { } break; case "a fallen nuns habit": - t += `${His} slutty nun outfit leaves ${his} ${(slave.boobs < 300) ? 'flat ' : ''}tits sinfully bare.`; + t += `${His} slutty nun outfit leaves ${his} ${(slave.boobs < 300) ? "flat " : ""}tits sinfully bare.`; break; case "a chattel habit": - t += `${His} chattel habit leaves ${his} ${(slave.boobs < 300) ? 'flat ' : ''}tits virtuously bare.`; + t += `${His} chattel habit leaves ${his} ${(slave.boobs < 300) ? "flat " : ""}tits virtuously bare.`; break; case "a penitent nuns habit": t += `${His} habit chafes ${his} nipples so harshly that it would probably be a relief to ${him} to have it stripped off ${him}.`; @@ -2366,7 +2366,7 @@ globalThis.walkPast = (function() { } break; case "harem gauze": - t += `${His} ${(slave.boobs < 300) ? 'non-existent ' : ''}breasts are clearly visible through the thin gauze that covers them.`; + t += `${His} ${(slave.boobs < 300) ? "non-existent " : ""}breasts are clearly visible through the thin gauze that covers them.`; break; case "slutty jewelry": if (slave.boobs < 300) { @@ -2477,7 +2477,7 @@ globalThis.walkPast = (function() { case "no clothing": if (slave.chastityAnus === 1 || slave.chastityVagina === 1 || slave.chastityPenis === 1) { - t += `Since ${he}'s wearing nothing but a chastity belt, ${his} ${(slave.boobs < 300) ? 'non-existent ' : ''}breasts are delightfully naked.`; + t += `Since ${he}'s wearing nothing but a chastity belt, ${his} ${(slave.boobs < 300) ? "non-existent " : ""}breasts are delightfully naked.`; } else { t += `${His} naked `; if (slave.boobs < 300) { @@ -9241,6 +9241,8 @@ globalThis.walkPast = (function() { default: if (slave.chastityVagina) { t += `${His} chastity belt leaves ${his} ass available.`; + } else if (slave.race === "catgirl") { + t += `${his} tail swishes around above the tip of ${his} asscrack, drawing the eye to ${his} swaying, feline butt.`; } else { t += `You run your eye over ${his} naked ass.`; } @@ -9319,7 +9321,9 @@ globalThis.walkPast = (function() { t += `${His} suit is expressly designed to encourage use of ${his} face hole.`; } else { t += `${His} unadorned `; - if (V.PC.dick !== 0) { + if (slave.race === "catgirl") { + t += `lips and the threatening fangs underneath make an exciting, dangerous target.`; + } else if (V.PC.dick !== 0) { t += `throat is just waiting to be wrapped around a thick shaft.`; } else { t += `lips are just begging for a cunt to lavish attention on.`; diff --git a/src/interaction/siCustom.js b/src/interaction/siCustom.js index 2fda585eaefef7ddeeb7a2146668a256180d6541..953681d3c1cc97a94d77355f285dc2fa39517c6d 100644 --- a/src/interaction/siCustom.js +++ b/src/interaction/siCustom.js @@ -195,6 +195,9 @@ App.UI.SlaveInteract.custom = function(slave) { if (V.arcologies[0].FSChattelReligionist !== "unset") { linkArray.push(chooseThreeNames(`Give ${him} a random devotional given name`, App.Data.misc.chattelReligionistSlaveNames, "devotional-names")); } + if (slave.race === "catgirl") { + linkArray.push(chooseThreeNames(`Give ${him} a random cat name`, App.Data.misc.catSlaveNames, "cat-names")); + } result.append(App.UI.DOM.generateLinksStrip(linkArray)); slaveNameNode.appendChild(result); return slaveNameNode; diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js index 027c4af5a1a039f53fa7090fcb1334a6b89b8712..f94b038d35e82427eae49d3448410b2cf04b26d2 100644 --- a/src/interaction/siWork.js +++ b/src/interaction/siWork.js @@ -358,6 +358,9 @@ App.UI.SlaveInteract.work = function(slave) { if (V.cheatMode === 1) { sexOptions.push({text: `Pat ${his} head`, scene: `FPat`}); } + if (slave.race === "catgirl") { + sexOptions.push({text: `Pet ${him}`, scene: `FPet`}); + } sexOptions.push({text: `Grope ${his} boobs`, scene: `FondleBoobs`}); if (slave.nipples === "fuckable" && V.PC.dick > 0) { diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 304aa52b4f2f74c5ad50694a61098eabea76aea0..a9dd7a345efed957a09f1cdbce41699880c9783b 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -1125,6 +1125,7 @@ App.Entity.SlaveState = class SlaveState { * * "cute" * * "sensual" * * "exotic" + * * "feline" (catmod exclusive) */ this.faceShape = "normal"; /** diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index 7901410021bce0f4021a4425fcc38a8ffdb4c5f2..eee1a58e91b7c35629b1af98322526c62063bc74 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -250,6 +250,9 @@ globalThis.BeautyArray = (function() { case "exotic": adjustBeauty("Face: General", (2 * (slave.face / 30))); break; + case "feline": + adjustBeauty("Face: General", (2 * (slave.face / 30))); + break; case "sensual": adjustBeauty("Face: General", (2 + (slave.face / 30))); break; @@ -2491,6 +2494,39 @@ globalThis.slaveCostBeauty = (function() { multiplier -= 0.2; } } + if (V.seeCats === 1) { + if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 1) { + if (slave.race === "catgirl") { + multiplier += 0.5; + } + } else if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 0) { + if (slave.race === "catgirl") { + multiplier += 0.9; + } + } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 0) { + if (slave.race === "catgirl") { + multiplier -= 0.5; + } + } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 1) { + if (slave.race === "catgirl") { + multiplier += 0.5; + } + } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 0) { + if (slave.race === "catgirl") { + multiplier += 0.9; + } + } + if (arcology.FSEgyptianRevivalist !== "unset") { + if (slave.race === "catgirl") { + multiplier += 0.2; + } + } + if (arcology.FSTransformationFetishist !== "unset") { + if (slave.race === "catgirl") { + multiplier += 0.2; + } + } + } if (arcology.FSRepopulationFocusSMR !== 0) { if (slave.preg > 0) { multiplier += 0.1; diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js index 53b660dfcb4c432303ccebf84069a2036d33fb40..94f6f00481fbb808b5918ee099dd84d42ccb0dd7 100644 --- a/src/js/utilsSlave.js +++ b/src/js/utilsSlave.js @@ -1618,6 +1618,9 @@ globalThis.randomRaceSkin = function(raceName) { case "white": skin = jsEither(["fair", "light", "pale"]); break; + case "catgirl": + skin = jsEither(["black", "white", "brown", "red", "black and white striped", "yellow"]); + break; default: skin = jsEither(["dark", "light", "pale"]); break; @@ -1648,6 +1651,7 @@ globalThis.randomRaceEye = function(raceName) { eye = jsEither(["blue", "brown", "brown", "brown", "brown", "brown", "brown", "green"]); break; case "semitic": + case "catgirl": case "white": eye = jsEither(["blue", "brown", "brown", "brown", "green", "green"]); break; @@ -1682,6 +1686,9 @@ globalThis.randomRaceHair = function(raceName) { case "white": hair = jsEither(["black", "black", "blonde", "brown", "brown", "red"]); break; + case "catgirl": + hair = jsEither(["black", "white", "blonde", "brown", "red"]); + break; default: hair = jsEither(["black", "black", "black", "black", "blonde", "brown", "brown", "red"]); break; @@ -2171,7 +2178,9 @@ globalThis.SlaveTitle = function(slave) { } else if (slave.dick > 0 && slave.balls === 0 && slave.vagina === -1 && slave.ovaries === 0) { r = "eunuch"; } else if (slave.dick > 0 && slave.balls > 0 && slave.vagina === -1 && slave.ovaries === 0) { - if (slave.face > 10 && slave.hips > -1 && slave.shoulders < 1 && slave.faceShape !== "masculine") { + if (slave.race === "catgirl") { + r = "catboy"; + } else if (slave.face > 10 && slave.hips > -1 && slave.shoulders < 1 && slave.faceShape !== "masculine") { r = "trap"; } else if (slave.boobs > 800) { r = "tittyboy"; @@ -2189,7 +2198,9 @@ globalThis.SlaveTitle = function(slave) { r = "slaveboy"; } } else if (slave.dick === 0 && slave.balls === 0 && slave.vagina > -1) { - if ((slave.shoulders > slave.hips || slave.faceShape === "masculine") && slave.boobs < 400 && slave.genes === "XY") { + if (slave.race === "catgirl") { + r = "catgirl"; + } else if ((slave.shoulders > slave.hips || slave.faceShape === "masculine") && slave.boobs < 400 && slave.genes === "XY") { r = "cuntboy"; } else if (slave.ovaries === 0 && slave.genes === "XY") { r = "tranny"; @@ -2596,6 +2607,9 @@ globalThis.DegradingName = function(slave) { case "mixed race": names.push("Mixed", "Mulatto", "Mutt"); break; + case "catgirl": + names.push("Cat", "Furry", "Feline"); + break; } } names.push(slave.hColor); diff --git a/src/js/vignettes.js b/src/js/vignettes.js index 05525a23269a5a77f4d8745a63a64b6d00ff8e4c..a103cd3c9a03357faf648b9fbc604958a0a5570c 100644 --- a/src/js/vignettes.js +++ b/src/js/vignettes.js @@ -1305,6 +1305,18 @@ globalThis.GetVignette = function(slave) { effect: 1, }); } + if (slave.race === "catgirl" && V.seeCats === 1) { + vignettes.push({ + text: `a customer was excited by ${his} feline nature and spent most of the week fucking ${him},`, + type: "cash", + effect: 1, + }); + vignettes.push({ + text: `a customer was intimidated by ${his} catlike nature and sharp fangs and canceled their appointment,`, + type: "cash", + effect: -1, + }); + } if (slave.intelligence + slave.intelligenceImplant < -50) { vignettes.push({ text: `a customer managed to trick ${him} into fucking him without payment,`, @@ -2716,6 +2728,18 @@ globalThis.GetVignette = function(slave) { effect: 1, }); } + if (slave.race === "catgirl" && V.seeCats === 1) { + vignettes.push({ + text: `a citizen was fascinated by ${his} feline traits and gave ${him} an intimate public examination,`, + type: "rep", + effect: 1, + }); + vignettes.push({ + text: `a citizen mocked ${his} strange catlike features, making ${him} into a bullying target for a few hours,`, + type: "rep", + effect: -1, + }); + } if (slave.devotion > 95) { vignettes.push({ text: `${he} really pushed ${himself} to please a citizen with tastes that disgusted ${him},`, @@ -4415,6 +4439,18 @@ globalThis.GetVignette = function(slave) { effect: -1, }); } + if (slave.race === "catgirl" && V.seeCats === 1) { + vignettes.push({ + text: `${he} kicked and protested in the showers because of some catlike racial instinct,`, + type: "health", + effect: -1, + }); + vignettes.push({ + text: `${he} deeply enjoyed ${his} lazy downtime, sleeping across nearly every hard surface in the penthouse,`, + type: "health", + effect: 1, + }); + } if (slave.relationship === -2) { if (slave.rules.speech === "permissive") { if (slave.intelligence + slave.intelligenceImplant > 50) { diff --git a/src/npc/children/ChildState.js b/src/npc/children/ChildState.js index 8694e2f4ae32de76817984da7aa489f580f354a8..9c4a77803e2ad830bf5f883e98fbb59a0daf034d 100644 --- a/src/npc/children/ChildState.js +++ b/src/npc/children/ChildState.js @@ -617,6 +617,7 @@ App.Facilities.Nursery.ChildState = class ChildState { * * "cute" * * "sensual" * * "exotic" + * * "feline" (catmod exclusive content) */ this.faceShape = "normal"; /** diff --git a/src/npc/children/customizeChild.tw b/src/npc/children/customizeChild.tw index 243dec682954c23a60aad9dc166508eff67a68c3..8570a66c24f9426a0080420f5f47895273716ec2 100644 --- a/src/npc/children/customizeChild.tw +++ b/src/npc/children/customizeChild.tw @@ -84,6 +84,12 @@ You may enter custom descriptors for the child's hair color, hair style, tattoos <</link>> <</if>> <</if>> + <<if child.race == "catgirl">> + | <<link "Give $him a random cat given name">> + <<set $activeChild.slaveName = setup.catSlaveNames.random()>> + <<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>> + <</link>> + <</if>> <<if $arcologies[0].FSChattelReligionist != "unset">> | <<link "Give $him a random devotional given name">> <<set $activeChild.slaveName = setup.chattelReligionistSlaveNames.random()>> diff --git a/src/npc/children/longChildDescription.js b/src/npc/children/longChildDescription.js index 877c211d852280f26a63b77dc692ac8cc8bf0f5a..831da4c968d61289b1e8ac297cb5903cbf6a03de 100644 --- a/src/npc/children/longChildDescription.js +++ b/src/npc/children/longChildDescription.js @@ -18,6 +18,9 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event he, him, his, hers, himself, boy, He, His, girl } = getPronouns(child); + const skintype = (slave.race === "catgirl") ? "skin" : "fur" + const freckled = (slave.race === "catgirl") ? "freckled" : "spotted" + // helper functions function accent(child) { let r = ``; @@ -418,9 +421,11 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } - if (child.pubicHStyle === "bushy" || child.pubicHStyle === "very bushy") { - if (child.physicalAge >= 13) { - r += `Since ${he} has been left natural, ${he} has some light ${child.pubicHColor} pubic hair around ${his} ass. `; + if (child.race !== "catgirl") { + if (child.pubicHStyle === "bushy" || child.pubicHStyle === "very bushy") { + if (child.physicalAge >= 13) { + r += `Since ${he} has been left natural, ${he} has some light ${child.pubicHColor} pubic hair around ${his} ass. `; + } } } @@ -2068,9 +2073,6 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } - - - if (child.prostate > 2) { r += `The area above ${his} crotch has a slight swell to it from ${his} prostate implant. A constant dribble of precum streams from the hole and down ${his} testicles; ${his} artificially hyperactive prostate keeps ${him} that way. `; } else if (child.prostate > 1) { @@ -2170,7 +2172,9 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event switch (child.earShape) { case "none": if (child.earImplant) { - if (child.earT !== "none") { + if (child.earT !== "none" && child.race === "catgirl") { + r += `${He} has smooth fur where a normal human's ears would be, as ${he} instead hears out of ${his} twitchy, sensitive cat ears.`; + } else if (child.earT !== "none" && child.race !== "catgirl") { r += `${He} has smooth skin where ${his} ears should be as ${his} hearing has been cybernetically rerouted to ${his} secondary ears. `; } else { r += `${He} has nothing but small, perforated metal disks where ${his} ears should be. `; @@ -4344,7 +4348,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event function skin(child) { let r = ``; - if (V.seeNationality) { + if (V.seeNationality) { if (child.nationality === 0) { r += `Ethnically, ${he}'s `; } else if (child.nationality === "slave") { @@ -4358,9 +4362,9 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } else { r += `${He}'s originally <span class="tan">${child.nationality};</span> ethnically, ${he}'s `; } - r += `<span class="tan">${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; + r += `<span class="tan">${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly ${freckled}${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily ${freckled}${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; - r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} skin has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}.` : ``}`; + r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} ${skintype} has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}.` : ``}`; if (child.race !== child.origRace) { if (market) { @@ -4378,9 +4382,9 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } } else if (V.seeRace) { - r += `Ethnically, ${he}'s <span class="tan">${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; + r += `Ethnically, ${he}'s <span class="tan">${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly ${freckled}${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily ${freckled}${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; - r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} skin has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}. ` : ``}`; + r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} ${skintype} has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}. ` : ``}`; if (child.race !== child.origRace) { if (market) { @@ -4398,12 +4402,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } } else { - r += `${His} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; + r += `${His} ${skintype} is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; - r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} skin has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}.` : ``}`; + r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} ${skintype} has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}.` : ``}`; } return r; + } function tats() { @@ -5502,39 +5507,66 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event r += `Society looks fondly on ${his} complete inability to reproduce. `; } - switch (child.pubicHStyle) { - case "hairless": - r += `${He}'s naturally smooth and hairless. `; - break; - case "bald": - r += `${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth. `; - break; - case "waxed": - r += `${He}'s waxed and smooth. `; - break; - case "in a strip": - r += `${His} ${child.pubicHColor} pubic hair is waxed into a narrow strip above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; - break; - case "neat": - r += `${His} ${child.pubicHColor} pubic hair is waxed into a neat patch above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; - break; - case "bushy in the front and neat in the rear": - r += `${His} ${child.pubicHColor} pubic hair forms a natural bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; - break; - case "bushy": - r += `${His} ${child.pubicHColor} pubic hair forms a natural bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; - break; - case "very bushy": - r += `${His} ${child.pubicHColor} pubic hair forms a dense bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`} that trails up to ${his} navel. `; - break; - default: - if (child.physicalAge < pubertyAge - 2) { - r += `${He} is too sexually immature to have pubic hair. `; - } else if (child.physicalAge < pubertyAge - 1) { - r += `${He} has a few wisps of pubic hair. `; - } else if (child.physicalAge < pubertyAge) { - r += `${He} is on the verge of puberty and has a small patch of ${child.pubicHColor} pubic hair above ${his} ${child.dick > 0 ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + if (child.race === "catgirl") { + switch (child.pubicHStyle) { + case "hairless": + case "bald": + case "waxed": + r += `${His} ${child.skin} pubic fur is silky and indistinguishable from the rest of ${his} fur. `; + break; + case "in a strip": + r += `${He} has a cute line of ${child.pubicHColor} fur just above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "neat": + r += `${He} has a patch of ${child.pubicHColor} fur above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}, standing out against the rest of ${his} ${child.skin} fur. `; + break; + case "bushy in the front and neat in the rear": + case "bushy": + r += `${His} ${child.pubicHColor} fur is particularly bushy around ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "very bushy": + r += `${He} has a veritable bush of ${child.pubicHColor} fur around ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}, coloring out to ${his} thighs. `; + break; + default: { + r += `${He} has a small patch of ${child.pubicHColor} fur above ${his} ${child.dick > 0 ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; } + } + + } else { + switch (child.pubicHStyle) { + case "hairless": + r += `${He}'s naturally smooth and hairless. `; + break; + case "bald": + r += `${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth. `; + break; + case "waxed": + r += `${He}'s waxed and smooth. `; + break; + case "in a strip": + r += `${His} ${child.pubicHColor} pubic hair is waxed into a narrow strip above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "neat": + r += `${His} ${child.pubicHColor} pubic hair is waxed into a neat patch above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "bushy in the front and neat in the rear": + r += `${His} ${child.pubicHColor} pubic hair forms a natural bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "bushy": + r += `${His} ${child.pubicHColor} pubic hair forms a natural bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + break; + case "very bushy": + r += `${His} ${child.pubicHColor} pubic hair forms a dense bush above ${his} ${child.dick ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`} that trails up to ${his} navel. `; + break; + default: + if (child.physicalAge < pubertyAge - 2) { + r += `${He} is too sexually immature to have pubic hair. `; + } else if (child.physicalAge < pubertyAge - 1) { + r += `${He} has a few wisps of pubic hair. `; + } else if (child.physicalAge < pubertyAge) { + r += `${He} is on the verge of puberty and has a small patch of ${child.pubicHColor} pubic hair above ${his} ${child.dick > 0 ? `cock` : child.vagina === -1 ? `smoothness` : `pussy`}. `; + } + } } r += App.Desc.brand(child, "pubic mound"); @@ -7198,7 +7230,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event r += App.Desc.brand(child, "ear"); r += App.Desc.brand(child, "neck"); - r += App.Desc.family(child) + ' '; + r += App.Desc.family(child) + " "; if (child.relationship >= 3 && totalRelatives(child) > 0) { const lover = getSlave(child.relationshipTarget); @@ -7806,7 +7838,15 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } let pubertyAge = Math.max(child.pubertyAgeXX, child.pubertyAgeXY); - if (child.physicalAge < pubertyAge - 2) { + if (child.race === "catgirl") { + if (child.underArmHStyle === "bushy") { + r += `${His} ${child.skin} underarm fur is especially bushy and untamed. `; + } else if (child.underArmHStyle === "waxed" || child.underArmHStyle === "hairless" || child.underArmHStyle === "shaved" || child.underArmHStyle === "bald") { + r += `${His} underarm fur is trim and smooth. `; + } else { + r += `${His} ${child.skin} underarm fur is quite regular along ${his} fuzzy body. `; + } + } else if (child.physicalAge < pubertyAge - 2) { r += `${He} is too sexually immature to have armpit hair. `; } else if (child.underArmHStyle === "hairless") { r += `${His} armpits are perfectly smooth and naturally hairless. `; diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js index af75462fbcf58e23bea16dd178a93a71af7da5eb..72bc74015b00cf92143f20ff425869624aab237d 100644 --- a/src/npc/descriptions/crotch/vagina.js +++ b/src/npc/descriptions/crotch/vagina.js @@ -277,7 +277,6 @@ App.Desc.vagina = function(slave) { r.push(`Society looks fondly on ${his} complete inability to reproduce.`); } - if (slave.dick === 0) { if (slave.clit > 0) { if (slave.foreskin === 0) { @@ -637,7 +636,20 @@ App.Desc.vagina = function(slave) { r.push(App.Desc.mods(slave, "pubic mound")); const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY); - if (slave.physicalAge < _pubertyAge - 2) { + + if (slave.race === "catgirl") { + if ((slave.pubicHStyle === "hairless" || slave.pubicHStyle === "bald" || slave.pubicHStyle === "waxed" || slave.pubicHStyle === "shaved")) { + r.push(`${His} ${slave.skin} pubic fur is silky and indistinguishable from the rest of ${his} fur.`); + } else if ((slave.pubicHStyle === "in a strip")) { + r.push(`${He} has a cute line of ${slave.pubicHColor} fur just above ${his} crotch.`); + } else if ((slave.pubicHStyle === "neat")) { + r.push(`${He} has a neat patch of ${slave.pubicHColor} fur above ${his} crotch.`); + } else if ((slave.pubicHStyle === "bushy" || slave.pubicHStyle === "bushy in the front and neat in the back")) { + r.push(`${His} ${slave.pubicHColor} fur is particularly bushy around ${his} crotch.`); + } else if ((slave.pubicHStyle === "very bushy")) { + r.push(`${He} has a veritable bush of ${slave.pubicHColor} fur around ${his} crotch that flares out to ${his} thighs.`); + } + } else if (slave.physicalAge < _pubertyAge - 2) { r.push(`${He} is too sexually immature to have pubic hair.`); } else if (slave.pubicHStyle === "hairless") { r.push(`${He}'s naturally smooth and hairless.`); diff --git a/src/npc/descriptions/ears.js b/src/npc/descriptions/ears.js index c647b2055e64ed4d6e804384268c40cb90931d58..d0a1d0a3096aba94291624706288ff83d0e69162 100644 --- a/src/npc/descriptions/ears.js +++ b/src/npc/descriptions/ears.js @@ -10,7 +10,9 @@ App.Desc.ears = function(slave) { // ear shape description here if (slave.earShape === "none") { if (slave.earImplant === 1) { - if (slave.earT !== "none") { + if (slave.earT !== "none" && slave.race === "catgirl") { + r.push(`${He} has smooth fur where a normal human's ears would be, as ${he} instead hears out of ${his} twitchy, sensitive cat ears.`); + } else if (slave.earT !== "none" && slave.race !== "catgirl") { r.push(`${He} has smooth skin where ${his} ears should be as ${his} hearing has been cybernetically rerouted to ${his} secondary ears.`); } else { r.push(`${He} has nothing but small, perforated metal disks where ${his} ears should be.`); diff --git a/src/npc/descriptions/face.js b/src/npc/descriptions/face.js index d363083d9ce69312a3d890cccaf82c993b681eaf..154c90899fc2554e00c077f36f5d651f8f01c1fe 100644 --- a/src/npc/descriptions/face.js +++ b/src/npc/descriptions/face.js @@ -96,6 +96,23 @@ App.Desc.face = function(slave) { r.push(`very beautiful and exotic, almost to the point of alien fascination.`); } break; + case "feline": + if (slave.face < -95) { + r.push(`a hideous, furred feline face with pronounced fangs and whiskers that's nothing short of terrifying.`); + } else if (slave.face < -40) { + r.push (`an ugly, furred feline face, featuring idly-twitching whiskers and a misshapen button nose.`); + } else if (slave.face < -10) { + r.push(`an comely, furred feline face, somewhat unappealing in its strange catlike whiskers and nose.`); + } else if (slave.face <= 10) { + r.push(`a plain, feline face, remarkable only for the whiskers and button nose that decorate it.`); + } else if (slave.face <= 40) { + r.push(`an attractive feline face, silky fur framing well-manicured whiskers in an eye-catching fashion.`); + } else if (slave.face <= 95) { + r.push(`a beautiful feline face, combining catlike grace and human structure into a gorgeous whiskered visage.`); + } else { + r.push(`an absolutely stunningly beautiful feline face, perfectly inviting silky fur framing a whiskered, catlike appearance that's as alien as it is perfect.`); + } + break; default: if (slave.face < -95) { r.push(`very ugly.`); diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js index 2281d1a01fcd3d838b9dc1f5ac6bbc9717727c57..b51bbbbabe2cba9b64cf755dfef188f5712ce4ad 100644 --- a/src/npc/descriptions/longSlave.js +++ b/src/npc/descriptions/longSlave.js @@ -439,7 +439,15 @@ App.Desc.longSlave = function(slave, {market = 0, eventDescription = false, pris } const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY); - if (slave.physicalAge < pubertyAge - 2) { + if (slave.race === "catgirl") { + if (slave.underArmHStyle === "bushy") { + r.push(`${His} underarm fur is especially bushy and untamed.`); + } else if (slave.underArmHStyle === "waxed" || slave.underArmHStyle === "hairless" || slave.underArmHStyle === "shaved" || slave.underArmHStyle === "bald") { + r.push(`${His} underarm fur is trim and smooth.`); + } else { + r.push(`${His} ${slave.skin} underarm fur is quite regular along ${his} fuzzy body.`); + } + } else if (slave.physicalAge < pubertyAge - 2) { r.push(`${He} is too sexually immature to have armpit hair.`); } else if (slave.underArmHStyle === "hairless") { r.push(`${His} armpits are perfectly smooth and naturally hairless.`); diff --git a/src/npc/descriptions/mouth.js b/src/npc/descriptions/mouth.js index 1ffcd73608915b710c23fc047d3c9b69ca0d9d75..4a1d8a9bfa80c2f0e4c35b4ef03bcd169785a8d8 100644 --- a/src/npc/descriptions/mouth.js +++ b/src/npc/descriptions/mouth.js @@ -107,7 +107,11 @@ App.Desc.mouth = function(slave) { } else if (slave.teeth === "pointy") { r.push(`${His} teeth have been replaced with realistic implants that mimic the dentition of a carnivore. ${His} smiles are frightening, and ${he} can bare them to become truly terrifying.`); } else if (slave.teeth === "fangs") { + if (slave.race === "catgirl") { + r.push(`${His} upper canine teeth are sharp feline fangs that distinctly mark ${him} as a bioengineered cat${girl} every time ${he} opens ${his} mouth. ${His} smiles are frightening, and ${he} can bare them to become truly terrifying.`); + } else { r.push(`${His} upper canine teeth have been replaced with realistic implants that mimic fangs. ${His} smiles are frightening, and ${he} can bare them to become truly terrifying.`); + } } else if (slave.teeth === "fang") { r.push(`One of ${his} upper canine teeth has been replaced with realistic implant shaped like a fang.`); if (slave.faceShape === "cute") { diff --git a/src/npc/descriptions/skin.js b/src/npc/descriptions/skin.js index b042181f1fca3b72414940a458d99e960525ab32..129c051ff7c74da61afd0223bd71a7c328ee79d4 100644 --- a/src/npc/descriptions/skin.js +++ b/src/npc/descriptions/skin.js @@ -11,8 +11,11 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { he, his, He, His } = getPronouns(slave); + + const skin = (slave.race === "catgirl") ? "fur" : "skin" + if (slave.fuckdoll > 0) { - r.push(`The small areas of visible skin are`); + r.push(`The small areas of visible ${skin} are`); r = r.concat(freckles()); r = r.concat(tanned()); } else if (V.seeNationality === 1) { @@ -29,7 +32,7 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { } else { r.push(`${He}'s originally <span class="tan">${slave.nationality};</span> ethnically, ${he}'s`); } - r.push(`<span class="tan">${slave.race},</span> and ${his} skin is`); + r.push(`<span class="tan">${slave.race},</span> and ${his} ${skin} is`); r = r.concat(freckles()); r = r.concat(tanned()); if (slave.race !== slave.origRace && !market) { @@ -46,7 +49,7 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { } } } else if (V.seeRace === 1) { - r.push(`Ethnically, ${he}'s <span class="tan">${slave.race},</span> and ${his} skin is`); + r.push(`Ethnically, ${he}'s <span class="tan">${slave.race},</span> and ${his} ${skin} is`); r = r.concat(freckles()); r = r.concat(tanned()); if (slave.race !== slave.origRace && !market) { @@ -63,7 +66,7 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { } } } else { - r.push(`${His} skin is`); + r.push(`${His} ${skin} is`); r = r.concat(freckles()); r = r.concat(tanned()); } @@ -72,13 +75,17 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { function freckles() { const r = []; - if (slave.markings === "freckles") { + if (slave.markings === "freckles" && slave.race === "catgirl") { + r.push(`${slave.skin} and lightly spotted.`); + } else if (slave.markings === "freckles") { r.push(`${slave.skin} and lightly`); if ((skinToneLevel(slave.skin) > 5) && (skinToneLevel(slave.skin) < 10) && (slave.hColor === "red")) { r.push(`freckled, an attractive combination.`); } else { r.push(`freckled.`); } + } else if (slave.markings === "heavily freckled" && slave.race === "catgirl") { + r.push(`${slave.skin} and heavily spotted.`); } else if (slave.markings === "heavily freckled") { r.push(`${slave.skin} and heavily`); if ((skinToneLevel(slave.skin) > 5) && (skinToneLevel(slave.skin) < 10) && (slave.hColor === "red")) { @@ -95,7 +102,7 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { function tanned() { const r = []; if (slave.skin === "sun tanned" || slave.skin === "spray tanned") { - r.push(`${His} skin has been`); + r.push(`${His} ${skin} has been`); if (slave.skin === "sun tanned") { r.push(`tanned to a natural, healthy-looking tone.`); } else if (slave.skin === "spray tanned") { @@ -107,3 +114,4 @@ App.Desc.skin = function(slave, {market, eventDescription} = {}) { return r; } }; + diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js index d93fcd38fb86badb5b8859aa265ebeaa684e05ea..76ba74e08891032503142c55f43461ab610d3db4 100644 --- a/src/npc/generate/generateGenetics.js +++ b/src/npc/generate/generateGenetics.js @@ -256,13 +256,21 @@ globalThis.generateGenetics = (function() { if (father !== 0) { if (mother.origRace === father.origRace) { race = mother.origRace; + } else if (mother.origRace === "catgirl"){ + race = "catgirl"; + } else if (father.origRace === "catgirl"){ + race = "catgirl"; } else if (jsRandom(1, 4) === 4) { race = jsEither([father.origRace, mother.origRace]); } else { race = "mixed race"; } } else { - if (fatherRace !== 0) { + if (mother.origRace === "catgirl"){ + race = "catgirl"; + } else if (father.origRace === "catgirl"){ + race = "catgirl"; + } else if (fatherRace !== 0) { if (mother.origRace === fatherRace) { race = mother.origRace; } else if (jsRandom(1, 4) === 4) { @@ -641,7 +649,13 @@ globalThis.generateGenetics = (function() { // face shape function setFaceShape(father, mother, genes) { let shape; - if (genes.androgyny === 2) { + if (genes.race === "catgirl") { + shape = "feline"; + } else if (mother.faceShape === "feline") { + shape = "feline"; + } else if (father.faceShape === "feline") { + shape = "feline"; + } else if (genes.androgyny === 2 && genes.race !== "catgirl") { shape = "androgynous"; } else if (father !== 0) { if (mother.faceShape === father.faceShape) { @@ -1225,6 +1239,22 @@ globalThis.generateChild = function(mother, ovum, incubator=false) { child.eyebrowHColor = child.hColor; child.birthWeek = 0; child.actualAge = 0; + if (child.race !== "catgirl") { + child.earImplant = 0; + child.earShape = "normal"; + child.earT = "none"; + child.earTColor = "hairless"; + child.tailColor = "none"; + child.tailShape = "none"; + } + else { + child.earImplant = 1; + child.earShape = "none"; + child.earT = "neko"; + child.earTColor = child.hColor; + child.tailShape = "neko"; + child.tailColor = child.hColor; + } if (genes.clone !== undefined) { child.clone = genes.clone; child.cloneID = genes.cloneID; @@ -1282,6 +1312,22 @@ globalThis.generateChild = function(mother, ovum, incubator=false) { child.origHColor = genes.hColor; child.skin = getGeneticSkinColor(child); child.hColor = getGeneticHairColor(child); + if (child.race !== "catgirl") { + child.earImplant = 0; + child.earShape = "normal"; + child.earT = "none"; + child.earTColor = "hairless"; + child.tailColor = "none"; + child.tailShape = "none"; + } + else { + child.earImplant = 1; + child.earShape = "none"; + child.earT = "neko"; + child.earTColor = child.hColor; + child.tailShape = "neko"; + child.tailColor = child.hColor; + } child.spermY = genes.spermY; resetEyeColor(child, "both"); child.pubicHColor = child.hColor; @@ -1503,6 +1549,7 @@ function makeAlbinismOverride(race) { case "semitic": case "southern european": case "white": + case "catgirl": albinismOverride.skin = "pure white"; break; } diff --git a/src/npc/generate/generateNewSlaveJS.js b/src/npc/generate/generateNewSlaveJS.js index 6ececdc27df8a547affbf2568cac619def5d4c8c..7c4197e7b9f64fdb40267da599659a3465750b49 100644 --- a/src/npc/generate/generateNewSlaveJS.js +++ b/src/npc/generate/generateNewSlaveJS.js @@ -769,6 +769,7 @@ globalThis.GenerateNewSlave = (function() { case "indo-aryan": case "malay": case "pacific islander": + case "catgirl": case "amerindian": case "asian": case "middle eastern": @@ -902,7 +903,9 @@ globalThis.GenerateNewSlave = (function() { } else if (slave.physicalAge <= 25) { slave.face += jsRandom(0, 10); } - if (slave.physicalAge > 10) { + if (slave.race === "catgirl") { + slave.faceShape = "feline"; + } else if (slave.physicalAge > 10) { slave.faceShape = jsEither(["androgynous", "cute", "exotic", "normal", "normal", "sensual"]); } else { slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "exotic", "normal", "normal", "sensual"]); @@ -913,6 +916,7 @@ globalThis.GenerateNewSlave = (function() { slave.face += jsRandom(0, 20); break; case "exotic": + case "feline": case "androgynous": slave.face += jsRandom(-10, 10); break; @@ -940,7 +944,9 @@ globalThis.GenerateNewSlave = (function() { } else if (slave.physicalAge <= 25) { slave.face += jsRandom(0, 10); } - if (slave.physicalAge >= 17) { + if (slave.race === "catgirl") { + slave.faceShape = "feline"; + } else if (slave.physicalAge >= 17) { slave.faceShape = jsEither(["androgynous", "masculine", "masculine", "masculine"]); } else if (slave.physicalAge >= 15) { slave.faceShape = jsEither(["androgynous", "exotic", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "normal", "sensual"]); @@ -957,6 +963,7 @@ globalThis.GenerateNewSlave = (function() { slave.face += jsRandom(0, 20); break; case "exotic": + case "feline": case "androgynous": slave.face += jsRandom(-10, 10); break; @@ -1525,6 +1532,21 @@ globalThis.GenerateNewSlave = (function() { slave.hStyle = "neat"; eyeColor(["brown"], true); break; + case "catgirl": + slave.lips = jsRandom(5, 25); + slave.origSkin = jsEither(["white", "brown", "black", "red", "yellow", "black and white striped"]); + slave.origHColor = jsEither(["black", "white", "golden", "red", "brown"]); + slave.hStyle = jsEither(["undercut", "neat"]); + slave.faceShape = "feline"; + eyeColor(["light grey", "blue", "blue", "brown", "brown", "brown", "green"]); + // nonfunctional // + slave.earT = "neko"; + slave.earImplant = 1; + slave.tailShape = "neko"; + slave.tailColor = slave.hColor; + slave.eye.right.pupil = "catlike"; + slave.eye.left.pupil = "catlike"; + break; case "amerindian": slave.lips = jsRandom(5, 25); slave.origSkin = jsEither(["dark brown", "brown", "dark olive", "olive", "light olive", "light olive"]); diff --git a/src/npc/generate/newChildIntro.js b/src/npc/generate/newChildIntro.js index 52badecdc9bc50cbdc24c1c58934b23e7cbc5dc3..4d528f14d1185a1062544b4be7af72404ed2c48f 100644 --- a/src/npc/generate/newChildIntro.js +++ b/src/npc/generate/newChildIntro.js @@ -117,6 +117,24 @@ App.UI.newChildIntro = function(slave) { ) ); } + if (child.race === "catgirl") { + App.UI.DOM.appendNewElement( + "div", + naming, + App.UI.DOM.link( + `Have your PA assign ${him} a random cat name`, + () => { + slave.slaveName = setup.catSlaveNames.random(); + slave.birthName = slave.slaveName; + jQuery("#naming").empty().append(`${V.assistant.name} registers the new ${girl} as "${slave.slaveName}" in your registry.`); + const slaveName = document.createElement("span"); + slaveName.classList.add('slave-name'); + slaveName.append(slave.slaveName); + jQuery("#newName").empty().append(slaveName); + } + ) + ); + } if (V.arcologies[0].FSChattelReligionist !== "unset") { App.UI.DOM.appendNewElement( "div", diff --git a/src/npc/infants/InfantState.js b/src/npc/infants/InfantState.js index 86f2b4d8e24a22954cfc982e095dd883562c30ea..32c06cce33356eb10b831560545bad54d430b834 100644 --- a/src/npc/infants/InfantState.js +++ b/src/npc/infants/InfantState.js @@ -76,6 +76,7 @@ App.Facilities.Nursery.InfantState = class InfantState { * * "cute" * * "sensual" * * "exotic" + * * "feline" (catmod exclusive content) */ this.faceShape = "normal"; /** diff --git a/src/npc/infants/customizeInfant.tw b/src/npc/infants/customizeInfant.tw index 605ce8b7f1c125c9e14d555ea77973341f1111f7..2f2f86cfb16395eb0286e4b5fd8532caf4da8881 100644 --- a/src/npc/infants/customizeInfant.tw +++ b/src/npc/infants/customizeInfant.tw @@ -55,6 +55,9 @@ Change $his given name: <<textbox "$activeChild.slaveName" $activeChild.slaveNam | <<link "Give $him a random cow given name" "Rename">><<set $activeChild.slaveName = setup.cowSlaveNames.random()>><</link>> <</if>> <</if>> +<<if child.race == "catgirl">> + | <<link "Give $him a random cat given name" "Rename">><<set $activeChild.slaveName = setup.catSlaveNames.random()>><</link>> +<</if>> <<if $arcologies[0].FSChattelReligionist != "unset">> | <<link "Give $him a random devotional given name" "Rename">><<set $activeChild.slaveName = setup.chattelReligionistSlaveNames.random()>><</link>> <</if>> diff --git a/src/npc/infants/infantSummary.js b/src/npc/infants/infantSummary.js index 1f56f377878c21b52a9e9fcbe385579d0ae681e0..f3085f30c8e788caefd1e006fc3fb2616f00487d 100644 --- a/src/npc/infants/infantSummary.js +++ b/src/npc/infants/infantSummary.js @@ -280,6 +280,9 @@ App.Facilities.Nursery.InfantSummary = function(child) { case "pacific islander": r += `PI`; break; + case "catgirl": + r += `CT`; + break; case "malay": r += `M`; break; @@ -1069,6 +1072,15 @@ App.Facilities.Nursery.InfantSummary = function(child) { case "pure black": r += `P. Bla`; break; + case "black and white striped": + r += `BnW`; + break; + case "yellow": + r += `Ylw`; + break; + case "red": + r += `Red`; + break; case "dark": case "fair": case "pale": diff --git a/src/npc/interaction/fDance.tw b/src/npc/interaction/fDance.tw index 878852f70cd0b65b8e2a7327ce3f78f79a6bbc05..02469bd2039efe191ca6b9f018cbe45f8b26f1f2 100644 --- a/src/npc/interaction/fDance.tw +++ b/src/npc/interaction/fDance.tw @@ -140,6 +140,22 @@ $His face is <<else>> an exotic masterpiece. Having $him dance in your office is like hanging foreign art on the walls, a perfect trophy of your slaving reach. <</if>> +<<case "feline">> + <<if getSlave($AS).face < -95>> + revolting in its alien cat-like appearance, the mangly fur distracting you tremendously. + <<elseif getSlave($AS).face < -40>> + ugly and feline, making it hard to do anything but stare at $his bizzare cat features. + <<elseif getSlave($AS).face < -10>> + relatively unattarctive in its strange feline appearance, though you try to look more at $his furred body. + <<elseif (getSlave($AS).face <= 10)>> + fascinating in its strange cat-like looks. $His whiskers twitch about as $he moves. + <<elseif (getSlave($AS).face <= 40)>> + attractive and feline, catching your eye and drawing your attention to $his soft fur and twitching button nose. + <<elseif (getSlave($AS).face <= 95)>> + gorgeous in its feline construction, a beautiful melody of fur and whiskers that's hard to even look away from. + <<else>> + a breathtakingly beautiful catgirl, a true monument to the wonders of genetic engineering with $his perfectly-constructed fur and luxurious feline curves. Just looking at $him draws you in intimately, whiskers twitching. + <</if>> <<default>> <<if getSlave($AS).face < -95>> not great to look at. Not even a little. You try to focus on $his body instead, finding yourself immediately turned off when $he catches your gaze. diff --git a/src/npc/interaction/fSlaveImpregConsummate.tw b/src/npc/interaction/fSlaveImpregConsummate.tw index ac05802c8120a4059b20a9edbda99c56431a915c..d6e5358394488580b855dc654dc24771568f23ee 100644 --- a/src/npc/interaction/fSlaveImpregConsummate.tw +++ b/src/npc/interaction/fSlaveImpregConsummate.tw @@ -346,6 +346,8 @@ You prepare the necessary file on their possible offspring. Upon birth, it will a mestizo, <<elseif (getSlave($AS).race == "white") && ($impregnatrix.race == "amerindian")>> a mestizo, + <<elseif (getSlave($AS).race == "catgirl" || $impregnatrix.race == "catgirl")>> + a catgirl, <<elseif (getSlave($AS).race == $impregnatrix.race) && (getSlave($AS).race != "mixed race") && ($impregnatrix.race != "mixed race")>> an ethnically pure, <<elseif (getSlave($AS).race != $impregnatrix.race) && (getSlave($AS).race != "mixed race") && ($impregnatrix.race != "mixed race")>> diff --git a/src/pregmod/editGenetics.tw b/src/pregmod/editGenetics.tw index ffdff2c224314e36be059b912c2d31464ea0b95b..0a8a8ccab93b11f1e2ef3e4d1daf3a0b154652e5 100644 --- a/src/pregmod/editGenetics.tw +++ b/src/pregmod/editGenetics.tw @@ -35,7 +35,7 @@ </tr> <tr> <th>Nationality</th><td colspan="2" class="editor string-editor" data-param="nationality"><%- s.nationality %></td> - <th>Ethnicity</th><td colspan="2" class="editor choice-editor" data-param="origRace" data-choices="amerindian, asian, black, indo-aryan, latina, malay, middle eastern, mixed race, pacific islander, semitic, southern european, white"><%- s.origRace %></td> + <th>Ethnicity</th><td colspan="2" class="editor choice-editor" data-param="origRace" data-choices="amerindian, asian, black, indo-aryan, latina, malay, middle eastern, mixed race, pacific islander, semitic, southern european, catgirl, white"><%- s.origRace %></td> <th>Career</th><td><i><%- s.career ? s.career : '' %></i></td> </tr> <tr> diff --git a/src/pregmod/geneLab.tw b/src/pregmod/geneLab.tw index cac1980a1928b9449f507dc1adbe5d21a0f5c60f..e79d7fad145ef006cd1705717a7fea2089644618 100644 --- a/src/pregmod/geneLab.tw +++ b/src/pregmod/geneLab.tw @@ -53,6 +53,52 @@ Genetic Modification <br> <</if>> <</if>> +<<if $seeCats == 1>> +<<if $geneticMappingUpgrade >=2 && $projectN.status == 0>> + [[Hire a team of renowned bioengineers and geneticists to splice the human genome with cat DNA and fulfill the destiny of mankind - creating catgirls|Gene Lab][cashX(forceNeg(150000*_PCSkillCheck), "capEx"), $projectN.status = 1]] + //Costs <<print cashFormat(150000*_PCSkillCheck)>>// + <br> //Will begin a long-term project to push the boundries of science and genetically engineer the world's first catgirl// + <br> + <</if>> + <<if $projectN.status == 1>> + You've started to get into contact with a number of renowned old-world biologists and genetic engineers to pursue the creation of a biological catgirl. They should be arriving soon. + <</if>> + <<if $projectN.status == 2>> + You've gathered together a team of some of the old world's foremost scientific minds in the fields of genetic engineering, who've turned your genelab into a workplace for what they've dubbed "Project N", or the "Cat Project". One white-bearded man looks up from a large computer screen showing a series of complicated genetic sequences as you enter. + <</if>> + <<if $projectN.status == 3>> + The geneticist team has started to make serious progress on project N. In a central tube filled with thick green liquid, a small mass of pinkish material floats in suspended animation, referred to by the biologists as "Subject Delta". A series of screens next to the tube read out low-functioning vitals and other essential information. + <</if>> + <<if $projectN.status == 4>> + The pinkish blob of flesh has become a small, hairless humanoid body with twitchy cat ears atop its head, unconciously floating while suspended in the green tube. You've tenatively named the growing catgirl $subjectDeltaName, and she occassionally kicks around slightly in the tube, producing a little stream of floating bubbles. The Project N bioengineers carefully monitor her vitals at all times, aided by the lab's integrated AI. + <</if>> + <<if $projectN.status == 5>> + $subjectDeltaName looks like an almost fully grown catgirl now, complete with a thin but soft layer of pure white fur that puffs up in the thick green liquid of her tube. The Project N geneticists seem a little rattled after the attack by the Sons of Sekhmet, but they're more determined than ever to finish their job and ensure that subject Delta makes it out of this tube and into the real world, a possibility that looks closer day by day. + <</if>> + <<if $projectN.status == 6>> + Project N is complete. Dr. Nieskowitz and his team are currently monitoring various functions of the genetic laboratory, though you could set them to work engineering another catgirl if you give them the funding to do so. It will take aproximately a month to create another catgirl. The genetic engineering tube is currently empty. + <br> + <</if>> + <<if $projectN.status == 6 && $seeCats == 1>> + [[Engineer me a Catgirl|Gene Lab][cashX(forceNeg(20000*_PCSkillCheck), "capEx"), $projectN.status = 7, $growingNewCat = 4]] + //Costs <<print cashFormat(20000*_PCSkillCheck)>>// + <br> + <</if>> + <<if $projectN.status == 6 && $seeCats == 1>> + [[Engineer me a Catboy|Gene Lab][cashX(forceNeg(20000*_PCSkillCheck), "capEx"), $projectN.status = 8, $growingNewCat = 4]] + //Costs <<print cashFormat(20000*_PCSkillCheck)>>// + <br> + <</if>> + <<if $projectN.status == 7>> + Dr. Nieskowitz and his team are currently hard at working growing you another catgirl, who rapidly develops in the central tube of thick green liquid you once used to create $subjectDeltaName. Nieskowitz assures you that he'll have your new catgirl finished <<if $growingNewCat >= 2>>in $growingNewCat weeks.<</if>><<if $growingNewCat <= 1>>by next week.<</if>> + <</if>> + <<if $projectN.status == 8>> + Dr. Nieskowitz and his team are currently hard at working growing you another catboy, who rapidly develops in the central tube of thick green liquid you once used to create $subjectDeltaName. Nieskowitz assures you that he'll have your new catboy finished <<if $growingNewCat >= 2>>in $growingNewCat weeks.<</if>><<if $growingNewCat <= 1>>by next week.<</if>> + <</if>> + <<if $projectN.status == 9>> + The bomb set by the Sons of Sekhmet destroyed large parts of the genelab and killed most of the personnel, including $subjectDeltaName's tube. After the death of Doctor Nieskowitz, you haven't just lost $subjectDeltaName herself, but also the knowledge used to create her. It's doubtful that there's anyone left in the world who can finish what he started. + <</if>> +<</if>> <</if>> <br><br> diff --git a/src/uncategorized/REFS.tw b/src/uncategorized/REFS.tw index 2094ea65bb623f97ffa47bf4d3bc5dfef76e0881..c7a877af59b2ba3210590ea897d8a1f0d072aee8 100644 --- a/src/uncategorized/REFS.tw +++ b/src/uncategorized/REFS.tw @@ -162,6 +162,14 @@ <<set _slave.canRecruit = 0>> <<set _slave.custom.tattoo = "$He has the Imperial symbol of your arcology tattooed on $his neck above a barcode.">> <<run setHealth(_slave, jsRandom(30, 60), 0, 0, 0, 0)>> +<<case "totally legit catgirls">> + <<set _slave = GenerateNewSlave("XX", {minAge: 16, maxAge: 24})>> + <<set _slave.origin = "You purchased $him from a reputable street merchant selling you completely legitimate catgirls.">> + <<set _slave.tailShape = "neko">> + <<set _slave.tailColor = _slave.hColor>> + <<set _slave.collar = "uncomfortable leather">> + <<set _slave.clothes = "kitty lingerie">> + <<run setHealth(_slave, jsRandom(30, 60), 0, 0, 0, 0)>> <<case "transformation fetishism encounter">> <<set _slave = GenerateNewSlave("XX", {maxAge: 22, disableDisability: 1, race: "nonslave"})>> <<set _slave.origin = "$He was enslaved by you when you overcharged $him for surgery.">> @@ -271,6 +279,15 @@ One of your Barons has approached you with an elegantly-worded but rather entitled letter demanding that you increase his already extraordinarily generous stipend and allow for more individual freedom in the management of his arcology district. The petition appears to be supported by a number of other powerful Barons, who have tacked their name on in asking for similar advantages. <br><br> "We manage and control the day-to-day operations of this entire Arcology," the letter reads, "And without us it would collapse in a matter of weeks. As such, you will not find our enclosed demands unreasonable, of greater rights and privileges for the daunting task of management and rule in your Immortal name, mighty Emperor..." +<<case "totally legit catgirls">> + The novelty of catgirls is still very much present in the marketplaces of your arcology. Across the stands, you see magazines proudly advertising new transformative trends, featuring ways to graft on cat ears or 'home-engineer' catgirls with stripped-down versions of the Project N technologies, and various gear and equipment tailored towards catlike slave bodies, mostly for people who can't afford one. + <br><br> + Of course, part of this enduring trend is the fact that catgirls are so exclusive. With the Project N tech so expensive and difficult to employ, generally requiring hundreds of thousands of credits worth of equipment and trained scientific teams. That's why it perks your attention when you notice one market vendor selling, as it says on the shop's outer sign, "DISCOUNT CATGIRLS". + <br><br> + The second you step inside a lanky man with slick black hair practically intercepts you with greetings and praise, nearly blocking your path and stopping you from getting a good look at the cages behind him. But even with the slick salesman in your way, you can tell that these are pretty obviously just normal women with surgical alternations to make them look vaguely like catgirls, although you can't imagne anyone other than a total idiot would be fooled considering none of them have fur or actual cat ears. + <br><br> + "For you, a special price of just two thousand credits! What a steal! Normally, catgirls cost six, seven, twenty times that price! But I'm sure you of all people know that, no? Haha..." + <<case "physical idealist encounter">> The notion of the physical ideal has taken $arcologies[0].name by storm and a number of enterprising citizens have been quick to respond by providing new services and businesses in response. One such innovation is the open air gym, a now common sight along $arcologies[0].name's many streets. Many citizens utilize such facilities to squeeze in an extra work-out on their daily commute, or in lieu of personal fitness facilities in their own homes. <br><br> @@ -501,6 +518,24 @@ <</replace>> <</link>> </span> +<<case "totally legit catgirls">> + + <span id="result"> + <<if $cash >= 2000>> + <<link "Buy a 'catgirl'">><<print cashFormat(2000)>> + <<replace "#result">> + You sigh and hand the merchant a few thousand credits. He seems overjoyed, if slightly shocked, to have actually made a sale on his 'discount' catgirls, but rushes over to the cages and leads out your new slave with an ear-to-ear smile. "Have fun with her!" He shouts out at you as you leave. The 'catgirl' adjusts her headband and attempts a very human sounding meow as you lead her out of the shop. + <<run cashX(-2000, "slaveTransfer", _slave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> + <</replace>> + <</link>> + <</if>> + <br><<link "Decline to purchase the obviously fake catgirls">> + <<replace "#result">> + You ask the salesman if he thinks you're an idiot and tell him that these are clearly not legitimate catgirls. He smiles bashfully and shrugs his shoulder like a child being scolded. "Sure, sure, but they're still pretty good girls. And besides, it's something for all the people who can't afford a real one, right? Haha. So, anyway, you wanna buy one, or..?" You roll your eyes at the persistent salesman. He's still making pitches at you as you leave. + <</replace>> + <</link>> + </span> <<case "physical idealist encounter">> <span id="result"> <<link "Keep walking">> @@ -717,4 +752,4 @@ <<default>> <br>ERROR: bad REFS event $REFSevent <</switch>> -<</if>> /* CLOSES EVENT SELECTION */ \ No newline at end of file +<</if>> /* CLOSES EVENT SELECTION */ diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 8a71fa045d6f974deaf0e2e52d648e376232cceb..0fd7a27ab82ef9ca5dd7dbb9015b841f1c291dc0 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -11760,6 +11760,8 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity cage, using your other hand to jerk off. <<elseif ($activeSlave.chastityVagina)>> an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity, using your other hand to jerk off. + <<elseif ($activeSlave.race == "catgirl")>> + a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between $his legs. <<else>> a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between $his legs. <</if>> @@ -11780,6 +11782,8 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity cage, using your other hand to jerk off. <<elseif ($activeSlave.chastityVagina)>> an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity, using your other hand to jerk off. + <<elseif ($activeSlave.race == "catgirl")>> + a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between $his legs. <<else>> a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between $his legs. <</if>> diff --git a/src/uncategorized/nonRandomEvent.tw b/src/uncategorized/nonRandomEvent.tw index cdfe42b06e2840f02005831a60bbd8475d4a45d4..78744e2634a590102b644a80a5e6f605d4b4814f 100644 --- a/src/uncategorized/nonRandomEvent.tw +++ b/src/uncategorized/nonRandomEvent.tw @@ -10,6 +10,47 @@ <<goto "Generic Plot Events">> <<elseif (_effectiveWeek >= 5 && $FCTV.receiver == -1)>> <<goto "SE FCTV Install">> +<<elseif ($projectN.status == 1)>> + <<set $projectN.status = 2>> + <<set $projectN.phase1 = _effectiveWeek>> + <<goto "SE projectNInitialized">> +<<elseif ($bodyPuristRiot == 1) && ($puristRiotDone == 0) && (_effectiveWeek >= $projectN.phase1+1) && ($projectN.status != 9)>> + <<goto "SE bodypuristprotest">> + <<set $puristRiotDone = 1>> +<<elseif ($projectN.status == 2) && ($projectN.public == 0) && (_effectiveWeek >= $projectN.phase1+3)>> + <<goto "SE projectNmomoney">> + <<set $projectN.phase2 = _effectiveWeek>> +<<elseif ($projectN.status == 2) && ($projectN.public == 1) && (_effectiveWeek >= $projectN.phase1+5)>> + <<goto "SE projectNmomoney">> + <<set $projectN.phase2 = _effectiveWeek>> +<<elseif ($projectN.status == 3) && ($projectN.wellFunded == 1) && (_effectiveWeek >= $projectN.phase2+4)>> + <<goto "SE projectNbubbles">> + <<set $projectN.status = 4>> + <<set $projectN.phase3 = _effectiveWeek>> +<<elseif ($projectN.status == 3) && ($projectN.wellFunded != 1) && (_effectiveWeek >= $projectN.phase2+6)>> + <<goto "SE projectNbubbles">> + <<set $projectN.status = 4>> + <<set $projectN.phase3 = _effectiveWeek>> +<<elseif ($projectN.status == 4) && ($projectN.poorlyFunded != 1) && (_effectiveWeek >= $projectN.phase3+4)>> + <<goto "SE projectNsaboteur">> + <<set $projectN.phase4 = _effectiveWeek>> +<<elseif ($projectN.status == 4) && ($projectN.public == 1) && ($projectN.poorlyFunded == 1) && (_effectiveWeek >= $projectN.phase3+6)>> + <<goto "SE projectNsaboteur">> + <<set $projectN.phase4 = _effectiveWeek>> +<<elseif ($projectN.status == 4) && ($projectN.public == 0) && ($projectN.poorlyFunded == 1) && (_effectiveWeek >= $projectN.phase3+6)>> + <<goto "SE projectNblowingthelid">> + <<set $projectN.phase4 = _effectiveWeek>> +<<elseif ($puristsFurious == 1) && ($puristRiotDone == 0) && (_effectiveWeek >= $projectN.phase4+1 && ($projectN.status != 9))>> + <<goto "SE bodypuristriot">> + <<set $puristRiotDone = 1>> +<<elseif ($projectN.status == 5) && (_effectiveWeek >= $projectN.phase4+4)>> + <<goto "SE projectNcomplete">> +<<elseif ($projectN.status >= 6) && ($projectN.status != 9) && $projectN.decisionMade != 1 && (_effectiveWeek >= $projectN.phase4+5)>> + <<goto "SE projectNtechrelease">> +<<elseif ($projectN.status == 7) && ($growingNewCat == 0)>> + <<goto "SE vatcatgirl">> +<<elseif ($projectN.status == 8) && ($growingNewCat == 0)>> + <<goto "SE vatcatboy">> <<elseif (_effectiveWeek == 6)>> <<set $Event = "strip club closing">> <<goto "Generic Plot Events">> diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw index bcf512ed5ec352362d56b51d55c570f3e45c243c..652432f4b885aa342184f8e64ab6c37825e61865 100644 --- a/src/uncategorized/randomNonindividualEvent.tw +++ b/src/uncategorized/randomNonindividualEvent.tw @@ -46,6 +46,17 @@ <<if $legendaryAbolitionistID != 0>> <<set $events.push("RE former abolitionist")>> <</if>> + <<if $seeCats != 0>> + <<if ($projectN.status > 4)>> + <<set $events.push("RE sos assassin")>> + <</if>> + <<if ($projectN.status > 4)>> + <<set $events.push("RE sos sniper")>> + <</if>> + <<if ($projectN.status > 4)>> + <<set $events.push("RE sos bombing")>> + <</if>> + <</if>> <<if $shelterAbuse <= 5>> <<set _shelterGirls = $slaves.filter(isShelterSlave)>> @@ -532,6 +543,15 @@ <<set $RecETSevent.push("incest mother daughter")>> <</if>> <</if>> + <<if $seeCats != 0 && $projectN.techReleased != 0>> + <<if (($rep/400) > random(1,100)) || $cheatMode>> + <<set $recruit.push("runaway cat")>> + <</if>> + <<if (($rep/400) > random(1,50)) || $cheatMode>> + <<set $recruit.push("punk femcat")>> + <</if>> + <</if>> + <</if>> @@ -546,6 +566,12 @@ <<set $recruit.push("racer DG chaser")>> <<set $recruit.push("farm bull")>> <<set $recruit.push("orphan femboy")>> + <<if $seeCats != 0 && $projectN.techReleased != 0>> + <<if (($rep/400) > random(1,50)) || $cheatMode>> + <<set $recruit.push("punk sissycat")>> + <</if>> + <</if>> + <<if ($mercenaries >= 5)>> <<set $recruit.push("DG runaway")>> <<if $seePreg != 0>> diff --git a/src/uncategorized/reRecruit.tw b/src/uncategorized/reRecruit.tw index 9157cc9620552b177c58c297edf830d5179bdd41..001176661212fac80d856009e8aa333b0b2d953b 100644 --- a/src/uncategorized/reRecruit.tw +++ b/src/uncategorized/reRecruit.tw @@ -61,6 +61,69 @@ <<set _slave.hStyle = "fashionable for a Free Cities trap, long, with the right half shaved">> <<set _slave.pubicHStyle = "waxed">> <<set _slave.underArmHStyle = "waxed">> +<<if $seeCats == 1>> +<<case "runaway cat">> + <<set _slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 22, race: "catgirl"})>> + <<set _slave.face = random(25,75)>> + <<set _slave.origin = "$He was bioengineered by a rival arcology owner. After being mistreated, $he escaped and came to you for protection.">> + <<set _slave.slaveName = setup.catSlaveNames.random()>> + <<set _slave.birthName = _slave.slaveName>> + <<set _slave.weight = 10>> + <<set _slave.muscles = 0>> + <<set _slave.waist = 10>> + <<set _slave.slaveSurname = "">> + <<set _slave.birthSurname = "">> + <<set _slave.career = "an orphan">> + <<set _slave.intelligenceImplant = 0>> + <<set _slave.teeth = "fangs">> + <<set _slave.devotion = random(-25,-10)>> + <<set _slave.trust = random(-25,-10)>> + <<set _slave.earShape = "none">> + <<set _slave.earT = "neko">> + <<set _slave.earTColor = _slave.hColor>> + <<set _slave.earImplant = 1>> + <<set _slave.tailShape = "neko">> + <<set _slave.tailColor = _slave.hColor>> + <<set _slave.pupil = "catlike">> + <<set _slave.accent = 2>> + <<set _slave.canRecruit = 0>> +<<case "punk femcat">> + <<set _slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 28, race: "catgirl"})>> + <<set _slave.origin = "$He was a rare free cat$girl whose feline nature drove $him towards petty vandalism and thuggery that eventually cost $his freedom.">> + <<set _slave.career = "a street thug">> + <<set _slave.teeth = "fangs">> + <<set _slave.faceShape = "feline">> + <<set _slave.devotion = random(-55,-40)>> + <<set _slave.trust = random(-20,10)>> + <<set _slave.earShape = "none">> + <<set _slave.earT = "neko">> + <<set _slave.earTColor = _slave.hColor>> + <<set _slave.earImplant = 1>> + <<set _slave.tailShape = "neko">> + <<set _slave.tailColor = _slave.hColor>> + <<set _slave.pupil = "catlike">> + <<set _slave.behavioralFlaw = either("bitchy", "arrogant")>> + <<set _slave.hStyle = "undercut">> + <<set _slave.accent = 2>> +<<case "punk sissycat">> + <<set _slave = GenerateNewSlave("XY", {minAge: 18, maxAge: 28, race: "catgirl"})>> + <<set _slave.origin = "$He was a rare free cat$girl whose feline nature drove $him towards petty vandalism and thuggery that eventually cost $his freedom.">> + <<set _slave.career = "a street thug">> + <<set _slave.teeth = "fangs">> + <<set _slave.faceShape = "feline">> + <<set _slave.devotion = random(-55,-40)>> + <<set _slave.trust = random(-20,10)>> + <<set _slave.earShape = "none">> + <<set _slave.earT = "neko">> + <<set _slave.earTColor = _slave.hColor>> + <<set _slave.earImplant = 1>> + <<set _slave.tailShape = "neko">> + <<set _slave.tailColor = _slave.hColor>> + <<set _slave.pupil = "catlike">> + <<set _slave.behavioralFlaw = either("bitchy", "arrogant")>> + <<set _slave.hStyle = "undercut">> + <<set _slave.accent = 2>> +<</if>> <<case "whore recruit">> <<set _pram = {disableDisability: 1, race: "nonslave"}>> <<if $minimumSlaveAge < 14 && $pedo_mode === 0>> @@ -1851,6 +1914,26 @@ After the fighting died down, they found a $woman inside the compound, harshly used and seemingly the center of many gangbangs there. A scan of $his biometric data revealed that $he is in fact a slave that ran away about two months ago — into a much worse situation after being caught by the gang, as it turns out. Countless dicks have stretched $his pussy and ass wide,<<if _slave.physicalAge >= _slave.pubertyAge>> $he is pregnant with some dead criminal bastard's offspring,<</if>> and they've decorated $him with numerous piercings. As you notify the owner that her property has been retrieved, the woman is distraught at the state of her merchandise, grumbling that a once quite valuable $girl is now worth almost nothing. Seems she's unwilling to invest her time and money in caring for the slave. With a sigh, the slave-mistress whips out her smart-phone and starts to set up a selling offer in one of the popular slave trading apps. <br><br> //The young $woman has been used and abused quite a bit, making $him deathly terrified about what might happen to $him next. $He has partially resigned to be nothing but a fuckhole. You can get $him cheap from the owner, it'll be just <<print cashFormat(1000)>>.// +<<if $seeCats == 1>> +<<case "runaway cat">> + Coming to your desk in the morning, you see that your assistant has noted that you have a 'pressing' piece of business to attend to. With a wave of your hand, you bring up the notification to see that a runaway slave has apparently been waiting outside your penthouse for the entire night. What's more, $he's owned by a prominent rival arcology owner within the cluster - and a cat$girl, to boot. Apparently, according to the short, hand-scrawled letter that $assistant.name has digitized into the notification, $his former master regularly beat $him both out of frustration and for pleasure, and $he's approached you hoping for a better life in the slavery that's deinfed $his existence. + <br><br> + The exclusive and novel nature of catgirls makes $him an exceptionally valuable slave, and the genetic modification that created $him has ensured that the feline face you look over in the automated overview is particularly attractive, but taking $him under your wing away from another wealthy plutocrat would cause a whole score of problems. Deciding it'd be best not to make more enemies than you have to, you call up the rival on your personal phone, who answers after only a few seconds. After you explain the situation, the abusive oligarch chuckles, admits that he hadn't even noticed the cat$girl leaving, and says he'll formally sell $him over to you for "just" ten thousand credits. Otherwise, he'll give you a little cash to show his appreciation for sending the runaway back home. + <br><br> + //The other oligarch's offer is a pretty heavy <<print cashFormat(20000)>>, although his catgirl slave is pretty, young, and seems fairly well-trained. She's still got a few scars from regular abuse, though, both mental and physical, and despite her offer of self-enslavement seems exceptionally skittish and scared around you.// +<<case "punk femcat">> + After having released the Project N technologies to the public, other wealthy elites across the globe have used them to build up their own harems of cat toys, or simply to sell the rare and treasured slavegirls to those with such specific tastes. Owing to the nature of their creation, nearly all catgirls in existence are slaves, and typically only owned by the wealthy and prestigous. However, in some rare cases, catgirls have been made free, released by curious or affectionate owners, or even been born to other free catgirls, and miniscule populations of free catfolk have made their homes in some Free Cities. Unfortunately, they tend to do quite poorly as free citizens. + <br><br> + For one thing, free cats are generally extremely poor, and any other cats in their small communities are just as impoverished. For another, their feline nature makes them bitchy, territorial, and sometimes outright aggressive in ways that don't tend to work out for poor citizens in Free Cities culture. But as the head bitch of an arcology yourself, it works out just fine for you. Today, your assistant's notified you of one of the free cat$girl citizens of your own arcology who's managed to get $himself in trouble with the authorities, which puts $his punk ass on the table for cheap and legal enslavement. As you sit back at your desk, you browse casually over the video of the incident in question, some minor affair involving some vandalism and petty theft in the poorest quarter of the arcology that escalated when $he got uppity at your guards. By five minutes into the video, the arresting officers are making the handcuffed cat$girl lift $his tail and point $his ass towards the camera, while one of them squeezes a buttcheek hard enough to make the cat$girl's assflesh bulge out between his fingers in the tight black skinny jeans $he's wearing. While you decide whether $he's worth enslaving, the punk cat makes some mouthy statement that earns $him a hard slap to $his other asscheek by the second officer. + <br><br> + //It'd be absolutely trivial to enslave $him, really just a matter of filling out some paperwork and bureacracy costing <<print cashFormat(1500)>>. $He's pretty enough, albeit feisty, loud, and completely unbroken.// +<<case "punk sissycat">> + After having released the Project N technologies to the public, other wealthy elites across the globe have used them to build up their own harems of cat toys, or simply to sell the rare and treasured slavegirls to those with such specific tastes. Owing to the nature of their creation, nearly all catgirls in existence are slaves, and typically only owned by the wealthy and prestigous. However, in some rare cases, catgirls have been made free, released by curious or affectionate owners, or even been born to other free catgirls, and miniscule populations of free catfolk have made their homes in some Free Cities. Unfortunately, they tend to do quite poorly as free citizens. + <br><br> + For one thing, free cats are generally extremely poor, and any other cats in their small communities are just as impoverished. For another, their feline nature makes them bitchy, territorial, and sometimes outright aggressive in ways that don't tend to work out for poor citizens in Free Cities culture. But as the head bitch of an arcology yourself, it works out just fine for you. Today, your assistant's notified you of one of the free cat$girl citizens of your own arcology who's managed to get $himself in trouble with the authorities, which puts $his punk ass on the table for cheap and legal enslavement. As you sit back at your desk, you browse casually over the video of the incident in question, some minor affair involving some vandalism and petty theft in the poorest quarter of the arcology that escalated when $he got uppity at your guards. By five minutes into the video, the arresting officers are making the handcuffed cat$girl lift $his tail and point $his ass towards the camera, while one of them squeezes a buttcheek hard enough to make the cat$girl's assflesh bulge out between his fingers in the tight black skinny jeans $he's wearing. While you decide whether $he's worth enslaving, the punk cat makes some mouthy statement that earns $him a hard slap to $his other asscheek by the second officer. The embarassing bulge twitching at the front of $his pants as $his ass gets brutalized is the only real indication that this is a 'male' cat. + <br><br> + //It'd be absolutely trivial to enslave $him, really just a matter of filling out some paperwork and bureacracy costing <<print cashFormat(1500)>>. $He's pretty enough, albeit feisty, loud, and completely unbroken.// +<</if>> <<case "CCS angel">> As a minor point of information on your daily news download, you see that yet another of the new religions (cults really) that tend to spring up like weeds in the Free Cities has met its almost inevitable fate. Even with the most charismatic leader, starry-eyed idealism or boundless greed in milking the followers usually put a sudden end to the various self-declared churches, temples and holy places. In this case, the cult leader successfully made a hasty getaway, leaving his creditors and conned believers behind. Repo men are sent out in force, carting off the contents of the 'house of worship' and the luxurious apartment the man kept. <br><br> @@ -2076,7 +2159,7 @@ <<set _ContractCost = 4000>> <<case "MTF SE">> <<set _ContractCost = 2000>> -<<case "DG SE" "farm virgin cow" "orphan femboy" "orphan rebellious female">> +<<case "DG SE" "farm virgin cow" "orphan femboy" "orphan rebellious female" "punk femcat" "punk sissycat">> <<set _ContractCost = 1500>> <<case "CCS angel" "racer DG chaser" "racer loser" "held POW" "blessed vessel">> <<set _ContractCost = 5000>> @@ -2084,6 +2167,8 @@ <<set _ContractCost = 7500>> <<case "blessed virgin" "captured teen" "embryo appropriation" "paternalist swan song" "racer winner">> <<set _ContractCost = 10000>> +<<case "runaway cat">> + <<set _ContractCost = 20000>> <<case "forbidden love" "princely betrayal" "rogue cyborg">> <<set _ContractCost = 100000>> <<case "farm bull" "farm cow" "repo housekeeper" "repo nanny" "school sale" "school trap">> @@ -2118,6 +2203,10 @@ $He sobs as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. $He tries to resist placing $his biometric signature in testament to the truth of $his debt, but when you observe that the alternative is the death of $him and $his unborn, $he complies. The process is completed with a distinct anticlimax: $he is one of your slaves now, and soon so shall $his spawn. <<case "rogue cyborg">> With your order received the target quickly seeks you out. After a huge sum of credits changes hands to render it penthouse safe, the legalities and biometric scanning are complete and you are now the proud owner of a cyber<<= $loli>>. + <<if $seeCats == 1>> + <<case "runaway cat">> + You agree to the other plutocrat's offer and after a quick transfer of credits between your private lines, he casually congratulates you on your new slave, makes a joke about sloppy seconds, and hangs up. You call down for a guard outside to bring the skittish new cat$girl up to your office so you can get your fresh new slave better introduced into your harem. + <</if>> <<case "female recruit">> You complete the legalities and biometric scanning quickly and without fuss. _slave.slaveName bounces nervously on $his heels. Finally $he works up $his courage and asks, <<if _S.HeadGirl.clothes != "no clothing">>"Can I have _S.HeadGirl.clothes like _S.HeadGirl.slaveName?"<<else>>"Can I work with _S.HeadGirl.slaveName?"<</if>> Your sternly tell $him to call you <<= properMaster()>>, to ask questions only with permission, and to strip. $He looks at _S.HeadGirl.slaveName, but _S.HeadGirl.slaveName returns $his look with no compassion at all and tells $him to do what you say. Looking suddenly fearful, _slave.slaveName strips. Once your inspection of $his body reaches $his anus, $he becomes suddenly nervous. "A-am I going to have t-to do butt <<s>>tuff, <<Master>>?" <<case "male recruit">> @@ -2168,6 +2257,12 @@ Contacting the wealthy resident, you apologize for his inconvenience and offer to 'deal with' the matter personally. He is content with not having the hassle and agrees with little thought, leaving you owning the debt of the unfortunate student. Making your way to the guard station where $he is being kept, you tell the young man $he's getting out of jail right away. $He cooperates with having $his biometric readings taken and logged, only later realizing this isn't for a release, but to register $him as a slave. In shock and with tears in $his eyes, $he gets angry and tries to fight, only to be overwhelmed by your guards and dragged off to the slave quarters. <<case "female SE">> Bidding for the $girl and winning $him in the auction, you await $him and the student selling $him in your penthouse. As the young man guides $him in, $he gives you a properly deferential greeting, then looks wide-eyed at the décor and wealth presented all around. Yet as $his 'lover' informs the $woman that $he'll belong to you now, tears start flowing down $his cheeks as $his heart almost audibly breaks. Smiling at the man over the sobbing shape of your newly acquired virgin slave<<= $girl>>, you casually push a button to approve the money transfer and he strides out of the room after checking his smart-phone for the transfer. On your orders, $he strips and submits to biometric scanning, registering $him as your property. + <<if $seeCats == 1>> + <<case "punk femcat">> + You quickly fill out the paperwork to transfer the low-status cat$girl's legal ownership to yourself, before anyone else can notice how easy it'd be to snatch the unfortunate cat$girl up for themselves. Making your way to the local guard station where $he is being kept, you tell the young $woman you're taking $him out of jail. Obviously not buying it, $he glowers at you as you take $his readings and calls you a "monkey fucker", blabbering on something about systemic cat oppression and plutocracy before you have the mouthy cat gagged. Sinking $his fangs into the ballgag you've had one of the officers shove into $his mouth and tightly cuffed, you tell the guards to keep $him tightly bound up until the slave trader you've sold $him too arrives. One of them smiles and says it'll be a pleasure, glancing over at the bound-up catslave. + <<case "punk sissycat">> + You quickly fill out the paperwork to transfer the low-status cat$girl's legal ownership to yourself, before anyone else can notice how easy it'd be to snatch the unfortunate cat$girl up for themselves. Making your way to the local guard station where $he is being kept, you tell the young $woman you're taking $him out of jail. Obviously not buying it, $he glowers at you as you take $his readings and calls you a "monkey fucker", blabbering on something about systemic cat oppression and plutocracy before you have the mouthy cat gagged. Sinking $his fangs into the ballgag you've had one of the officers shove into $his mouth and tightly cuffed, you tell the guards to keep $him tightly bound up until the slave trader you've sold $him too arrives. One of them smiles and says it'll be a pleasure, glancing over at the bound-up catslave. + <</if>> <<case "MTF SE">> Sending an offer to buy the slave $girl, you get a confirmation from the student very shortly afterward. It doesn't take much longer before he appears at the security office leading into your penthouse to drop off his slave, leaving $him behind without even saying goodbye. The sniffling and dejected $girl is brought into your office so you can check $him out in person afterward. On your orders, $he strips and submits to biometric scanning, registering $him as your property. <<case "DG SE">> @@ -2293,6 +2388,10 @@ $He sobs as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. $He tries to resist placing $his biometric signature in testament to the truth of $his debt, but when you observe that the alternative is the death of $him and $his unborn, $he complies. A purchasing agent appears to take $him away, but not after the slave breeder that bought $him paid a ludicrous amount of ¤ per child. An additional @@.yellowgreen;<<print cashFormat(_profit)>>@@ overall. <<case "rogue cyborg">> With your order received the target quickly seeks you out. After a huge sum of credits changes hands to render it safe, the legalities and biometric scanning are complete and it is sold off to a very eager robophile. + <<if $seeCats == 1>> + <<case "runaway cat">> + You shrug to yourself and tell the other oligarch you'll send $him back over. The rival plutocrat tells you that he'll send you offer a little 'gift' to show his appreciation as you hang up and order some of the arcology guards to take the nervous cat$girl outside away. A few days later, the abusive oligarch makes good on his promise and you find a generous sum of money, about the estimate worth of the cat$girl, deposited into your account. Easiest money you've ever made. + <</if>> <<case "female recruit">> You complete the legalities and biometric scanning quickly and without fuss. _slave.slaveName bounces nervously on $his heels. Finally $he works up $his courage and asks, <<if _S.HeadGirl.clothes != "no clothing">>"Can I have _S.HeadGirl.clothes like _S.HeadGirl.slaveName?"<<else>>"Can I work with _S.HeadGirl.slaveName?"<</if>> Your answer appears in the form of a purchasing agent, here to take $him away. As he restrains the disbelieving $girl, you tell $him $he's been purchased by a brothel, so $he's going to be fucked about 70,000 times before $he gets to be too old and is retired, so $he can be sure $he won't be bored. $He releases a wail of utter despair, quickly cut off by a sturdy bag being fastened over $his head. <<case "male recruit">> @@ -2323,6 +2422,12 @@ Contacting the wealthy resident, you apologize for his inconvenience and offer to 'deal with' the matter personally. He is content with not having the hassle and agrees with little thought, leaving you owning the debt of the unfortunate student. Making your way to the guard station where $he is being kept, you tell the young $woman $he's getting out of jail right away. $He cooperates to having $his biometric readings taken and logged, only later realizing this isn't for $his release but to register $him as a slave. In shock and with tears in $his eyes, $he dejectedly follows the guard you summon to have $him brought to the slave broker you sold $him to. <<case "female SD 2">> Contacting the wealthy resident, you apologize for his inconvenience and offer to 'deal with' the matter personally. He is content with not having the hassle and agrees with little thought, leaving you owning the debt of the unfortunate student. Making your way to the guard station where $he is being kept, you tell the young $woman $he's getting out of jail right away. $He cooperates to having $his biometric readings taken and logged, only later realizing this isn't for $his release but to register $him as a slave. $He makes a poor decision to rebel against $his guard you summoned to have $him brought to the slave broker you sold $him to, earning $himself a taser shock and a degrading cart ride with $his ass bare for all to see. + <<if $seeCats == 1>> + <<case "punk femcat">> + You quickly fill out the paperwork to transfer the low-status cat$girl's legal ownership to yourself, before anyone else can notice how easy it'd be to snatch the unfortunate cat$girl up for themselves. Making your way to the local guard station where $he is being kept, you tell the young $woman you're taking $him out of jail. Obviously not buying it, $he glowers at you as you take $his readings and calls you a "monkey fucker", blabbering on something about systemic cat oppression and plutocracy before you have the mouthy cat gagged. Sinking $his fangs into the ballgag you've had one of the officers shove into $his mouth and tightly cuffed, you tell the guards to keep $him tightly bound up until the slave trader you've sold $him to arrives. One of them smiles and says it'll be a pleasure, glancing over at the bound-up catslave. + <<case "punk sissycat">> + You quickly fill out the paperwork to transfer the low-status cat$girl's legal ownership to yourself, before anyone else can notice how easy it'd be to snatch the unfortunate cat$girl up for themselves. Making your way to the local guard station where $he is being kept, you tell the young $woman you're taking $him out of jail. Obviously not buying it, $he glowers at you as you take $his readings and calls you a "monkey fucker", blabbering on something about systemic cat oppression and plutocracy before you have the mouthy cat gagged. Sinking $his fangs into the ballgag you've had one of the officers shove into $his mouth and tightly cuffed, you tell the guards to keep $him tightly bound up until the slave trader you've sold $him to arrives. One of them smiles and says it'll be a pleasure, glancing over at the bound-up catslave. + <</if>> <<case "male SD">> Contacting the wealthy resident, you apologize for his inconvenience and offer to 'deal with' the matter personally. He is content with not having the hassle and agrees with little thought, leaving you owning the debt of the unfortunate student. Making your way to the guard station where he is being kept, you tell the young man $he's getting out of jail right away. $He cooperates with having $his biometric readings taken and logged, only later realizing this isn't for a release, but to register $him as a slave. In shock and with tears in $his eyes, $he gets angry and tries to fight, only to be overwhelmed by your guards and dragged off to the remote surgery. It doesn't take long at all before the student is transported to the office of the slave broker you sold $him to. <<case "gang leader">> diff --git a/src/uncategorized/scheduledEvent.tw b/src/uncategorized/scheduledEvent.tw index 04c46b7e7d9ff18511a9253f6eda1fb2e0599526..924cda0a8c8485f224aff11b2f87800ff31b6671 100644 --- a/src/uncategorized/scheduledEvent.tw +++ b/src/uncategorized/scheduledEvent.tw @@ -24,6 +24,17 @@ <<if $TFS.schoolUpgrade == 3 && $TFS.compromiseWeek == $week-1>> <<set $fcnn.push("...Ladies: Do you want dick so much that you want to HAVE a dick? If yes, join the Futanari Sisters today! Learn more at...")>> <</if>> +<<if $seeCats == 1>> +<<if $projectN.public == 1>> + <<set $fcnn.push("...Catgirl slaves: Fad, fluke, or fashion? Tune in for an exclusive FCNN interview with Doctor Radomir Nieskowitz later tonight...")>> +<</if>> +<<if $projectN.status > 4>> + <<set $fcnn.push("...Sons of Sekhmet claim responsability for bombing campaign in...")>> + <<set $fcnn.push("...was killed this week in a surprise ambush by Sons of Sekhmet assassins...")>> + <<set $fcnn.push("...terrorist organizations in the Free Cities: An exclusive report, coming up next...")>> + <<set $fcnn.push("...large scale rioting continues for the ninety-sixth consecutive day over genetic engineering concerns...")>> +<</if>> +<</if>> <<if $week == 30>> <<set $fcnn.push("...is where I'll be when the bombs hit. Survival is my first...")>> <<set $fcnn.push("...time to prepare for major shortages is now, since there's no likelihood...")>>